Re: PWM - verschiedene Probleme Kategorie: Progr. Assembler, TaskingTools, OS (von André H. - 19.11.2004 12:38) | ||
Als Antwort auf Re: PWM - verschiedene Probleme von Harald - 12.11.2004 11:45 | ||
| ||
Hallo Harald, Warum führst Du am Anfang der Routine "main" zweimal pop aus ?? Denn dieses zweimalige pop definiert so gesehen schon den C2-Rücksprung. Deshalb mu� dies immer unmittelbar vor dem RETS bzw. in C direkt am Ende der Funktion stehen ! Au�erdem kannst Du hier nicht einfach in C definieren, da� irgendeine Routine bei einem Interrupt ausfegührt wird ! Dazu mu�st Du die Interrupt-Vektoren im OS anpassen. Und diese lauten von CAPCOM16 bis 26 so: 0xc0: JMPS 0xc0 0xc4: JMPS 0xc4 0xc8: JMPS 0xc8 0xcc: JMPS 0x1e5e CAPCOM Register 19 (FRQ0/DCF77) 0xd0: JMPS 0xd0 0xd4: JMPS 0xd4 0xd8: JMPS 0xd8 0xdc: JMPS 0xdc 0xe0: JMPS 0xe0 0xe4: JMPS 0xe4 0xe8: JMPS 0x9dbc CAPCOM Register 26 Du siehst, nicht definierte Routinen enden in einer Endlosschleife. MfG André H. > Hallo, > > hier noch der C-Quellcode: > > C-Code--------------------------- > > /* impuls.c */ > > #include > > //Hier die Interruptroutine. Wenn sie nicht auskommentiert ist, geht dar nichts mehr > > /*_interrupt (0xF4) void > timer_stop (void) > { > CC16 = 0x0FFF; > CC17 = 0x0FFF; > }*/ > > void main() > { > #pragma asm > > pop R1 > pop R2 > > #pragma endasm > > int i = 0xFFFF; > /* Timerregister Initialisieren */ > /* Reload-Register auf 0 setzen */ > T7REL = 0x0; > /* Steuerungsregister für die CapCom-Timer einstellen */ > T78CON = 0x3; > //T7M = 0; Timer 7: Timerbetrieb > //T7I = 0x3; Prescaler für Takt: T=210ms, dTmin=3,2us > > /* Interruptsteuerung für Timer 7 */ > > T7IC = 0x7F; > /* T7IE: IRQ enable */ > /* ILVL = 0xF; Interruptpriorität max. */ > /* GLVL = 0x3; Gruppenpriorität max. */ > > /* Steuerungsregister für die Vergleichsregister einstellen */ > CCM4 = 0x77; > /*ACC16 = 0; Compare-Register CC16 zu Timer 7 zuordnen > ACC17 = 0; Compare-Register CC17 zu Timer 7 zuordnen > CCMOD16 = 0x7; Set output on each match für CC16 > CCMOD17 = 0x7; Set output on each match für CC17 */ > > /* Werte in Vergleichsregister schreiben */ > CC16 = 0x8000; /* Compare-Register 16: 50% */ > CC17 = 0x8000; /* Compare-Register 17: 50% */ > T7R = 1; /* Timer 7: Start */ > > i = 0x8000; > //while(T7IR != 1) > while(i > 0) > { > i = i - 1; > CC16 = i; > CC17 = i; > } > T7R = 0; > } > > > C-Code-Ende------------------ > > Problem 1: CC16 bzw. CC17 lassen sich nicht dekrementieren. > Problem 2: Wenn der Programmteile für die Dekrementierung der Vergleichsregister herausgenommen > wird und stattdessen die Interruptroutine aktiviert wird, dann rührt sich gar nichts mehr. > > Was mache ich da falsch? > > Gru�, > Harald Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: |