$NOMOD51 ;der Modus fuer 8051 wird abgeschaltet $debug $nolist ;es wird kein Listing fuer reg535 erstellt $include(C8051F340.inc) ;die C8051F340-spezifischen Daten $list ;es wird ein Listing erstellt $title (SERVO_LR.A51) ;------------------------------------------------------------------------ ;Programmbeschreibung ;------------------------------------------------------------------------ ;Programm: ;Hardware: CEX0 an P1.1 ;Servomotor - Blaue Anzeige Standard Servo PWM über PCA0CPL+Hx ;Mittenstellung: ca. 0EF37H ;0° wird ermittelt ;180° wird ermittelt ;T2 - Die Pulsweite wird verkleinert Compare wird erhoeht ;T3 - Die Pulsweite wird vergroessert Compare wird erniedrigt ;Interrupt bei n-Überläufen - PCA0_INT mit Veraenderung der Pulsweite um C_ADD ;Periodendauer: CLK=3 MHz --> 21,84ms --> 45,7 Hz ;Zaehlregister fuer Anzahl Interrupts --> R2 ; ;Erstellt am: Samstag, 2. Mai 2009 16:48:17 ;Programmiert: J. Walter ; ;Verwendete Einspruenge: keine ; ;Verwendete Unterprogramme: keine ; ; ;Verwendete Register und Variable: ;Registerbank(0) ;R2 ; ;Kommentar: ; ;Aenderungen: ;Geaendert am: 2. Juni 2008 ;Anpassung und Dokumentation des cwg-Files ; ;------------------------------------------------------------------------ ;Initialisierungsteil fuer allgemeine Konstanten ;------------------------------------------------------------------------ C_ADD EQU 3 ;Addition der Schrittweite Comparewert PCA0_INT EQU 1 CSEG AT 0H ;Legt absolute Codesegmentadresse auf 0h jmp INIT ; ;------------------------------------------------------------------------ ;Interrupt-Vektoren ;------------------------------------------------------------------------ ;ORG ORG 05Bh ;Interrupt Vector PCA clr CF ;Interrupt bestaetigt call ISR_PCA0 ; RETI ;------------------------------------------------------------------------ ;Initialisierungsteil fuer On-Chip Peripherie ;------------------------------------------------------------------------ ORG 100H ;Programmstart bei 100H INIT: call Init_Device ;Aufruf zur Initialisierung der Controller Funktionen mov R2,#PCA0_INT ;Interrupt Zaehlregister ;------------------------------------------------------------------------ ;Programmschleife ;------------------------------------------------------------------------ ABFRAGE: jmp Abfrage ISR_PCA0: djnz R2,ISR_PCA_ENDE ;Sind bereits n Interrupts aufgetreten? mov R2,#PCA0_INT ;Wiederladen des Zaehlregisters jb P1.2,C_AB ;Abfrage AUF? mov A,PCA0CPL0 ;Compare 0 Low Byte in Akku clr C ;Carry loeschen add A,#C_ADD mov PCA0CPL0,A ;Low Byte wieder zurueckschreiben mov A,PCA0CPH0 ;High Byte Compare holen jnc KEINUEBERTRAG_1 inc A KEINUEBERTRAG_1: mov PCA0CPH0,A ;High Byte Compare schreiben C_AB: jb P1.3,ISR_PCA_ENDE ;T3 betaetigt? mov A,PCA0CPL0 ;Compare 0 Low Byte in Akku clr C ;Carry loeschen subb A,#C_ADD mov PCA0CPL0,A ;Wieder zurueckschreiben mov A,PCA0CPH0 ;High Byte Compare holen jnc KEINUEBERTRAG_2 dec A KEINUEBERTRAG_2: mov PCA0CPH0,A ;High Byte Compare schreiben ISR_PCA_ENDE: ret ;------------------------------------------------------------------------ ; Peripheral specific initialization functions, ; Called from the Init_Device label ;------------------------------------------------------------------------ PCA_Init: mov PCA0CN, #040h anl PCA0MD, #0BFh mov PCA0MD, #009h ; 09h = PCA-TIMEBASE = SYSCLK (03h = SYSCLK/4) mov PCA0CPM0, #0C3h mov PCA0CPL0, #037h mov PCA0CPH0, #0EFh ret Port_IO_Init: ; P0.0 - Skipped, Open-Drain, Digital ; P0.1 - Skipped, Open-Drain, Digital ; P0.2 - Skipped, Open-Drain, Digital ; P0.3 - Skipped, Open-Drain, Digital ; P0.4 - Skipped, Open-Drain, Digital ; P0.5 - Skipped, Open-Drain, Digital ; P0.6 - Skipped, Open-Drain, Digital ; P0.7 - Skipped, Open-Drain, Digital ; P1.0 - Skipped, Open-Drain, Digital ; P1.1 - CEX0 (PCA), Push-Pull, Digital ; P1.2 - Skipped, Push-Pull, Digital ; P1.3 - Skipped, Push-Pull, Digital ; P1.4 - Unassigned, Open-Drain, Digital ; P1.5 - Unassigned, Open-Drain, Digital ; P1.6 - Unassigned, Open-Drain, Digital ; P1.7 - Unassigned, Open-Drain, Digital ; P2.0 - Unassigned, Open-Drain, Digital ; P2.1 - Unassigned, Open-Drain, Digital ; P2.2 - Unassigned, Open-Drain, Digital ; P2.3 - Unassigned, Open-Drain, Digital ; P2.4 - Unassigned, Open-Drain, Digital ; P2.5 - Unassigned, Open-Drain, Digital ; P2.6 - Unassigned, Open-Drain, Digital ; P2.7 - Unassigned, Open-Drain, Digital ; P3.0 - Unassigned, Open-Drain, Digital ; P3.1 - Unassigned, Open-Drain, Digital ; P3.2 - Skipped, Push-Pull, Digital ; P3.3 - Skipped, Push-Pull, Digital ; P3.4 - Skipped, Push-Pull, Digital ; P3.5 - Unassigned, Open-Drain, Digital ; P3.6 - Unassigned, Open-Drain, Digital ; P3.7 - Unassigned, Open-Drain, Digital mov P1MDOUT, #00Eh mov P3MDOUT, #01Ch mov P0SKIP, #0FFh mov P1SKIP, #00Dh mov P3SKIP, #01Ch mov XBR1, #041h ret Oscillator_Init: ;mov FLSCL, #090h ;Benutze Clock Multiplier as SYSCLK mov CLKMUL, #080h clr A ; Wait 5us for initialization djnz ACC, $ orl CLKMUL, #0C0h Osc_Mul_Wait: mov A, CLKMUL jnb ACC.5, Osc_Mul_Wait ;mov CLKSEL, #003h mov OSCICN, #081h ret Interrupts_Init: mov EIE1, #010h mov IE, #080h ret ; Initialization function for device, ; Call Init_Device from your main program Init_Device: lcall PCA_Init lcall Port_IO_Init lcall Oscillator_Init lcall Interrupts_Init ret end