PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Habe Probleme, die ISR zu meinem Timer zum laufen zu bringen



LC-HC
26.04.2006, 22:03
HI, ich hab gerad begonnen interrupts mit dem timer auszuprobieren udn den code mal nach AVR Tutorial und Datenblatt gestrickt. Sowohl für 8-, als auch 16 Bit Timer. Problem, es passiert garnichts. Der Port ist richtig, die LED kann ich zum Debuggen auch in led_init() an- und ausschalten, jedoch die ISR des Timers läuft nicht. wahrscheinlich überseh ich nur was, oder ??



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

// edfinition of Timer 0 Interrupt number
#define TIMER0_vect _VECTOR(10)
#define TIMER1_vect _VECTOR(9)

//definitions for Timer register
#define CS00 0
#define CS01 1
#define CS02 2
#define CS12 2

//definitions for LED
#define LEDPORT DDRB
#define LED 0


void timer0_init(void); // 8 Bit Timer
void timer1_init(void); // 16 Bit Timer
void led_init(void);


void main(void)
{
led_init();
timer1_init();

for(;;)
{}

}


void timer0_init(void)
{
cli();
// Set Timer Config:
TCCR0 |= (1<<CS00) | (1<<CS02);

//enable Timer0 Interrupt
TIMSK |= (1<<0);
sei();
}

void timer1_init(void)
{
cli();
// set Timer1 Conifg
TCCR1A = 0x00; // kein CLK_out, kein PWM
TCCR1B |= (1<<CS12); // Prescvaler f_osc/256

//enable Timer1 Interrupt
TIMSK |= (1<<7);
sei();
}


void led_init(void)
{
LEDPORT = 0x01;
PORTB |= (1<<LED);
}


// TIMER 0 ISR
ISR (TIMER0_vect)
{
if( PORTB |= (1<<LED) )
PORTB &= ~(1<<LED);
else
PORTB |= (1<<LED);
}


//TIMER 1 ISR
ISR (TIMER1_vect)
{
if( PORTB |= (1<<LED) )
PORTB &= ~(1<<LED);
else
PORTB |= (1<<LED);
}


mfg

LC

linux_80
26.04.2006, 22:18
Hallo,

ich glaub das mit der IF-Abfrage ist noch nicht ganz ausgereift,
was willst Du damit genau machen:

if( PORTB |= (1<<LED) )
...
das ist zumindest immer wahr, denn die Zuweisung an sich wird kein false zurück liefern.

Was verwendest Du für einen C-Compiler, denn das mit der ISR einstellen ist mir jetzt nicht so geläufig ?

MasterFX
26.04.2006, 22:22
Muss das nicht

ISR(TIMER1_OVF_vect){...} heissen?
Und die Ports musst du mit PIN abfragen, weil sonst die Pullup Widerstände nur aktiviert werden (glaub ich zumindest)

LC-HC
26.04.2006, 22:28
Erstmal danke. In der IF - Anweisung frage ich den LED Status ab, ( wenn beim letzten mal die LED angeschalten wurde, ist der Pin jetzt high und ich muss ihn low setzen. Ich mach das öfters so bei ähnlichen Gegebenheiten, von daher sollte es auch hier laufen). Als Compiler verwende ich den GCC mit der AVR lib.

ogni42
27.04.2006, 08:46
Also, die IF-Abfrage liefert immer true. Du Schaltest die LED an und sofort wieder ab. Was Du - wenn ich den Code richtig verstanden habe - machen willst ist, wenn die LED an war soll sie ausgeschaltet werden, wenn sie ausgeschaltet war, soll sie angeschaltet werden. Im Elektronik-Volksmund heisst das togglen und geht am einfachsten so:



PORT ^= (1<<LED);


Das ist eine XODER-Verknüpfung.

LC-HC
27.04.2006, 19:33
Alles kalr, danke. Nur der Timer läuft immer noch nicht ;)

LC-HC
27.04.2006, 23:14
bevor noch jemand antwortet: alles läuft , danke.