PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timerinteruppt will irgendwie nicht



ebb
07.01.2006, 22:49
hi,
ich habe mir einen Timer programmiert, der nach einer Sekunde laufzeit den PD0 high schalten soll , das ganze in C mit AVR Studio 4, er amcht aber nichts, der Led rührt sich nicht


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

uint8_t secound=0;

SIGNAL (SIG_OVERFLOW1)
{
secound ++;
}


int main(void)
{
OCR1AL = 0x09;
OCR1AH = 0x3d;
TCNT1L = 0xf7;
TCNT1H = 0xc2;

TCCR1B |= (1<<CS11)|(1<<CS10);
sei();
while(1)
{
if(secound == 1)
{
DDRD = 0x01;
PORTD = 0x01;
secound = 0;
};
};

}





Diese werte :
OCR1AL = 0x09;
OCR1AH = 0x3d;
TCNT1L = 0xf7;
TCNT1H = 0xc2;

Hab ich von nem tool auf AVRfreaks, die sollen bei 1Mhz Quarz eine Sekunde brauchen damit der Timer neu anfängt

was ist an meinem COde falsch ?

michaelb
08.01.2006, 10:14
Hi,
in deinem Code fehlt was:


TIMSK |= (1 << TOIE1);

damit wird der Timerinterrupt aktiviert!

statt TCNT1L = 0xf7; und TCNT1H = 0xc2; kannst du auch TCNT1 = 0x1B9 schreiben find ich übersichtlicher!

Gruß Michi

ebb
08.01.2006, 10:25
hmmm,
ich hab das jetzt dazugeschrieben , aber da rührt sich irgedwie nichts am µC ,
stimmt das das man einen TImer schwer im AVRstudio Simulieren kann, denn der braucht eeeeeeeeewig bis der timer mal nen überlauf hat

PicNick
08.01.2006, 11:53
AUF JEDEN FALL

VOLATILE uint8_t secound=0;

ebb
08.01.2006, 12:15
k , aber wiso dieses
VOLATILE ???

michaelb
08.01.2006, 12:39
Hi,
damit man diese Variable auch in den Interrupts benutzen kann!! Klappt's jetzt?
Gruß Michi

ebb
08.01.2006, 18:13
ne es klappt nich , da rührt sich gar nix nur wenn ich als Bedinnung secound < 1 eingebe leuchtet die led dauernt, also kommt der zu keinem Overflow bzw. der interuppt geht nich

ebb
09.01.2006, 18:35
ich hab jetzt nen timer gemacht der alle 1000µs fertig ist , so hab ich das im studio gut überwachen können , also der timer fängt neu an , also er ladet die variablen neu ... ABER der interruppt geht nich , also diese Interuppt schleife ignoriert er einfach

PicNick
09.01.2006, 18:47
Weiss jetzt nicht, ob du nicht den OutputCompare-Interrupt belegen müßtest.

ebb
09.01.2006, 19:22
ich hab bei irgendeinem Tutorial gelesen das da bei de rinterupt funktion der signame des interuppts angegeben werden muss ich hab jetzt mal im datenblatt geschaut, aber keinen Signame gefunden , dann hab ich probiert die verschiedenen Namen für den 16BIT timer einzugeben , ohne erfolg,
vl passt dieses SIG_OVERFLOW1 nich ?

PicNick
09.01.2006, 19:36
Schau' in die Include-datei vom Prozessor rein, ganz hinten ist die Speisekarte. Beleg' einfach alles, was dir in den Sinn kommt, was soll's

Und ev. schau auch da mal rein
https://www.roboternetz.de/wissen/index.php/Avr-gcc

ebb
09.01.2006, 20:06
Signal/Interrupt-Name vertippt oder Leerzeichen zu viel
SIGNAL (SIG_OVEFRLOW0)
{
/* mach was */
}

Nicht alle Compiler-Versionen meckern da. Der ISR-Code wird nicht in die Interrupt-Tabelle eingetragen. Kommt es zum Interrupt, dann landet man in RESET.


das könnte sein , mal schauen

ebb
10.01.2006, 18:44
ok , an dem Leerzeichen zwischen Signal und der klammer lags nicht, mit interuppt gehts auch nicht , ich hab echt keinen Plan mehr

JUHU

ich habs jetzt entlich geschafft das das ganze rennt

ich musste die

avr/signal.h noch includen , denn die aktiviert erst das SIGNAL() und das INTERUPPT()
](*,) ](*,)


ein very BIG THX @all die mir geholfen haben