sei (); ???
Hi,
irgendwie will bei mir Timer2 keinen Interrupt auslösen.
Ich weis nicht warum und wieso und weshalb.Code:void timer0 (void){ TIMSK = _BV(TOIE2); //overflow flag setzen--> ab jetzt kann overflow interrupt ausgelöst werden TCNT2 = 0;//Rücksetzen des Timers TCCR2 = _BV(CS21);//Prescaler 8 ~ 0,000032 s ~0,032ms }
Der Timer1 läuft supi.
Die Interruptmethode für Overflow-Interrupt 2 wird nicht ausgeführt:Nicht verwirrt sein, an und aus ist vertauscht weil das STK500 die Ausgänge negiert auf die LED's bringt.Code:SIGNAL (SIG_OVERFLOW2) { PORTB&=~(1<<PB7);//led an <--debug warum geht sie nicht an count++;//counter inkrement if(count==t2max){ //prüfe ob ziel erreicht if(PORTB & (1<<PB7)){ PORTB&=~(1<<PB7); } else{ PORTB|=(1<<PB7); } //led wieder aus PORTB|=(1<<PB1); //reset count=0; TIMSK &= ~(1<<TOIE2); //timer auslösen deaktivieren } }
MFG
Bomb
sei (); ???
Hab ich. Deshalb läuft der 16bit Timer und auch die UART Interrupts ohne Probleme.
Hat mich jetzt völlig verwirrt. Auch das Umstellen auf Timer 0 hat nix gebracht. Kommt einfach nicht in die Routine. Es sollte auch nix da sein was den Timerint ständig blockiert. Es ist nur der 16 bit Timer am laufen. Der läuft nur mit ner recht kleinen Frequenz undohne große Aktionen (LED blinken)Die anderen Interrupts werden nicht erzeugt.
edit:
Was ich vergessen hab zu sagen:
Der Timer wird nur zu bestimmten Ereignissen durch die timer0 Methode scharf gemacht. Die letzte Aktion im Timer ist das abschalten des Overflow Ints. Kann ich das überhaupt machen? Oder ist das die Wurzel allen übels?
edit2: Muss ich evtl. nach dem 'Scharfschalten' des Overflow interrupts erneut sei() ausführen?
MFG
Bomb
Hallo
Was sagt denn eine Simulation im AVR Studio ??
Mit den Code Auszügen ist es schwer, da was zu sagen.
MFG
Dieter
Guten Morgen,
leider simuliert da nix. Ihc werd mich mal mit der Simulation beschäftigen. Irgendwie mag er c nicht. Ich hab aber gelesen, dass das AVR Studio seit version 4.08 C debugen kann. Bei mir aber nicht...
MFG
Bomb
.text 1504 0
.data 88 8388704
.bss 31 8388792
.noinit 0 8388823
.eeprom 0 8454144
.stab 2676 0
.stabstr 2586 0
Total 6885
kann mir das mal einer übersetzen?
es läuft grad kein timer interrupt mehr. hab das gefühl, das sich den armen kleinen(mega 16) schon zu voll hab
MFG
Bomb
Hi,
nochmal mein Problem mit schlankem code
[code#include <avr/io.h>
#include <progmem.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
//Arbeitstakt angeben
#define SYSCLK 8000000UL
//usart ansprechen
volatile unsigned int count=0;
volatile unsigned int count2=0;
volatile unsigned int Stellweg=1;
void timer (void){
TIMSK = _BV(TOIE0); //overflow flag setzen--> ab jetzt kann overflow interrupt ausgelöst werden
TCNT0 = 0; //Rücksetzen des Timers
TCCR0 = _BV(CS01); //Prescaler 8
}
void timer1 (void){
TIMSK = _BV(TOIE1); //overflow flag setzen--> ab jetzt kann overflow interrupt ausgelöst werden
TCNT1 = 0; //Rücksetzen des Timers
TCCR1B = _BV(CS00); //Prescaler 1
}
int main(void) {
timer ();
timer1();
sei (); //interrupts ein
DDRB = 0xff;//PortB = Ausgabe
PORTB = 0xff;
for (; {
}
return 0;
}
//lässt led blinken
SIGNAL (SIG_OVERFLOW0) {
count++;
if (count==Stellweg){
if(PORTB & (1<<PB0)){
PORTB&=~(1<<PB0);
}
else{
PORTB|=(1<<PB0);
}
count=0;
}
}
SIGNAL (SIG_OVERFLOW1) {
count2++;
if (count2==31){
if(PORTB & (1<<PB1)){
PORTB&=~(1<<PB1);
}
else{
PORTB|=(1<<PB1);
}
count2=0;
}
}[/code]
hier laufen 2 Timer ein 16 und ein 8 bittiger.
In o.g. Fall wird nur der Timer1, also der 16 bittige, abgearbeitet.
Es scheint also nur ein Timer als Counter arbeiten zu können.
Hat jemand mal nen Link wo ich erfahre, wie man das AVR Studio als C Debuger nutzt? Das auf mikrocontroller.net ist irgendwie recht alt.
MFG
Bomb
Hallo
Böser Fehler hat sich da eingeschlichen.
Also besser so, da TIMSK ein Register ist.Code:void timer (void){ TIMSK = _BV(TOIE0); // Hier setzt du das Flag OK !!!!!!!!!!!!!!!!!!!!!!!!!! TCNT0 = 0; //Rücksetzen des Timers TCCR0 = _BV(CS01); //Prescaler 8 } void timer1 (void){ TIMSK = _BV(TOIE1); //hier löschst du aber gleichzeitig das TOIE0 Flag, da du das Register überschreibst. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! TCNT1 = 0; //Rücksetzen des Timers TCCR1B = _BV(CS00); //Prescaler 1 }
Simulieren in AVR Studio ganz grobCode:void timer (void){ TIMSK |= _BV(TOIE0); //overflow flag setzen--> ab jetzt kann overflow interrupt ausgelöst werden TCNT0 = 0; //Rücksetzen des Timers TCCR0 = _BV(CS01); //Prescaler 8 } void timer1 (void){ TIMSK |= _BV(TOIE1); //overflow flag setzen--> ab jetzt kann overflow interrupt ausgelöst werden TCNT1 = 0; //Rücksetzen des Timers TCCR1B = _BV(CS00); //Prescaler 1 }
Neuen Ordner anlegen / C File schreiben und in den Ordner speichen / MFILE aufrufen / Einstellugen vornehmen in Menuezeile MAKEFILE / MAIN file name = Name des C Files / MCU Type = uC wählen / OUTPUT Format = ihex / DEBUG FORMAT = AVR ext coff .
Dann unter FILE das Makefile in den Ordner speichern und Make All ausführen.
Im AVR Studio OPEN/ den Ordner öffnen / C Filename mit der Endung *.cof öffnen / AVR Simulator wählen / uC wählen fertig.
MFG
Dieter
DANKE! Mein Held!!!! <<--Will sagen es geht jetzt
Edit: Es Simuliert!!! Schick. Schick.
MFG
Bomb
Zwar sehr spät für diesen Beitrag, aber ich habe ja auch erst gerade danach gesucht:
SIMULATION eines WinAVR-C-Projekts im AVR-Studio klappt ja supi!!! Bix Thx!
Gruß, Bernd
Lesezeichen