Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

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
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT V3.0
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: