Timer 0 im Atmega8 pollen

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 25 11 2024  00:48:08      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte


Autor
Timer 0 im Atmega8 pollen
Suche nach: timer (2126)

    







BID = 676015

Martin Wagner

Schriftsteller

Beiträge: 768
Wohnort: Unterfranken
Zur Homepage von Martin Wagner
 

  


Hallo Leute,

Brauche für ein Programm einen Delay Timer. Das kann man jetzt natürlich mit einer Zählschleife machen (damit funktioniert mein Programm auch .
Ich wills aber etwas eleganter mit dem Timer 0 Baustein lösen.
Hab das auch schon geschrieben, nur ein Detail funktioniert nicht...



Code :


//initialization

ldi temp1, 00000001 ; select prescaler
out TCCR0, temp1


//run
ldi temp1, 0x00
out TCNT0, temp1 ; set timer to preselected value

bclr TOV0 ; clear overflow flag
wait: brbc TOV0, wait
nop



Der Timer 1 hat das Überlaufbit TOV0, das ich mit dem brbc Befehl anpollen will. Der Timer läuft auch schön auf das Bit über, nur springt er nicht aus der Wiederhohlung raus.
Jemand eine Idee warum oder wie man das sonst realisieren kann (ohne Interrupts!)

Das ganze Programm hab ich auch mal angehängt.

Danke schonmal...
Gruß Martin

BID = 676018

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach

 

  


Zitat :
Das ganze Programm hab ich auch mal angehängt.
Wenn das dein ganzes Programm ist, kann es nicht funktionieren.
Beim Aussprung aus der Warteschleife macht es noch einen NOP, dann saust es durch den ganzen undefinierten Programmspeicher bis es schliesslich bei 0 wieder mit der Initialisierung anfängt.

Du solltest auch als ersten Befehl einen Sprung über die Interruptvektoren hinweg machen und dann erst mit der Initialisierung beginnen. Unbenutzte Interruptvektoren mit RETI auffüllen.
Sonst kann es passieren, dass irgendeine zufällig aktivierte Interuptquelle dir das Programm abstürzen lässt.

BID = 676062

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Moin,


bclr TOV0
ergibt doch überhaupt keinen Sinn. bclr ist das Mnemonic zum löschen eines Bits im Statusregister.
Dein Befehl löscht also Bit 0 im Statusregister (da liegt das Carry-Flag drin), mehr nicht.


Zitat :

das Überlaufbit TOV0, das ich mit dem brbc Befehl anpollen will.

Auch dieser Befehl ist völlig fehl am Platze, denn er wertet das Carry-Flag im Status-Register (SREG) aus. Da TOV0 auf Bit0 gemappt ist, und du mit bclr TOV0 vorher das Carry-Flag gelöscht hast, ist völlig klar, dass dein Programm nicht das machst, was du willst.

Wenn du das Bit pollen willst, dann muss es ungefähr so aussehen (rn ist Platzhalter für ein konkretes Register):

label:
in rn, TIFR
sbrs rn, TOVO
rjmp label

Je nach IO-Adresse von TIFR kann man auch mal sbis anstelle von sbrs ausprobieren, dann ist kein temporäres Register (rn) nötig.
sbis kann aber nur bis zu einer bestimmten Adresse arbeiten (dann reicht der Platz nicht mehr aus, um die Adresse im Opcode zu speichern).
Außerdem löscht man Interruptflaggen bei den AVRs i.d.R., indem man das korrespondierende Bit setzt, also auf '1' schreibt; auszug aus dem Datenblatt des ATMega8s:

Zitat :

Alternatively,
TOV0 is cleared by writing a logic one to the flag.


Eleganter wäre es aber, den Timer gleich im Interruptmodus zu benutzen. So ist und bleibt es eine Warteschleife.
Dazu muss aber die von perl geforderte ISR-Vektorenliste ab Adresse 0x000 stehen. Weiterhin muss im SREG das I-Flag gesetzt werden und im TIMSK auch.

Wenn das I-Flag nicht gesetzt ist, kann auch erstmal nicht passieren, selbst wenn Interrupts autreten, die Handler werden nicht ausgeführt.


Edit: dein Programm restlichen Quelltext habe ich mir nicht angeschaut, da ich keine Lust habe, das Zip-Archiv zu öffnen. Hänge es lieber als Textdatei an, geht schneller.


Zitat :

Der Timer 1 hat das Überlaufbit TOV0

Ich denke mal, du spricht vom ersten Timer, also Timer0 .



_________________


[ Diese Nachricht wurde geändert von: DonComi am  9 Mär 2010 18:48 ]

BID = 676121

Martin Wagner

Schriftsteller

Beiträge: 768
Wohnort: Unterfranken
Zur Homepage von Martin Wagner

Danke, Problem ist damit gelöst.

Bei verwenden von sbis ist immer
"_dateipfad_(36): error: Operand 1 out of range: 0x38"
gekommen.
Hab daher gedacht, das es der falsche Befehl ist...
Und mit den anderen beiden hat er (jetzt verständlicherweise) auch nicht gemeckert. Dachte einfach, der ist für alle Statusregister anwendbar, nicht nur für das Prozessorstatusregister... (rtfm hilft)

Mit Auslesen über Zwischenregister funktionierts jetzt problemlos.


Das ganze soll eine Warteschleife bleiben. Mit Interrupts dürfte ich mein ganzes Programm neu schreiben.


@Perl: Das ist das ganze Programm zum Testen des Timer0 Moduls. Wenns in dem kurzen Programm nicht funktioniert, funktionierts im finalen Programm bestimmt auch nicht
Beim Simulieren ists auch egal, ob er nach dem letzten NOP einmal durch den leeren Programmspeicher saust...

Den restlichen Quelltext kann ich mal anhängen, wen es interresiert...
Das Programm digitalisiert vier analoge Werte (0..5V) und skaliert sie so das daraus 0..20V bzw. 0..2A werden. Optimal ist bestimmt nicht alles gelöst, aber es funktioniert

Gruß Martin

BID = 676128

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Hallo Martin,


Zitat :

Danke, Problem ist damit gelöst.




Zitat :

Bei verwenden von sbis ist immer
"_dateipfad_(36): error: Operand 1 out of range: 0x38"

Ja, genau das meinte ich oben.
Die IO-Adresse passt nicht mehr in den opcode von sbis. Das trifft nicht nur au diese Instruktion zu, das ist bei mehreren so. Z.B. auch bei sbi, cbi und anderen.

_________________


Zurück zur Seite 0 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 20 Beiträge im Durchschnitt pro Tag       heute wurden bisher 0 Beiträge verfasst
© x sparkkelsputz        Besucher : 182392895   Heute : 88    Gestern : 7548    Online : 571        25.11.2024    0:48
2 Besucher in den letzten 60 Sekunden        alle 30.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0944349765778