-
PROGRAMM funzt ned
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/iom32.h>
#define SYSCLK 3686400
#define Preclk 3600
#define LEDS_DDR DDRC
#define LEDS_PORT PORTC
int i=0;
void delay_ms(unsigned int ms);
signal (SIG_OUTPUT_COMPARE0 )
{
PORTC=~PORTC;
delay_ms(10);
}
void delay_ms(unsigned int ms)
{
unsigned int zaehler;
while (ms)
{
zaehler = SYSCLK / 3686.4;
while (zaehler)
{
asm volatile ("nop");
zaehler--;
}
ms--;
}
}
int main(void)
{
//PortC wird als AUsgang definiert
LEDS_DDR = 0xFF;
//PortC wird auf o gesetzt
//PORTC=0xFF;
//Interrupts enablen
sei();
//Output compare match interrupt enable
timer_enable_int (1<<OCIE0);
//Output Compare Register setzen
OCR0=0xF0;//240
//Timer starten Vorteiler 1024
TCCR0=(1<<WGM01)|(1<<CS00)|(1<<CS02);
//Endloschleife
for(;;)
{
/*if(TCNT0==0xEF)
{
if(PINC==0x10)
{
PORTC=0x08;
delay_ms(100);
}
else
{
PORTC=0x10;
delay_ms(100);}
}
*/
}
}
Bitte sagts mir waums ned geht
-
Hallo axors
Bei Interruptfunktion ganz genau auf die Syntax achten
Code:
signal (SIG_OUTPUT_COMPARE0)
ohne Spaces innerhalb der Klammer!
Der Aufruf von delay_ms(10) in der Interrupt Funktion verheißt ebenfalls nichts gutes. Sowas geht nicht gut!
Gruß Peter
Edit:
Dann fällt mir noch folgendes auf:
Der Aufruf sei() zum freigeben der Interrupts darf erst nach der Initialisierung von Timer und Output Compare Registern erfolgen.
-
Du könntest uns auch mal verraten, was dein Programm machen soll und was nicht funktioniert.
Welchen Sinn soll das delay_ms in der Interruptroutine haben? Wie m.a.r.v.i.n. schon sagte, ist das ziemlich unnötig und kann auch eine Fehlerquelle sein.
Du könntest das nächste Mal auch die Code-Funktion für das posten von code verwenden. Das macht den code deutlich übersichtlicher.