PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer2 overflow Interrupt will nicht



BomberD
15.11.2004, 10:26
Hi,

irgendwie will bei mir Timer2 keinen Interrupt auslösen.


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
}

Ich weis nicht warum und wieso und weshalb.
Der Timer1 läuft supi.

Die Interruptmethode für Overflow-Interrupt 2 wird nicht ausgeführt:
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
}
}
Nicht verwirrt sein, an und aus ist vertauscht weil das STK500 die Ausgänge negiert auf die LED's bringt. :(

15.11.2004, 12:26
sei (); ???

BomberD
15.11.2004, 12:34
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?

15.11.2004, 16:45
Hallo

Was sagt denn eine Simulation im AVR Studio ??

Mit den Code Auszügen ist es schwer, da was zu sagen.

MFG
Dieter

BomberD
16.11.2004, 05:30
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...

BomberD
16.11.2004, 07:39
.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 :(

BomberD
16.11.2004, 09:07
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.

16.11.2004, 11:32
Hallo

Böser Fehler hat sich da eingeschlichen.


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
}

Also besser so, da TIMSK ein Register ist.


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
}

Simulieren in AVR Studio ganz grob

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

BomberD
16.11.2004, 11:53
DANKE! Mein Held!!!! <<--Will sagen es geht jetzt ;)

Edit: Es Simuliert!!! ;) Schick. Schick.

Cluni
30.01.2006, 14:26
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

SprinterSB
30.01.2006, 16:37
.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?

Das sind die Größen der einzelnen Sections, in die GCC die Daten einsortiert.
.text (Programm-Code) ist 1504 Bytes groß (also etwas über 1kByte).
Insgesamt belegst du
Flash: .text + .data
SRAM: .data + .bss + .noinit
EEPROM: .eeprom
Der Rest sind Debug-Infos, die nicht auf dem Controller landen.

Die dritte Spalte gibt die (virtuelle) Startadresse an.
.data begint bei 0x800060 (Physikalisch SRAM 0x60) und ist 88 Bytes (0x58) lang. .bss liegt danach und fängt bei 0x8000b8 = 0x800060 + 0x58 an.

Im Wiki: https://www.roboternetz.de/wissen/index.php/Avr-gcc#Sections