mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMega32 Timer1


Autor: Karsten Sosna (scottyrebel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich versuche schon seit einigen Stunden einen ATMega ind PWM-Modus 14 zu 
versetzen, aber das haut irgendwie nicht hin. 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 Capture

Reset:

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

Timer1_Init:
    ;Mode 14, no prescaling
    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

    LDI Temp, 0x20
    OUT OCR1AL, Temp
    LDI Temp, 0x40
    OUT OCR1BL, Temp
    LDI Temp, 0x60
    OUT ICR1L, Temp

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

    SEI ;Enable Interupts

MainLoop:
RJMP MainLoop

TIMER1_Capt:
RETI

TIMER1_CompA:
RETI

TIMER1_CompB:
RETI

TIMER1_Overflow:
RETI
///

1.) Problem: Sobald die MainLoop erreicht wird, wird der Interrupt 
OC1Aaddr gefeuert. Der Timer-Counter steht aber erst bei 0x000E.

2.) Problem: Wenn ich die Dokumentation zum ATMega32 richtig gelesen 
habe, sollte beim Erreichen des Wertes in ICR1 der Timer zurückgestetzt 
werden und der Overflow-Interrupt gefeuert werden. Beides tritt nicht 
ein.

Die Register habe ich jetzt schon mehrfach überprüft und dort scheint 
alles so zu sein, wie es im Datenblatt steht.

Danke für jeden Tipp.
--
Gruß Scotty

Autor: Karsten Sosna (scottyrebel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karsten Sosna schrieb:
> 1.) Problem: Sobald die MainLoop erreicht wird, wird der Interrupt
>
> OC1Aaddr gefeuert. Der Timer-Counter steht aber erst bei 0x000E.

Das Problem ist gelöst. Man muss erst die Register laden und dann die 
Flags setzen.
Jedoch steht die Lösung für das zweite Problem noch aus, verzweifele 
noch.
--
Gruß Scotty

Autor: Winfried J. (Firma: Nisch-Aufzüge) (winne)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
interrupt enable flag für timer gesetzt ?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Falls du das im Simulator testest: PWM-Modes ohne festen Top-Wert werden 
nur mangelhaft unterstützt.

MfG Spess

Autor: Karsten Sosna (scottyrebel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Winfried J. schrieb:
> interrupt enable flag für timer gesetzt ?

Hallo Winfried,
nein, ist es nicht.
--
Gruß Scotty

Autor: Karsten Sosna (scottyrebel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Falls du das im Simulator testest: PWM-Modes ohne festen Top-Wert werden
>
> nur mangelhaft unterstützt

Hallo Spess,
ja ich teste das im Simulator. Was bedeutet festen Top-Wert? Meinst Du 
die Modes 0, 1, 2, 3, 5, 6, 7?

Das wäre ärgerlich, weil ich die Register während des Laufs ändern muss.
--
Gruß Scotty

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Meinst Du die Modes 0, 1, 2, 3, 5, 6, 7?

Ja.

>Das wäre ärgerlich, weil ich die Register während des Laufs ändern muss.

Dann teste es doch mal im Controller. Leds an die Pins, Vorteiler auf 
1024 und die anderen Werte auch entsprechend höher gesetzt. Dann kannst 
du das visuell probieren.

Bei mir funktioniert allerdings im Simulator (ATMega48) der 
Overflow-Interrupt vom Timer1 im Mode 14.

MfG Spess

Autor: Karsten Sosna (scottyrebel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Falls du das im Simulator testest: PWM-Modes ohne festen Top-Wert werden
>> nur mangelhaft unterstützt
>
> ja ich teste das im Simulator. Was bedeutet festen Top-Wert? Meinst Du
> die Modes 0, 1, 2, 3, 5, 6, 7?
> Das wäre ärgerlich, weil ich die Register während des Laufs ändern muss.

Ok, habe gerade mal die Testanwendung geladen(etwas geändert, damit ich 
auch was sehen kann), dann mit dem Oszilloskop gemessen. Scheint zu 
funktionieren, sprich der Overflow-Interrupt wird gefeuert. Jetzt muss 
ich mal die Zeiten anpassen, verzerrt ja doch alles etwas, ist aber 
nicht weiter tragisch.
Aber trotzdem Danke, ich habe mir hier schon "einen Wolf gesucht". ;=)
--
Gruß Scotty

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.