Forum: Mikrocontroller und Digitale Elektronik Problem mit PWM


von Karsten S. (scottyrebel)


Lesenswert?

Hallo, ich habe immer noch ein Problem mit PWM, ich will es einfach 
verstehen, hier meine Testroutine:

\\\
.include "m32def.inc"           ;Binding Definitionsfile for 
Processortype

.def temp       = R16

;Interruptvector-Table
.org 0x00
    RJMP Reset                  ;Reset
.org ICP1addr
    RJMP    TIMER1_Capt         ;Interrupt Timer1 Capture
.org OC1Aaddr
    RJMP    TIMER1_CompA        ;Interrupt Timer1 Compare Match A
.org OC1Baddr
    RJMP    TIMER1_CompB        ;Interrupt Timer1 Compare Match B
.org OVF1addr
    RJMP    TIMER1_Overflow     ;Interrupt Timer1 Overflow

Reset:

    ;Stack
    LDI     temp, HIGH(RAMEND)
    OUT     SPH, temp
    LDI     temp, LOW(RAMEND)
    OUT     SPL, temp

    LDI     temp, 0xFF
    OUT     DDRC, temp

Timer1_Init:
    ;Mode 14, no prescaling
    LDI     temp, 0x20
    OUT     OCR1AL, temp

    LDI     temp, 0x40
    OUT     OCR1BL, temp

    LDI     temp, 0x60
    OUT     ICR1L, temp

    LDI     temp, 1<<WGM11 | 1<<COM1A0 | 1<<COM1A1 | 1<<COM1B0 | 
1<<COM1B1
    OUT     TCCR1A, temp
    LDI     temp, 1<<WGM13 | 1<<WGM12 | 1<<CS10
    OUT     TCCR1B, temp

    ;Enable Timer1 interrupts
    LDI     temp, 1<<TICIE1 |1<<TOV1| 1<<OCIE1A  | 1<<OCIE1B
    OUT     TIMSK, temp

    SEI                         ;Enable Interupts

MainLoop:

RJMP MainLoop

TIMER1_Capt:
    LDI     temp, 0x04
    Out     PORTC, temp
RETI

TIMER1_CompA:
    LDI     temp, 0x01
    Out     PORTC, temp
RETI

TIMER1_CompB:
    LDI     temp, 0x02
    Out     PORTC, temp

RETI

TIMER1_OverFlow:
    LDI     temp, 0x08
    Out     PORTC, temp
RETI
///

Erwartet hätte ich jetz das nach 32 Takten, der Timer1 Compare Match A 
Interrupt gefeuert wird, Nach weiteren 32 Takten der Timer1 Compare 
Match B Interrupt und letzendlich nach weiteren 32 Takten der Timer 
Capture Interrupt. Dabach sollte der Timer eigentlich zurückgesetzt 
werden aber das passiert nicht, da der Timer Overflow Interrupt auch 
gefeuert wird. Irgendwas haut da überhaupt nicht hin.
Hier vielleicht was ich erreichen will.

Alle 32 Takte soll ein Interrupt gefeuert werden. Ich brauche aber 3 
Interrupts, so das ich 3 mal hintereinander alle 32 Takte ein Interrupt 
bekomme, sprich nach 96 Takten der Vorgang von neuem beginnt. Was 
vielleicht noch anzumerken ist: Die 32 Takte sind jetzt nur als Beispiel 
gedacht. Später ist das Eintreten des 1. Interrupts variabel, der 
Zeitpunkt der beiden anderen Interrupts ist dann dementsprechend zu 
verschieben. Erstmal will ich aber überhaupt die drei Schaltpunkte 
haben.

Danke für jede Hilfe und ggf. Korrektur meiner Testanwendung.
--
Gruß Karsten

von spess53 (Gast)


Lesenswert?

Hi

>da der Timer Overflow Interrupt auch gefeuert wird.

Der Overflow-Interrupt wird beim erreichen des Top-Wertes ausgelöst. Und 
das ist beim Timermode 14 ICR1.

> Dabach sollte der Timer eigentlich zurückgesetzt werden aber das passiert
>nicht,...

Falls du den Simulator benutzt, da funktioniert das wirklich nicht. Es 
Werden nur PWM-Modi mit fester Top-Adresse unterstützt. Also 8-Bit,9-bit 
und 10-Bit.

MfG Spess

von Karsten S. (scottyrebel)


Lesenswert?

>>da der Timer Overflow Interrupt auch gefeuert wird.

> Der Overflow-Interrupt wird beim erreichen des Top-Wertes ausgelöst. Und
> das ist beim Timermode 14 ICR1.

Es war halt verwirrend, das der Overflow-Interrupt auch gefeuert wird. 
Habe Ihn jetzt disabled(brauche ich ja eignetlich auch nicht), war nur 
zu Testzwecken enabled um zu sehen was da kommt. Das mit dem Simulator 
hattest Du mir schon gepostet.

Also scheinen meine Einstellungen doch so weit zu stimmen, dann habe ich 
bestimmt noch einen Bug in meiner Anwendung, bestimmt wieder irgendwo 
ein Register falsch geladen.

Danke
--
Gruß Scotty

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.