Forum: Mikrocontroller und Digitale Elektronik 8Bit Timer/Counter 0


von po (Gast)


Lesenswert?

Hallo erstmal.

Ich habe ein Problem mit meinem Atmega 8L. Ich habe alle Parameter 
eingestellt für den 8 Bit Timer/Counter0, aber die angeschlossene 
Leuchtdiode will nicht angehen. Ich verwende den internen clock und noch 
nicht einen Quarz. Oder liegt es vielleicht daran? Richtig angeschlossen 
ist alles an dem Atmega 8L. Hier erstmal das Programm:

#include <stdint.h>
#include <stdlib.h>

#include <avr/eeprom.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/sleep.h>
#include <avr/wdt.h>

int main (void)
{
 DDRC=1; //Daten Direction Register->PCO als Ausgang Schalten
 TCCR0=00000101;  //Prescaler einstellen-> Division von 1024
 TIMSK=1;         //Interrupt für Overflow counter aktiviert
 TCNT0=0;         //counter auf 0 setzen
 PORTC=1;         //PC0 auf 1 setzen->Diode aus
 sei();           //Atkivierung des Global Interrupt

 while(1);       //unendlichschleife

   return 0;
}


ISR(TIMER0_OVF_vec)    //ISR von 8 Bit Timer/Counter0
{
PORTC=0;    //PCO-> wird zu null->LED sollte angehen
}

von po (Gast)


Lesenswert?

Hab dies noch geändert, aber es läuft immer noch nicht

TCCR0=00000101; ->TCCR0=0b00000101;

von Oliver (Gast)


Lesenswert?

#include <avr/interrupt.h>
#include <avr/io.h>

Die Reihenfolge der #includes ist nicht egal - pack mal das #include 
<avr/io.h> ganz nach oben. Da sind die prozessorabhängige Defines drin, 
die in anderen headern gebraucht werden.

Oliver

von po (Gast)


Lesenswert?

hab ich gemacht. geht nicht. hab mich übrigens oben mit dem Kommentaren 
vertan, mit der Led-> das muss natürlich andersrum sein

von Andreas K. (a-k)


Lesenswert?

Klär bitte erst einmal, ob die LED nun bei 1 oder 0 leuchtet, und ob sie 
überhaupt irgendwann mal leuchtet. Beim STK500 beispielsweise leuchten 
die Dinger bei 0.

von Andreas K. (a-k)


Lesenswert?

PS: Was sinnvoll sein kann: PORTC ^= 1 im Interrupt, dann blinkt die 
LED. Wenn der Mega8 wie ab Werk mit 1MHz arbeitet, dann kann man das 
noch sehen.

von po (Gast)


Lesenswert?

sie leuchtet bei 0. übrigens ich benutze kamavr und ponyprog um die hex 
rüberzuschieben. Der Compiler zeigt ab und an eine Warnmeldung an:

TIMER0_OVF_vec appears to be misspelled signal handler

von po (Gast)


Lesenswert?

und sie leuchtet auch

von Andreas K. (a-k)


Lesenswert?

Und das schreibst du jetzt??? Häng dem mal ein "t" an, dann geht's.

von po (Gast)


Lesenswert?

geht leider immer noch nicht mit dem t bei vect

von Andreas K. (a-k)


Lesenswert?

Ist jetzt wengstens die Meldung weg? Gibt's noch andere "unwichtige" 
Meldungen?

von po (Gast)


Lesenswert?

die eine ist weg und es gibt nun gar keine mehr

von po (Gast)


Lesenswert?

So hab das Programm mal berichtigt und die anderen includes auch mal 
weggemissen, aber geht so immer noch nicht





#include <avr/io.h>
#include <avr/interrupt.h>



int main (void)
{
 DDRC=1;        //Daten Direction Register->PCO als Ausgang Schalten
 TCCR0=0b00000101;  //Prescaler einstellen-> Division von 1024
 TIMSK=1;           //Interrupt für Overflow counter aktiviert
 TCNT0=0;           //counter auf 0 setzen
 PORTC=0;           //PC0 auf 1 setzen->Diode an
 sei();             //Atkivierung des Global Interrupt

 while(1);         //unendlichschleife

   return 0;
}


ISR(TIMER0_OVF_vect)    //ISR von 8 Bit Timer/Counter0
{
PORTC=1;    //PCO-> wird zu null->LED sollte aus gehen
}

von Andreas K. (a-k)


Lesenswert?

In Atmels Simulator klappt das prima.

von po (Gast)


Lesenswert?

na ja, aber Simulator ist halt nicht die Realität. ich kann es mir beim 
besten willen nicht erklären. Die led leuchtet vor sich hin, aber aus 
geht sie nicht. Hab die led an einen 100 ohm widerstand gehängt.

von po (Gast)


Lesenswert?

So hab jetzt das Programm mal geändert und so geht die led aus. Das 
heisst, der counter zählt auf jeden fall, aber ich komme nicht in die 
ISR


#include <avr/io.h>
#include <avr/interrupt.h>



int main (void)
{
 DDRC=1;        //Daten Direction Register->PCO als Ausgang Schalten
 TCCR0=0b00000101;  //Prescaler einstellen-> Division von 1024
 TIMSK=1;           //Interrupt für Overflow counter aktiviert
 TCNT0=0;           //counter auf 0 setzen
 PORTC=0;           //PC0 auf 1 setzen->Diode an
 sei();             //Atkivierung des Global Interrupt

 while(1)         //unendlichschleife
 {
  if(TCNT0==255)
  PORTC=1;

 }

   return 0;
}


ISR(TIMER0_OVF_vect)    //ISR von 8 Bit Timer/Counter0
{
PORTC=1;    //PCO-> wird zu null->LED sollte aus gehen
}

von Michael S. (schimito)


Lesenswert?

meiner Meinung nach fehlt noch

sei(); //Intterupts global aktivieren

von po (Gast)


Lesenswert?

sei ist drin.guck mal genau hin

von po (Gast)


Lesenswert?

so funktioniert jetzt. liegt irgendwie am compiler

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.