@addict
analogue port benutzen2. Problem ist, dass die Lichtschranke nicht immer einen gleichen Spannungswert liefert (aus diesem Grund kann ich keinen Digitalen Port brauchen)
Die Atmega32.pdf studieren.3. Wie programmiere ich einen Timer ein?![]()
beispiel timer0
Timer0 zahlt hoch bis 255 (0xFF) und fangt dan wieder bei 0 an.
//prescaler (Getriebegehause) /256 nutzen, macht die taktfrequenz vom timer0: 8Mhz (externen oszillator) / 256 = 31,250KHz. TCCR0 |= (1<<CS02);
Jetzt fangt die timer0 an zu laufen.
timer0 zahlt bis 255, so angesteurt mit 31,250KHz mach 1/31250 = 32us pro schritt.
256 (0 bis 255) schritte mahl 32us = 8192us = 8,192ms so lange daurt jeden 'rundgang'.
Jetzt kan mann register TCNT0 auslesen und wird immer ein anderen Wert bekommen. TCNT0 ist die aktuellen timer wert.
//Da blinkt die LED an jedes mahl wenn timer0 64 ist und blinkt aus wenn timer0 186 ist.
//so jeden 8,192ms geht die LED mahl an und aus, (mit die augen nicht zu sehen, sollte nur etwas weniger hell leuchten.
while(1){
if(TCNT0==64)
{
//mach LED an
}
if(TCNT0==186)
{
//mach LED aus
}
}
Die timer0 lauft hardwaremassig unabhangig vom programablauf.
Mann kann beliebig die aktuellen timerwert andern, zb mit TCNT0=33;, da fangt die timer direkt an weiter zu zahlen ab 33.
mit dem prescaler (Getriebegehause) kann mann die timer anhalten.
Bit 0,1 und2 niedrich machen.
TCCR0 &= ~((1<<CS02)|(1<<CS01)|(1<<CS00));
Dass auslesen vom TCNT0 liefert jetz immer dieselben wert.
gruss
Henk
Lesezeichen