eli45
05.06.2007, 21:13
Hi!
Ich arbeite gerade an meinem ersten Timer/Interrupt Programm. Ich bin ja eigentlich der Meinung, dass es läuft, nur der AVR eben nicht! ;-)
Es soll einfach eine LED an PB0 blinken...
LED1 und LED2 sind nur zum Test drin, wobei LED1 leuchtet, LED2 aber nicht. Scheinbar wird nicht ein einziger Interrupt ausgelöst...
Ich wäre mal dankbar, wenn jemand mal drüber schauen könnte.
Hier mal der Code:
/*Programm zur Ausgabe von PWM Signalen v070605
*fuer Atmega8 @ 3.6864 MHz
*/
#define F_CPU 3686400
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>
volatile uint8_t NumberOverflow0; /*Zaehlt die Ueberlaeufe des Timer0*/
ISR(TIMER0_OVF_vect) /*Interrupt Timer0 Overflow*/
{
/*
*Check
*/
PORTB |= (1<<PB2); /*LED2 fuer Test*/
/*
*Check
*/
NumberOverflow0++; /*NumberOverflow0 hochzaehlen*/
if(NumberOverflow0==15) /*beim 15. Overflow PB0 auf high, 3686400/1024 = 3600,3600/256 = 14.0625, 15 Ueberlaefe ~1 sek*/
{
PORTB |= (1<<PB0);
}
if(NumberOverflow0==30) /*beim 30. Overflow PB0 auf low*/
{
PORTB &= ~(1<<PB0);
NumberOverflow0 = 0; /*NumberOverflow0 zurÃŒcksetzen*/
}
}
int main(void)
{
TCCR0 |= (1<<CS00) | (1<<CS02); /*Prescaling /1024*/
TIMSK |= (1<<TOIE0); /*Overflowinterrupt aktivieren*/
sei(); /*globale Interrupts aktivieren*/
DDRB = 0xff; /*PortB als Ausgang*/
NumberOverflow0 = 0;
/*
*Check
*/
if((SREG & (1<<7)) && (TCCR0 & (1<<CS00)) && (TCCR0 & (1<<CS02)) && (TIMSK & (1<<TOIE0))) /*Einstellungen testen*/
{
PORTB |= (1<<PB1); /*LED1 fuer Test*/
}
/*
*Check
*/
while(1)
{
;
}
}
Gruß Elias
Ich arbeite gerade an meinem ersten Timer/Interrupt Programm. Ich bin ja eigentlich der Meinung, dass es läuft, nur der AVR eben nicht! ;-)
Es soll einfach eine LED an PB0 blinken...
LED1 und LED2 sind nur zum Test drin, wobei LED1 leuchtet, LED2 aber nicht. Scheinbar wird nicht ein einziger Interrupt ausgelöst...
Ich wäre mal dankbar, wenn jemand mal drüber schauen könnte.
Hier mal der Code:
/*Programm zur Ausgabe von PWM Signalen v070605
*fuer Atmega8 @ 3.6864 MHz
*/
#define F_CPU 3686400
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>
volatile uint8_t NumberOverflow0; /*Zaehlt die Ueberlaeufe des Timer0*/
ISR(TIMER0_OVF_vect) /*Interrupt Timer0 Overflow*/
{
/*
*Check
*/
PORTB |= (1<<PB2); /*LED2 fuer Test*/
/*
*Check
*/
NumberOverflow0++; /*NumberOverflow0 hochzaehlen*/
if(NumberOverflow0==15) /*beim 15. Overflow PB0 auf high, 3686400/1024 = 3600,3600/256 = 14.0625, 15 Ueberlaefe ~1 sek*/
{
PORTB |= (1<<PB0);
}
if(NumberOverflow0==30) /*beim 30. Overflow PB0 auf low*/
{
PORTB &= ~(1<<PB0);
NumberOverflow0 = 0; /*NumberOverflow0 zurÃŒcksetzen*/
}
}
int main(void)
{
TCCR0 |= (1<<CS00) | (1<<CS02); /*Prescaling /1024*/
TIMSK |= (1<<TOIE0); /*Overflowinterrupt aktivieren*/
sei(); /*globale Interrupts aktivieren*/
DDRB = 0xff; /*PortB als Ausgang*/
NumberOverflow0 = 0;
/*
*Check
*/
if((SREG & (1<<7)) && (TCCR0 & (1<<CS00)) && (TCCR0 & (1<<CS02)) && (TIMSK & (1<<TOIE0))) /*Einstellungen testen*/
{
PORTB |= (1<<PB1); /*LED1 fuer Test*/
}
/*
*Check
*/
while(1)
{
;
}
}
Gruß Elias