8bit Timer für newbies zum testen

Gast #75118
Hi,
ich wollte mal ein sinnvollen Beitrag reinstellen, nicht von mir
sondern von Atmel, aber was solls. Vielleicht gibt es noch mehr Leute,
die gerne in C programmieren und sich mit den AVR-funktionen nicht
auskennen, wie ich, und etwas "rumspielen" wollen.

Was macht das Programm?

init() dürfte klar sein, das kann man auch aus der ioXXXX.h rauslesen.
-man gibt den prescaler an

main() ist auch noch verständlich:
-init(): initialisiert den timer0 (TCCR0) und definiert DDRB als
Ausgang (DDRB = 0xFF)
-while(1): auch verständlich, eine Endlosschleife
-PORTB++: von PortB0-Bx, also alle Ports der Reihe nach


dann gehts bei mir aber schon los!
delay(): wenn ich delay weglasse, dann leuten alle LEDs

kann mir jemand erklären, was
#############################
void delay(void){
  while (!(TIFR&0x02));
  TIFR = 0x02; // Clearing overflow flag
}*
#############################
macht?

...Verzögerung solange bis TIFR&0x02 erreicht ist...

so verstehe ich das...

dann habe ich in ->mikrocontroller.net->artikel->C für AVR
nachgelesen:

TIFR: Timer/Counter Interrupt Flag Register
0x02 -> 1.Bit = 1
entspricht TOVR: Timer/Counter Interrupt Flag Register

"Das Flag wird automatisch gelöscht, wenn der zugehörige
Interrupt-Vektor aufgerufen wird. Es kann jedoch auch gelöscht werden,
indem eine logische 1 (!) in das entsprechende Bit geschrieben wird."

Also die Verzögerung solange bis ???

hier setzt es aus bei mir...

Kann mir jemand TIFR=&0x02 erklären, was da passiert.

Danke
Angehängte Dateien:
Gast
Wenn Du Delay weglässt, geht alles halt "etwas" schneller. Jede Diode
geht dann %50 an und 50% aus, und zwar so schnell, dass Du es nicht
mehr siehst.

#############################
void delay(void){
  while (!(TIFR&0x02));
  TIFR = 0x02; // Clearing overflow flag
}*
#############################

  while (!(TIFR&0x02));

wartet, bis Timer überläuft, dann wird das Flag 02 in Reg. TIFR
gesetzt.

Übersetzt heisst die Zeile:

"Während Flag 2 in TIFR Null ist, tue ... nichts.

Stefan
Gast
jetzt spiele ich schon ne ganze weile herum...

Habe meinen 4433 mit 4MHz getaktet, aber ich würde das ganze gerne
nochmal langsamer ablaufen lassen.

Kann ich da nicht noch den 16bit Timer einsetzen um die (4MHz/1024)
nochmal durch 2 zu teilen?

Was brauche ich da für einen Ansatz?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.