was mich wundert ... die methode _delay_ms();
Weil das keine Methode sondern eine Funktion ist
Hast Du auch util/delay.h eingebunden ?
Die gibt es sicher und die ist auch genau, na gut wenn es Timer sein muß ...
Was verstehst Du an Prescaller nicht ?
Wenn der Prescaller = 1 ist läuft Dein Timer mit dem µC Takt bei z.B 1MHz
Takt erhöht der Timer seinen Wert jede µS.
Bei Prescaller 8 alle 8 µC Takte -> 8µS
Bei Prescaller 64 alle 64 µC Takte -> 64 µS
usw. usw.
Der Wert des Timers wird im Register TCNT* gespeichert.
Mal schauen...
angenommen wir möchten alle 100 mS irgendwas tun und unser µC läuft mit 1MHz stellen wir den Prescaller auf 1024
damit wird der Timer alle 1,024 mS erhöht...
Ich arbeite im Moment mit einem Tiny2313 und das sieht es so für Timer 0 aus:
Code:
TCCR0B = (1<<CS02)|(1<<CS00);
Damit läuft der Timer schon !
Da wir möchten, daß sich alle 100mS was tut müssen wir noch den Timerwert anpassen, weil er sonst bei 0 anfängt also
Jetzt steht der Timer auf 156 und in genau 100 Timertakten läuft der über.
Das fangen wir mit einem Interrupt ab
den müssen wir zuerst freigeben das sieht dann so aus:
Code:
TIMSK = (1<<TOIE0);
Jetzt ist der Timer 0 Overflow Interrupt freigegeben, das ist natürlich noch nicht alles, wir müssen Interrupts allgemein zulassen:
Was noch ?
natürlich die Interrupt Routine, die ausgeführt werden soll, wenn der Timer üerläuft:
Code:
ISR (TIMER0_OVF_vect) {
TCNT0 = 256 - 100;
PORTB ^=(1<<PB0);
}
das wars...
ganz wild durcheinander hier nochmal das ganze "Programm"
Code:
#include<avr/io.h>
#include<avr/interrupt.h>
ISR (TIMER0_OVF_vect) {
TCNT0 = 256 - 100;
PORTB ^=(1<<PB0);
}
int main(void) {
DDRB = (1<<PB0);
TCNT0 = 256 -100;
TIMSK = (1<<TOIE0);
TCCR0B = (1<<CS02)|(1<<CS00);
sei();
while(1);
return 0;
}
Es kann sein, daß die Register bei Deinem µC etwas anders heißen, schau einfach ins Dattenblatt.
Ich hoffe, daß es so richtig ist, ich habe mir gerade dieses "Programm" aus den Ärmel geschüttelt
Gruß Sebastian
Lesezeichen