PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PROGRAMM funzt ned



axors
09.12.2005, 13:01
#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

m.a.r.v.i.n
09.12.2005, 13:28
Hallo axors
Bei Interruptfunktion ganz genau auf die Syntax achten


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.

Pascal
09.12.2005, 13:48
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.