Forum: Mikrocontroller und Digitale Elektronik Bei FastPwm in den Timer1 Overflow


von Stefan V. (Gast)


Lesenswert?

Guten Tag.

Probiere jetzt schon einige Zeit, mit dem Mega 8 mit P
FastPWM Mode 14, das er bei Top, also bei ICR1 in den TimerOverflow 
springt, damit ich da Register verändern kann.  Ist das überhaupt 
möglich?

Programmiere in Assembler mit dem AVRStudio.

Da das AVRStudio ja den Mode 14 nicht korrekt anzeigt, (Zeigt ja 10 Bit 
PWM an) kann man das irgendwie garnicht testen, ob es funktioniert.

Kann mir da jemand weiterhelfen?

Dankeschön:-)

von Yaroslav (Gast)


Lesenswert?

Hallo Stefan,

der overflow-Interrupt wird nur ausgelöst, wenn der Timer überläuft 
(überlaufen heißt, dass der maximal mögliche Wert erreicht wird). In 
deinem Fall passiert das nicht, weil der maximale Wert nicht erreicht 
wirrd, denn der Timer läuft nur bis zum Wert in ICR1.
Der interrupt, den du hier aber beim "pseudo-überlaufen" benzutzen 
kannst ist der Input-capture intterupt, der in deinem Fall ausgelöst 
wird, wenn der Timer-Wert vom Wert in ICR1 zum Wert 0x0000 wechselt.

Gruß, Yaro

von Stefan V. (Gast)


Lesenswert?

Also setze ich einfa TICIE1 auf 1 und dann springt er bei bottom auf 
Timer1 Capt?

Passt das so?

Das Studio zeigt das ja leider nicht richtig an.

von Christopher G. (cbg)


Lesenswert?

Yaroslav schrieb:
> der overflow-Interrupt wird nur ausgelöst, wenn der Timer überläuft
> (überlaufen heißt, dass der maximal mögliche Wert erreicht wird). In
> deinem Fall passiert das nicht, weil der maximale Wert nicht erreicht
> wirrd, denn der Timer läuft nur bis zum Wert in ICR1.

Falsch!
Manual (FastPWM Timer1):
"The Timer/Counter Overflow Flag (TOV1) is set each time the counter 
reaches TOP. In addition the OCF1A or ICF1 Flag is set at the same 
timer clock cycle as TOV1 is set when either OCR1A or ICR1 is used for 
defining the TOP value. If one of the interrupts are enabled, the 
interrupt handler routine can be used for updating the TOP and compare 
values."

Wenn AVR Studio den 14er Mode nicht korrekt anzeigt, dann wird da auch 
der Fehler liegen.

von Stefan V. (Gast)


Lesenswert?

Also ich das Programm jetzt so:

.include"m8def.inc"

.def  temp1  =  r16
.def  temp2  =  r17


.equ  timer  =  20000
.equ  servo  =  1500

rjmp  init
timer1_ovf:  reti



init:
    ldi    temp1,  low(ramend)
    out    spl,  temp1

    ldi    temp1,  high(ramend)
    out    sph,  temp1


    ldi     temp1,   1<<com1a1 | 1<<wgm11
      out     tccr1a, temp1

      ldi     temp1,   1<<wgm13 | 1<<wgm12 | 1<<cs10
      out     tccr1b, temp1

    ldi     temp1,   high(timer)
      out     icr1h,   temp1
      ldi     temp1,   low(timer)
      out     icr1l,   temp1

    ldi     temp1,   high(servo)
      out     ocr1ah, temp1
      ldi     temp1,   low(servo)
      out     ocr1al, temp1

    ldi     temp1,   0x02
      out     ddrb,   temp1

    ldi    temp1,  0b00100100
    out    timsk,  temp1
    sei


main:
    rjmp  main



funktioniert aber leider nicht

von Christopher G. (cbg)


Lesenswert?

Hab schon länger nichts mehr mit Assembler gemacht aber
1) Sicher dass die ISR Vektor Tabelle stimmt? Habe da ein *2 in 
Erinnerung wegen der Speichereinteilung bei AVRs.
2) Du aktivierst den Timer 1 Input Capture und hast keine ISR dazu. 
(warum schreibst du beim TIMSK nicht mehr übersichtlich mit shiften?)
3) Sicher, dass TCCR1A, usw nicht groß geschrieben gehört? Habe damals 
einen anderen anderen compiler verwendet, da waren die defines wie 
üblich alle groß geschrieben.
4) Definiere funktionniert nicht.

von Stefan V. (Gast)


Lesenswert?

Danke für die
Infos. Aber kann
man jetzt irgendeinen Fehler entdecken?

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.