Forum: Mikrocontroller und Digitale Elektronik ATtiny26 - timer0 interrupt führt zu Reset


von Jens S. (darkridge)


Angehängte Dateien:

Lesenswert?

Hallo, ich bin neu im Forum, habe aber schon etwas Erfahrung mit uC's.

Für eine Timer-Anwendung brauche ich einen Timer Interrupt vom ATtiny26 
und verwende hierfür Timer/Counter0 (mit Timer/Counter1 habe ich das 
gleiche Problem).

Sobald ich den Interrupt enable (sei() und TCCR0) führt der uC endlos 
Resets durch.

Das Verhalten ist gleich, auch wenn die ISR gar nicht definiert ist.

Das Verhalten ist gleich bei interner Clock und Crystal Oscillator.

Durch "LED-Debugging" habe ich herausgefunden, dass der Zähler TCNT0 
funktioniert, und dass der Interrupt Flag TOV0 gesetzt wird.

Ich vermute, dass der Interrupt ausgelöst wird aber anstatt zur ISR zum 
Reset Vektor springt.

Ich kompiliere und programmiere mit:
1
$ avr-gcc -I. -O6 -g -mmcu=attiny26 -Wcpp -o $@ $<
2
$ avrdude -p t26 ...

Fällt jemandem hier was auf?
1
#define F_CPU (1600000L)
2
3
4
#include<avr/io.h>
5
#include<avr/interrupt.h>
6
#include<util/delay.h>
7
8
9
ISR( TIMER0_OVF0_vect ) {
10
  PORTA &= ~(1<<7);
11
}
12
13
void greeting () {
14
  uint8_t i, ii;
15
  for (ii=0; ii<2; ii++ ) {
16
    for ( i=0; i<10; i++ ) {
17
      PORTA ^= (1<<(0+ii));
18
      _delay_ms(40);
19
    }
20
  }
21
}
22
23
main()
24
{
25
26
  DDRA=0xFF;
27
  PORTA=0xFF;
28
29
  TIMSK = (1<<TOIE0);
30
  TCNT0 = 0;
31
  greeting();
32
33
  TIFR &= ~(1<<TOV0);
34
  TIFR &= ~(1<<TOV1);
35
  sei();
36
  TCCR0 = 5;
37
38
  while(1) {}
39
}

: Bearbeitet durch User
von MWS (Gast)


Lesenswert?

Jens Schäfer schrieb:
> Ich vermute, dass der Interrupt ausgelöst wird aber anstatt zur ISR zum
> Reset Vektor springt.

Das passiert nur, wenn der angegebene Interruptname dem Compiler nicht 
bekannt ist, dann wird auf Reset umgelenkt. Sieht aber nicht so aus, die 
iotn26.h kennt den TIMER0_OVF0_vect.

Du könntest das erzeugte .hex anhängen, dann kann man nachschauen, was 
passsiert.

Übrigens, so löscht man keine Flags:

Jens Schäfer schrieb:
> TIFR &= ~(1<<TOV0);
> TIFR &= ~(1<<TOV1);

von Jens S. (darkridge)


Angehängte Dateien:

Lesenswert?

> Du könntest das erzeugte .hex anhängen, dann kann man nachschauen, was
> passsiert.

Vielen Dank! Anbei das HEX-File.

> Übrigens, so löscht man keine Flags:

Ja, stimmt. - Das hatte ich vor Verzweiflung mal reingeschrieben. Für 
das aktuelle HEX-File habe ich es wieder rausgenommen. (Keine Änderung 
im Verhalten.)

Übrigens kommt der Reset tatsächlich erst, wenn TCNT0 überläuft, also 
der Interrupt Flag gesetzt wird.

Blöde Frage: Wie analysierst Du denn  das HEX-File?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Jens Schäfer schrieb:
> Übrigens kommt der Reset tatsächlich erst, wenn TCNT0 überläuft, also
> der Interrupt Flag gesetzt wird.
1
  TIFR &= ~(1<<TOV0);
2
  TIFR &= ~(1<<TOV1);
 Wie wäre es, wenn du diese 2 Zeilen mal rauswirfst ?
 Oder zumindest die untere ?

: Bearbeitet durch User
von Route_66 H. (route_66)


Lesenswert?

