www.mikrocontroller.net

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


Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: norad (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.


Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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???

...

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Interrupt global freigeschaltet? (sei)

...

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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

...

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: senex24 (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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...

...

Autor: Werner B. (Gast)
Datum:

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

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.