Forum: Compiler & IDEs attiny44 stürzt direkt nach dem ich sei(); ausführe ab


von Jan (Gast)


Lesenswert?

Ich versuche ein einfaches Projekt vom attiny45 auf attiny44 zu 
portieren, doch leider ohne erfolg. Der attiny44 stürzt direkt nach dem 
ich sei(); ausführe ab. (wenn ich dem avr studio emulator beim debbugen 
glauben kann).

Mein Programm (habe es abgespeckt):

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

ISR(TIM0_OVF){
PORTB=0b00000111;
}

int main(void){
DDRB=0b00000111;
PORTB=0b00000000;
//PORTB=0b00000111;  Leuchtdioden  an
TIMSK0=(1<<TOIE0);
TCCR0B=((1<<CS00)|(1<<CS02));
sei();
while(1);
}

PORTB=0b00000111; schaltet drei Leuchtdioden an. Wenn diese Zeile in 
main nicht auskommentiert ist dann leuchten auch diese leds. Zum 
Interrupt kommt er aber nie, denn die leds bleiben immer aus wenn die 
Zeile PORTB=0b00000111; im main auskommentiert bleibt. Woran kann das 
denn liegen??

Interessanter weise habe ich folgende Warnung beim Kompilieren :

../attiny44test.c:6: warning: 'TIM0_OVF' appears to be a misspelled 
signal handler

danke für eure Hilfe im voraus. Gibt es vielleicht eine Besonderheit 
beim attiny44??

Gruss,
jan

von Floh (Gast)


Lesenswert?

Jan schrieb:
> ../attiny44test.c:6: warning: 'TIM0_OVF' appears to be a misspelled
> signal handler

Der kennt den Interrupt nicht, also nachschaun, wie der wirklich heißt.
:-)

von Timmo H. (masterfx)


Lesenswert?

Müsste es nicht: TIM0_OVF_vect heißen...

von asdf (Gast)


Lesenswert?

Hallo,

ich hatte schon mal das Problem, dass der Debugger abstürzt wenn in 
einer Schleife keine weiteren Befehle stehen. Füge also z.B. zweimal 
nop(); in die while(1) Schleife ein. Vielleicht hilfts.
Grüße

von Karl H. (kbuchegg)


Lesenswert?

asdf schrieb:
> Hallo,
>
> ich hatte schon mal das Problem, dass der Debugger abstürzt wenn in
> einer Schleife keine weiteren Befehle stehen. Füge also z.B. zweimal
> nop(); in die while(1) Schleife ein. Vielleicht hilfts.

Quatsch.
Der Compiler sagt ihm sogar, wo das Problem liegt.
Nur darf man eben Warnungen nicht in jedem Fall auf die leichte Schulter 
nehmen

von Jan (Gast)


Lesenswert?

Der Vektor heißt TIM0_OVF_vect und nicht TIM0_OVF.

Der Compiler hat Recht, TIM0_OVF gibt es nicht. Schaut man in die 
include Datei dann findet man dort  TIM0_OVF_vect . Sobald  ich das zum 
TIM0_OVF_vect ergänzt habe verhält sich alles wie erwartet.

Weis nicht wie dieser Fehler reingekommen ist. Irgendwie war ich mir so 
sicher das diese Zeile richtig war, so sicher, das ich die 
Compilerwarnung nicht ernst genommen habe, bzw. nicht akzeptiert habe. 
Seltsam aber das Verhalten beim debbugen mit AVR studio. Das hat 
wahrscheinlich dazu geführt das ich die Warnung nicht ernst genommen 
habe.

Warnungen ignorieren darf man anscheinend nicht machen, der Compiler hat 
immer Recht! Oder fast immer??

Auf jeden Fall vielen Dank für Eure Hilfe.

Gruss,
Jan

von Karl H. (kbuchegg)


Lesenswert?

Jan schrieb:

> Warnungen ignorieren darf man anscheinend nicht machen, der Compiler hat
> immer Recht! Oder fast immer??

Es gibt nur sehr wenige Warnungen, die man tatsächlich gefahrlos und 
ohne Ansehen der Situation einfach ignorieren kann. Aber selbst dann ist 
man besser beraten, den Code so zu ändern, dass die Warnung nicht mehr 
kommt.

Profis (also die Leute, die ihre Brötchen damit verdienen) arbeiten in 
der Regel so, dass ihr Code auf der höchsten oder zumindest der 
vorletzten Compiler-Warning Stufe (je nach Compiler) ohne jegliche 
Warnung compilieren muss! Ansonsten wird der Code wieder zum 
Programmierer zurückgegeben und wird nicht in das Produktionsenvironment 
übernommen. Hilfreich ist dabei ein Schalter, den praktisch alle 
Compiler haben: "Treat Warnings as Errors". Dann kann man keine Warnung 
übersehen, weil der Build Prozess fehl schlägt.

Betrachte Warnings als Hilfestellung des Compilers und nicht als 
notwendiges Übel und du hast weniger Ärger. Denn gerade in der 
Programmierung nimmt man jede Hilfe, die man kriegen kann dankbar in 
Anspruch.

von sonstwer (Gast)


Lesenswert?

Gibts eigentlich irgendwo eine Liste mit all den "*_vect" Namen?

von Karl H. (kbuchegg)


Lesenswert?

sonstwer schrieb:
> Gibts eigentlich irgendwo eine Liste mit all den "*_vect" Namen?

Der Regelfall ist:
Im Datenblatt das Kapitel mit den Interrupt Vektoren aufschlagen.
An jeden Namen noch ein _vect dran hängen ... du hast den Gcc-Namen 
dafür.

Man kann natürlich auch ins prozessorspezifische iom*.h hineinschauen. 
Dort müssen auch alle vorhanden sein. Denn irgendwie müssen ja auch 
diese Namen irgendwo definiert sein.

von sonstwer (Gast)


Lesenswert?

Danke für die Beschreibung. Habs gerade in der iom*.h gefunden, aber 
wirklich komfortabel ist das nicht. Dann Nehm ich lieber deine 
"Datenblattname + '_vect'"-Faustregel ;)

von Karl H. (kbuchegg)


Lesenswert?

sonstwer schrieb:
> Danke für die Beschreibung. Habs gerade in der iom*.h gefunden, aber
> wirklich komfortabel ist das nicht. Dann Nehm ich lieber deine
> "Datenblattname + '_vect'"-Faustregel ;)

Du wirst schnell merken, dass man die meisten Interrupts mit denen man 
ständig zu tun hat, in 0 Komma nix auswendig kann.

von sonstwer (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Du wirst schnell merken, dass man die meisten Interrupts mit denen man
> ständig zu tun hat, in 0 Komma nix auswendig kann.

Stimmt schon, meine kenn ich auch auswendig, nur will ich auch wissen, 
wo ich schnell schauen kann wenn ich mal was 'exotisches' suche ;)

von Tom M. (tomm) Benutzerseite


Lesenswert?

sonstwer schrieb:
> Danke für die Beschreibung. Habs gerade in der iom*.h gefunden, aber
> wirklich komfortabel ist das nicht.

Ich schau meistens in der avr-libc Dokumentation nach zu 
<avr/interrupt.h>. Dort gibt's ne grosse Tabelle mit den 
Vektor-Bezeichnungen, Beschreibung dazu und ne Liste mit MC, welche 
diesen Vektor kennen.

http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html

> Dann Nehm ich lieber deine
> "Datenblattname + '_vect'"-Faustregel ;)

Gute Eselsbrücke, darauf bin ich noch nicht gekommen. 8)

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.