Forum: Mikrocontroller und Digitale Elektronik AVR: 2 Timer Gleichzeitig verwenden (assembler)


von Andy (Gast)


Lesenswert?

Hallo,
ich habe das Problem, dass ich zwei Timer in einem Programm auf einem 
Atmega8 starten will (Timer0 und Timer1), dies auch gelingt, wenn ich 
sie einzeln starte, nicht jedoch wenn ich ich beide zusammen starte.

Es folgt ein Ausschnitt aus Meinem Programm:

...
    .ORG   OVF1addr    ;Timerinterrupt Timer1
     rjmp   timer
    .ORG   OVF0addr    ;Timerinterrupt Timer0
     rjmp   timera
    .ORG   $2A
start:           ldi   akku, LOW(RAMEND)     ;Stapelzeiger laden
     out   SPL, akku
     ldi   akku, HIGH(RAMEND)
     out   SPH, akku

     ldi   akku,0b101    ;Systemtaktteiler : 1024
     out  TCCR0, akku

     in  akku, TIMSK
     ori  akku, 1 << TOIE0
     out  TIMSK, akku

     ldi   akku, 256 - 255
     out   TCNT0, akku


     lds   akku, low(65536)
     out   TCNT1l, akku
     lds   akku, high(65536)
     out  TCNT1h, akku

     ldi   akku,0b011    ;Systemtaktteiler 64
     out    TCCR1B, akku

     in    akku, TIMSK
     ori    akku, (1 << TOIE1)
     out    TIMSK, akku

...

Ich habe schon eineige Zeit damit verbracht selbst auf meinen Fehler zu 
kommen - hab auch schon etwas hier im Forum geschaut - bin jedoch nicht 
sonderlich erfolgreich gewesen, deshalb würde ich mich über eure Hilfe 
freuen...

Andy

von norad (Gast)


Lesenswert?

@Andy

ich kann dir zwar nicht helfen aber mich würde Interessieren
waru Du bei der Zeile
ldi   akku, 256 - 255
nicht gleich ne 1 einträgst!


Ich beginne erst mit AVR und muss mich noch einarbeiten, da ich 8051er 
gewöhnt bin und bitte um Nachsicht.


von Hannes L. (hannes)


Lesenswert?

>

     lds   akku, low(65536)
     out   TCNT1l, akku
     lds   akku, high(65536)
     out  TCNT1h, akku

<

Meinst Du "ldi" oder willst Du die Daten aus einer SRAM-Zelle holen, die 
es nicht gibt???

...

von Andy (Gast)


Lesenswert?

oho - das mit dem "lds" habe ich total übersehen - soll natürlich ldi 
heißen - da war mal eine SRAM Variable drin, allerdings dürfte hier 
nicht mein eigentliche Problem entstehen.
wegen der Frage von norad: natürlich könnte da auch 1 stehen, ich hatte 
da nur verschiedene Werte getestet und so ist das dann aus 
bequemlichkeit entstanden :)

von Hannes L. (hannes)


Lesenswert?

Interrupt global freigeschaltet? (sei)

...

von Andy (Gast)


Lesenswert?

Auch global freigeschaltet! - Wie gesagt einzeln funktionieren die 
Timer!

Nochmal allgemein: ist es überhaupt möglich so ohneweiteres zwei Timer 
gleichzeitig laufen zu lassen?

Und wenn (wie es ja scheint), muss noch etwas besonderes Beachtet 
werden?

schon jetzt danke für mitdenken!

von Karl H. (kbuchegg)


Lesenswert?

Andy wrote:
> Nochmal allgemein: ist es überhaupt möglich so ohneweiteres zwei Timer
> gleichzeitig laufen zu lassen?

Ja klar. Ich wüsste nichts was dagagen spricht.

>
> Und wenn (wie es ja scheint), muss noch etwas besonderes Beachtet
> werden?

Zermartere mir schon die ganze Zeit das Hirn. Aber
mit fällt nichts ein.

Könntest du mal ein komplettes, vollständiges Pgm
hier reinstellen.

von Hannes L. (hannes)


Lesenswert?

Andy wrote:
> Nochmal allgemein: ist es überhaupt möglich so ohneweiteres zwei Timer
> gleichzeitig laufen zu lassen?

Ja sicher doch, sonst würde Vieles ja nicht laufen, z.B.:
http://www.hanneslux.de/avr/zuenduhr/index.html
http://www.hanneslux.de/avr/zuenduhr/ZndUhr01.asm

...

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Nebenbei bemerkt, müssen bei 16-Bit Registern erst die High-Register, 
dann die Low-Register geschrieben werden. Deine Timer-Init ist recht 
konfus (durcheinander), mach´s doch mal so, wie die Codebeispiele im 
Datenblatt zeigen. Also beginnen mit TCCRxA über TCCRxB und TCCRxC 
(falls vorhanden) und nach allen Registerzuweisungen erst dann die 
Interruptfreigabebits setzen. Das "sei" erst nach allen 
Initialisierungen aller benutzten Peripherie ausführen. Ach und eine 
komplette Interrupt-Vektorentabelle sollte Pflicht sein. Nichtbenutzte 
Interruptvektoren werden dann auf Reset oder auf eine Abhandlungsroutine 
zur Fehlerdiagnose geschickt.

von Hannes L. (hannes)


Lesenswert?

> Ach und eine
> komplette Interrupt-Vektorentabelle sollte Pflicht sein.

Das ist auch meine Meinung. Da ich damit aber immer auf Widerspruch 
stoße, lasse ich es bleiben, darauf hinzuweisen.

> Deine Timer-Init ist recht
> konfus (durcheinander)

Das ist wohl wahr. Da kommt man schon beim Lesen durcheinander.

...

von senex24 (Gast)


Lesenswert?

Mit 'ldi' statt 'lds' (wie erwähnt) läuft der Timer1 bei 0 los, dann 
noch *64; ist das Absicht?

von Hannes L. (hannes)


Lesenswert?

senex24 wrote:
> Mit 'ldi' statt 'lds' (wie erwähnt) läuft der Timer1 bei 0 los, dann
> noch *64; ist das Absicht?

Glaub' nicht, dass das Absicht war, eher "zusammengefunden"...

Duck&wech...

...

von Werner B. (Gast)


Lesenswert?

Na ja, 65536 == 0x10000. Klar dass da bei einer 16 Bit Variablen nur 
noch 0 übrigbleibt.
Das 17te "Bit" trinkt ja der Programmierer ;-)

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.