Forum: Mikrocontroller und Digitale Elektronik Ext Interrupt ATmega644 wird nicht erreicht


von MandA K. (Firma: MAMIMO STudios) (bastlomat)


Lesenswert?

Hallo,

gibt es jemanden, der die AVR Studio version 6.0.1843 installiert hat? 
Ich versuche schon seit geraumer Zeit den folgenden Code zum Laufen zu 
bringen.
Der Timer von meinem ATmega644 soll einfach nur bei einer steigenden 
Flanke in eine Interruptroutine springen, was er aber nicht will!
Wenn ich in der Simulation den ICP Pin auf high setze, wird zwar das 
ICF1 Capture Flag gesetzt aber er springt nicht in die ISR Routine. Was 
ist da los?
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
volatile int b;
5
6
int main (void)
7
{
8
  
9
  TCCR1A = 0;                      // normal mode, keine PWM Ausgänge
10
  TCCR1B =  (1<<CS10)    // start Timer mit Systemtakt
11
          + (1 << ICES1);            // steigende Flanke auswählen
12
  TIMSK1 = (1<<TOIE1) + (1<<ICIE1);   // overflow und Input-capture 
13
  sei();
14
  while(1)
15
  { }  //nichts tun auf Interrupt warten
16
}
17
18
ISR(TIMER1_CAPT_vect){
19
b=ICR1; //mache irgendwas 
20
}

von error (Gast)


Lesenswert?

> TIMSK1 = (1<<TOIE1) + (1<<ICIE1);
Sollte der Syntax nicht wie folgt aussehen:
TIMSK1 = (1<<TOIE1)|(1<<ICIE1);

Überschreibt die Einstellung des Timers das DDR Register, eventuell 
musst du dich darum kümmern?

von MandA K. (Firma: MAMIMO STudios) (bastlomat)


Lesenswert?

Habs grade nochmal gecheckt. Das DDR Register ist nach der 
Initialisierung des Timers unverändert. Alles Pins sind als Eingänge 
festgelegt. Und das entspr. Flag wird ja auch gesetzt! Das ist ja das 
komische. Es wird das ICF1 Flag gesetzt aber nicht die Interrputroutine 
angesprungen.

von Thomas E. (thomase)


Lesenswert?

MandA K. schrieb:
> Das ist ja das komische.
Noch komischer ist die Einstellung der Register. Alles, was da passiert, 
ist Zufall.

error schrieb:
>> TIMSK1 = (1<<TOIE1) + (1<<ICIE1);
> Sollte der Syntax nicht wie folgt aussehen:
> TIMSK1 = (1<<TOIE1)|(1<<ICIE1);
Wenigstens. Besser noch:
TIMSK1 |= (1<<TOIE1)|(1<<ICIE1);

mfg.

von MWS (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> Wenigstens. Besser noch:
> TIMSK1 |= (1<<TOIE1)|(1<<ICIE1);

Hmm, eher nicht. Wenn man initialisiert und Register in einem 
definierten Zustand haben möchte, wird man nicht verodern, eine 
Zuweisung per = ist da schon richtig.

Denn wenn z.B. Bootlader Register vorgelegt hat, sucht man sich mit 'ner 
Veroderung 'nen Wolf.

von Thomas E. (thomase)


Lesenswert?

MWS schrieb:
> Hmm, eher nicht. Wenn man initialisiert und Register in einem
> definierten Zustand haben möchte, wird man nicht verodern, eine
> Zuweisung per = ist da schon richtig.
Daß du deinen Besserwissersenf wieder dazugeben musst, war ja nicht 
anders zu erwarten.

mfg.

von MandA K. (Firma: MAMIMO STudios) (bastlomat)


Lesenswert?

Ich schmeiß gleich meinen Laptop aus dem Fenster. Das kann doch nicht 
sein! Ich will doch einfach nur auf einen blöden externen pin triggern! 
Der Code ist doch nicht groß. Könnte das mal jemand exemplarisch selbst 
schreiben?
Ich weis nicht, was ich noch machen soll.

von Avr (Gast)


Lesenswert?

Naja, wenn ich einen definierten Wert haben will, dann brauch ich eine 
Zuweisung.
Schlechterwissen bringt da nix!

von Benjamin U. (utzus)


Lesenswert?

Halt, ich würde den Laptop vl noch nehmen.

Zeig mal deinen gesamten Code. Ich sehe zwei aktivierte Interrupts, aber 
nur eine ISR.
1
TIMSK1 = (1<<TOIE1) + (1<<ICIE1);

Zeig mal den Code, wie er jetzt genau ausschaut.

von Meister Oder (Gast)


Lesenswert?

MandA K. schrieb:
> Ich schmeiß gleich meinen Laptop aus dem Fenster.

Ruhiger du werden musst, junger Padavan, dann der Fehler sich finden 
wird, von selbst.


Ingo

von MandA K. (Firma: MAMIMO STudios) (bastlomat)


Lesenswert?

Naja...der ganze code steht schon oben. Der 2. Interrupt ist der 
Overflow vom Timer, aber ich gehe von dem Zustand aus, der der Timer 
erst garnicht zum Overflowen kommt.

Was passiert denn, wenn jemand den Code bei sich rein kopiert und PIND6 
auf high setzt. Vlt liegt es an meine PC.

Ich geb mir schon große Mühe, das Fenster zu zu lassen!

von Benjamin U. (utzus)


Lesenswert?

Ähm, kannst nicht testen, hab kein AVR-Studio.

Weiß nicht, was passiert, wenn der Simulator keine ISR findet.
Keine Ahnung, ob der Simulator "richtig" funktioniert. Ich hab schon von 
Fehlern gehört.

ICF1 Capture Flag gesetzt aber er springt nicht in die ISR Routine.

Wenn das Flag gesetzt wird, sollte der Interrupt normalerweise ja auf 
dem MC dann auslösen. Funktioniert dein sei();, wird damit das I-Bit im 
SREG gesetzt?? Sonst lads mal auf nen MC und schau, obs dort läuft.

Am PC wirds wohl nicht legen, höchstens am Simulator
Viel Erfolg

von error (Gast)


Lesenswert?

>Vlt liegt es an meine PC.
Andere Studio Version versuchen...

von Steffen H. (avrsteffen)


Lesenswert?

Hallo

Hab es gerade mit der alten AVRStudio4 (4.17) ausprobiert. Da 
funktioniert es mit dem Simulator wenn ich PIND6 setze oder das ICF1 
Flag im TIFR1 Register setze. Allerdings musste ich das TOIE1 Flag raus 
nehmen, da ja kein Einsprungvector da ist und das kurze Programm dadurch 
ständig einen Reset gemacht hat.

Gruß Steffen

von MandA K. (Firma: MAMIMO STudios) (bastlomat)


Lesenswert?

Mein Leben ist wieder lebenswert! Ich werde umgehend eine mail an Atmel 
verfassen. Vlt. ändern die nochmal was in ihrer Version.

Dann muss ich nun wohl oder übel mit der 4.17ner Version hantieren!


Nochmal vielen Dank. Ihr wollt nicht wissen, wie lange mich dieser Mist 
schon aufhält.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.