Forum: Compiler & IDEs 8bit Timer für newbies zum testen


von Alex (Gast)


Angehängte Dateien:

Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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

von Alex (Gast)


Lesenswert?

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?

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.