Jens Schäfer schrieb:
> Ja, stimmt. - Das hatte ich vor Verzweiflung mal reingeschrieben. Für
> das aktuelle HEX-File habe ich es wieder rausgenommen. (Keine Änderung
> im Verhalten.)

Marc, nicht gelesen?

von H.Joachim S. (crazyhorse)


Lesenswert?

Jens Schäfer schrieb:
> Blöde Frage: Wie analysierst Du denn  das HEX-File?

Das kann man sich auch ins AVR-Studio laden :-)

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Route 66 schrieb:
> Marc, nicht gelesen?

 Ooops.
 Gelesen schon, aber übersehen, sorry.
 Aber das ist auch die einzige Stelle im Programm, wo er wieder zum
 Reset springen kann, da ja TCNT1-ISR nicht definiert ist...

von Bernhard F. (bernhard_fr)


Lesenswert?

Dann bleibt ja nicht mehr viel übrig...

Ist denn
1
ISR( TIMER0_OVF0_vect )
richtig?

Kannst du mal stattdessen
1
ISR(_VECTOR(6))
probieren?

von Karl H. (kbuchegg)


Lesenswert?

Bernhard F. schrieb:
> Dann bleibt ja nicht mehr viel übrig...
>
> Ist denn
>
1
> ISR( TIMER0_OVF0_vect )
2
>
> richtig?

Scheint richtig zu sein, solange der richtige µC in der IDE eingestellt 
ist.

> Kannst du mal stattdessen
>
1
> ISR(_VECTOR(6))
2
>
> probieren?

Keine gute Idee.

von Jens S. (darkridge)


Lesenswert?

> Kannst du mal stattdessen
> ISR(_VECTOR(6))

Habe ich gemacht. - Keine Besserung.

(Die Definition in der iotn26.h hatte ich zuvor schon geprüft.)

von Jens S. (darkridge)


Lesenswert?

> Scheint richtig zu sein, solange der richtige µC in der IDE eingestellt
> ist.

Ich programmiere von der Kommandozeile. Deshalb hatte ich oben den 
avr-gcc-Befehl mit angegeben.

von Stefan E. (sternst)


Lesenswert?

Jens Schäfer schrieb:
> Ich kompiliere und programmiere mit:
> $ avr-gcc -I. -O6 -g -mmcu=attiny26 -Wcpp -o $@ $<
> $ avrdude -p t26 ...

Kein Wunder, dass Interrupts nicht funktionieren, wenn du das ELF-File 
in den Controller lädst.

Jens Schäfer schrieb:
> Anbei das HEX-File.

Nö. Dem ELF-File eine andere Endung zu verpassen, macht daraus kein 
HEX-File.

von MWS (Gast)


Lesenswert?

Jens Schäfer schrieb:
> Vielen Dank! Anbei das HEX-File.

War kein Intel-Hex, statt dessen ein ELF, laden und simulieren konnte 
man's im AVR-Studio.

Der OVF0 löst aus wie er soll und springt auch nirgends anders hin, als 
in die ISR.

Such' mal im Codeordner nach dem Intel-Hex und flash dieses.

von Jens S. (darkridge)


Lesenswert?

Strike! - Das war's!

Ich habe in der Tool-Chain glatt den avr-objcopy vergessen! - Da wäre 
ich nie drauf gekommen.

Vielen Dank! - Ihr seid super!

von Bernhard F. (bernhard_fr)


Lesenswert?

Karl Heinz schrieb:
>> Kannst du mal stattdessen
>>
1
>> ISR(_VECTOR(6))
2
>>
>> probieren?
>
> Keine gute Idee.

AHHH... Kopf-> Tisch. Es wäre auch Vektor 7 an Adresse $006. Und mal 
wieder zeigt sich deutlich, warum Atmel dafür eindeutige 
Präprozessorkonstanten vorgesehen hat.

War es das? Oder kommt noch was dazu?

von Jens S. (darkridge)


Lesenswert?

Das war's. Das Makefile macht jetzt folgendes:

  avr-gcc -> ELF-File -> avr-objcopy -> HEX-File -> uC

Der Fehler entstand durch:

  avr-gcc -> ELF-File -> uC

Das Gemeine war, dass mit dem ELF File alles Funktioniert hat, nur eben 
die ISR nicht.

Nochmals vielen Dank für Eure Hilfe!

: Bearbeitet durch User
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.