Hallo

Hier mal ein kleines Testprogramm für den Timer0 Int.


Code:
/* 
Kleines Testprogramm zum testen des TIMER0 im Mega8
Timer0 erzeugt ca alle 10ms einen Interrupt.

Bei 4 MHZ dauert ein Takt 250 ns d.h. für 10 ms müssen wir
nach 40000 Takten einen Overflow mit TIMER0 erzeugen. Da
TIMER0 aber nur bis 255 zählen kann und bei 255 -->  256 einen Overflow
INT erzeugt, haben wir ein Problem. Also setzen wir den Vorteiler
von TIMER0 auf 256. Damit ergibt sich 40000 / 256 = 156,25.

Da wir den Wert 156 schlecht abfragen können und der Overflow INT
nur bei 255 --> 256 auftritt, laden wir den TIMER0 mit 100 vor. ( 256 - 156) 
Der Timer0 zählt dann von 100 aufwärts und löst damit, nach
156 * 256 Takten = 39936 * 250 ns = 9,984 ms einen Overflow INT aus.

In der Overflow INT Routine, müssen wir dann die ca 10 ms INT nur noch zählen
und entsprechend auswerten.

   Chip       Mega 8 
   Takt       4.00 MHz 
   Stand:     Test, läft im Simulator 
  Verfasser: Dino Dieter            */ 
    
#include <avr/io.h> 
#include <stdlib.h> 
#include<avr/interrupt.h>			
#include<avr/signal.h>


//Definition einiger Datentypen, reine Geschmacksache 
#define uchar   unsigned char      // 1 Byte ohne Vorzeichen 0 bis 255 erlaubt 
#define uint   unsigned int      // 2 Byte ohne Vorzeichen 0 bis 65535 erlaubt 

//Definition der Konstanten
#define reload   100			// Reload Wert für Timer0  256 - 100 = 156 

// Defintion der globalen Variablen
volatile uchar count_10ms;		// Zähler für die 10ms INT

// Timer0 Overflow Routinen, Aufruf alle 10 ms
SIGNAL  (SIG_OVERFLOW0 )
{
		TCNT0 = reload;					//Timer0 neu einstellen auf 100
		count_10ms++;					//Zähler um 1 erhöhen
		
		if(count_10ms >= 100)			//Abfrage 1 Sekunde vorbei, 100 * 10 ms
		{
			//dann LED umschalten
			if(bit_is_set(PORTB,1))		//PIN gesetzt ???
					PORTB = 0x00;
			else
		    	   PORTB = 0x01;
				   
		count_10ms = 0;					//Zähler löschen
		}
}

//Einstellen der Hardware des AVR +++++++++++++++++++++++++++++++++++++++++++++ 
void init(void) 
{ 
		//Port einstellen
		DDRB = 0x01;					//PortB.1 auf Ausgang
		
		//TimerO einstellen
		TIMSK = _BV(TOIE0);			// Timer0 Overflow INT erlauben
		TCNT0  = reload;						// TIMER0 vorladen mit 100
		TCCR0 = _BV(CS02) ;			// Vorteiler auf 256, ab hier läuft der TIMER0
		
		// Global Interrupts freigeben
		sei();
} 

//Hauptprogramm, hier startet der uC ++++++++++++++++++++++++++++++++++++++++++ 
void main (void) 
{ 

    init();            // Hardware einstellen gehen 
                      
   for(;;)            // Endlosschleife 
   { 
   } 
    
}
MFG
Dieter