Benni
19.07.2007, 15:14
Hallo Zusammen,
ich bin relativ neu in der Mikrocontroller-Welt und wollte deswegen ein
kleines Programm zum Verständnis der Timer und Interrupts schreiben.
Nach intensivem Studium des Datasheets komme ich aber hier leider nicht
weiter. Das Problem:
Am gesammten Port C meines Atmega32 hängen 8 LEDs (LOW Aktiv PC0-PC7):
Der Sinn des folgenden Programms sollte einfach sein die LED an PC0
mithilfe des 8-Bit Counters im CTC-Mode zum Blinken zu
bringen.(Geschwindigkeit war mir erstmal egal).
Wenn ich das Programm jedoch starte leuchten alle LEDs an Port C auf und
blinken auch nicht. Was mache ich falsch? Ich vermute, dass das Programm
erst gar nicht in die ISR springt. Ist die Timer Initialisierung falsch?
Gruß
Benni
#include <stdint.h>
#include <avr/io.h>
#include <avr/interrupt.h>
//Interrupt Service Routine
ISR(TIMER0_COMP_vect)
{
static uint8_t c=0;
c=~c;
if (c==0){PORTC |= (1<<PC0);}
if (c==1){PORTC &= ~(1<<PC0);}
}
//Hauptprogramm
int main(int argc, char **argv) {
//Pin Konfiguration
DDRC = 0xFF; //PORT C als Ausgang
//Timer 0 initialisieren
TCNT0 = 0x00; //Timer 0 mit Null initialisieren
OCR0 = 0xFE; //Vergleichsregister initialisieren
TIMSK = (1<<OCIE0); //Output Compare interrupt enable
sei(); //Enable Global Interrupt
//Timer Start
TCCR0 = ((1<<WGM01) | (1<<COM00) | (1<<CS02) | (1<<CS00));
// CTC Mode | Toggle OC0 | Prescaler clk/1024
while(1){};
}
[/code]
ich bin relativ neu in der Mikrocontroller-Welt und wollte deswegen ein
kleines Programm zum Verständnis der Timer und Interrupts schreiben.
Nach intensivem Studium des Datasheets komme ich aber hier leider nicht
weiter. Das Problem:
Am gesammten Port C meines Atmega32 hängen 8 LEDs (LOW Aktiv PC0-PC7):
Der Sinn des folgenden Programms sollte einfach sein die LED an PC0
mithilfe des 8-Bit Counters im CTC-Mode zum Blinken zu
bringen.(Geschwindigkeit war mir erstmal egal).
Wenn ich das Programm jedoch starte leuchten alle LEDs an Port C auf und
blinken auch nicht. Was mache ich falsch? Ich vermute, dass das Programm
erst gar nicht in die ISR springt. Ist die Timer Initialisierung falsch?
Gruß
Benni
#include <stdint.h>
#include <avr/io.h>
#include <avr/interrupt.h>
//Interrupt Service Routine
ISR(TIMER0_COMP_vect)
{
static uint8_t c=0;
c=~c;
if (c==0){PORTC |= (1<<PC0);}
if (c==1){PORTC &= ~(1<<PC0);}
}
//Hauptprogramm
int main(int argc, char **argv) {
//Pin Konfiguration
DDRC = 0xFF; //PORT C als Ausgang
//Timer 0 initialisieren
TCNT0 = 0x00; //Timer 0 mit Null initialisieren
OCR0 = 0xFE; //Vergleichsregister initialisieren
TIMSK = (1<<OCIE0); //Output Compare interrupt enable
sei(); //Enable Global Interrupt
//Timer Start
TCCR0 = ((1<<WGM01) | (1<<COM00) | (1<<CS02) | (1<<CS00));
// CTC Mode | Toggle OC0 | Prescaler clk/1024
while(1){};
}
[/code]