www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR Mega8 mit GCC, Interrupts


Autor: Analog (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein Problem. Ich arbeite schon sehr lange mit Mikrokontrollern 
und programmiere diese in C. Ich wollte nun endlich mal auf den GCC 
umsteigen, dieser ist schließlich auch kostenlos und soll eigentlich 
ganz guten Code erzeugen. Mein Problem ist folgendes. Alles läßt sich 
compilieren, alles tutti. Schalte ich aber die Interrupts ein - mit 
sei(); - dann führt mein Mega8 ständig einen Reset aus. Vektortablle im 
Headerfile haben ich überprüft , scheint alles richtig zu sein. Kennt 
jemand das Problem. Ich arbeite mit WinAVR (neuste Version) und dem 
AVRStudio.

Danke im voraus für einen guten Tipp.

Thomas

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Analog (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@falk: Danke für den Tipp, aber MCUCR,TIMSK,GICR ist alles richtig 
eingestellt, Vektortabelle stimmt auch. Der gleich Code macht mit einem 
anderen Compiler keinen Reset. Der Reset schein ca. 10ms nach dem Start 
zu sein. WD ist es auch nicht. Fuses stimmen, WD habe ich extra im Code 
nochmal deaktiviert.

Gruß,
Thomas

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Analog (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey Geil. Ich verstehe, Du meinst ich soll solange in eine Glaskugel 
starren, bis ich so hypnotisiet bin, daß der Mega8 keinen Reset mehr 
macht ?

Gruß,
Thomas

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Quelltext als Anhang wäre nicht verkehrt . . .

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein. Beziehe mich da auf den letzten Absatz und erwarte, dass du 
ebendies nicht von uns erwartest.

Autor: Jojo S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gibts auch keine Warnings wegen SIGNAL oder ISR Name? die Namen wurden 
mal geändert und es gab nur Warnings wenn es den Interrupt_xy nicht gab. 
Oder läuft noch ein Timer oder anderer Interrupt für den keine ISR 
existiert?

Autor: Analog (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

void uart0_init(void)
{
 UCSRB = 0x00; //disable while setting baud rate
 UCSRA = 0x00;
 UCSRC = 0x86;
 UBRRL = 0x19; //set baud rate lo
 UBRRH = 0x00; //set baud rate hi
 UCSRB = 0xD8;
}

void putchar1(unsigned char c)
{


        while (!(UCSRA&(1<<UDRE)));
           UDR=c;
}

void main(void) {
char i;

//init_devices();

uart0_init();
cli();


 MCUCR = 0x00;
 WDTCR=0x00;
 GICR  = 0x00;
 TIMSK = 0x00; //timer interrupt sources
 SEI();

i=100;
putchar1(85);
while(1) {
i++;
 putchar1(i);


if (i==120) i=100;


_delay_ms(100);


}
}



Das Programmiert springt nicht mal in die while-Schleife. Es macht einen 
Reset nach der Ausgabe eines "U"s (chr(85)). Es ist nur ein 
Testprogramm.

Gruß,
Thomas

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine bisherigen Informationen reichen nicht aus und Antworten wären 
Wahrsagerei.

Raff' mal zusammen, was du noch zur Problemstellung beitragen kannst: 
Schaltbild, Angaben zu Stromverbrauch und Stabilität der 
Spannungsversorgung, Makefile.

Wenn du Probleme hast den aktuellen Quellcode zu veröffentlichen, dann 
strippe den soweit runter, dass man den ursprünglichen Zweck nicht mehr 
sieht aber trotzdem noch das Problem reproduziert werden kann.

Hast du schon die Schoose im Simulator (AVR Studio) gehabt und treten 
dort ebenfalls Resets auf?

ADD: Im vorhergehenden Code sehe ich keinen einzigen Interrupthandler!

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
????
Du gibst mit sei() die Interrupt frei, obwohl KEINERLEI Interruptroutine 
vorhanden ist?

MfG
Falk

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> SEI();
Erstens ist c Case-sensitiv. Es heißt sei() und nicht SEI(). Zweitens 
hast Du nirgends einen Interrupt Handler stehen. Da Du offensichtlich 
auch keine Interrupts freigegeben hast: Was soll das sei überhaupt 
bewirken?

Autor: Gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo ist denn die Interupt-Routine definiert?

Autor: Analog (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wird das sei(); auskommentiert dann passiert es nicht. Übrigens SEI() = 
makro asm("sei"); . Nicht wundern, daß es groß geschrieben ist. Habe nur 
die wesentlichen Teile gepostet. Der Rest von meinem Programm wird eh 
nicht ausgeführt. Ich habe den Verdacht, das die MCUCR,GICR etc. 
Einstellungen gar nicht ausgeführt werden. Vielleicht ist ein Fehler in 
der Definition des Mega8 vom WinAvr - iom8.h . Kann aber nichts 
entdecken. Vielmehr habe ich auch nicht gehofft, daß man das Problem 
hier löst. Sondern, daß jemand anderes genau das Problem schon mal 
hatte.
Gruß,
Thomas

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt grössere Wunder.
  UCSRB = 0xD8;
schaltet fast alle Interrupts ein die du finden konntest. Aber kein 
einziger davon ist implementiert. Klar dass ohne sei() nix passiert. 
Klar auch dass es mit sei() nicht lang funktioniert.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> _delay_ms(100);
Das geht in die Hose, sobald Deine Taktfrequenz größer ist als 2,62 MHz. 
Aber das nur am Rande...

Autor: Analog (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Gerhard: Das ist ja der Witz, ich habe gar keine definiert. Er scheint 
nach dem sei(); was zu machen. Aber was ????

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Andreas Kaiser:
Oh, das UCSRB hatte ich grad völlig übersehen... Dann ist natürlich fast 
vorprogrammiert, dass es knallt.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Analog wrote:

> Aber was ????

Irgendeinen der Interrupt-Vektoren aufrufen. Weil der mangels 
Interrupt-Handler die Ursache des Interrupts aber nicht beseitigt, hast 
du ein Problem.

Autor: Analog (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Andreas: Das war es , vielen Dank !!!!!!!!!!!!!

Die anderen compiler sind da nicht so , aber ich habe folgenden (leeren) 
ISRs implentiert - kein Reset mehr !

SIGNAL (SIG_UART_RECV)
{

interrupt=1;

cmd=UDR;
UDR=cmd;

    //_inline_fifo_put (&infifo, UDR);
}



SIGNAL(USART_TXC_vect)
{

}

SIGNAL (USART_UDRE_vect)

{

}

Danke nochmal an alle die geantwortet haben.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte nicht SIGNAL verwenden. Das ist veraltet. Nimm ISR. Und nen leeren 
Handler kannste auch mit
EMPTY_INTERRUPT(USART_UDRE_vect);
machen...

Bei anderen Compilern kann es höchstens sein, dass die bei Vektoren, zu 
denen keine Handler existieren, einfach ein reti reinschreiben statt des 
Aufrufs des "bad interrupt"-Handlers, der dann (beim AVR-GCC) 
defaultmäßig einen jump nach 0x0000 macht...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Analog wrote:
> @Gerhard: Das ist ja der Witz, ich habe gar keine definiert. Er scheint
> nach dem sei(); was zu machen. Aber was ????

Nicht nach dem sei()
Beim Auftreten des Interrupts. Der gcc baut einen Default
Interrupt Handler ein, der - man staune - den Prozessor resettet.
Dieser Interrupt Handler kommt defaultmäßig auf alle
Interruptvektoren. Erst wenn du selbst einen Interrupt
Handler implementierst löst der den dafultmaßigen ab.
Da du keinen eigenen Handler hast - tja, Pech für die Kuh Elsa.

Autor: Analog (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Johannes: das mit SIGNAL, ISR habe ich irgendwo gelesen. Mache ich. 
Freue micht total auf die Arbeit mit dem GCC. :) Der Code scheint sogar 
schneller abzulaufen als mit dem gekauften Compiler.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was du natürlich auch machen könntest: Nur diejenigen Interrupts 
einzuschalten und mit sinnvollen Handlern versehen, die du tatsächlich 
benötigst. So macht man das nämlich normalerweise.

Autor: Analog (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@kbucheqq: Verstehe, dann löse ich diesen mit dem Putchar1-Kommando 
selber aus. Und da die ISR - USART_TXC_vect ausgelöst wird , gibt es 
einen default handler jmp 0x0000 oder so ähnlich !? Egal erstmal 
hauptsache es geht jetzt.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Analog wrote:
> @kbucheqq: Verstehe, dann löse ich diesen mit dem Putchar1-Kommando
> selber aus. Und da die ISR - USART_TXC_vect ausgelöst wird , gibt es
> einen default handler jmp 0x0000 oder so ähnlich !?

Ganz genau so ist der Ablauf.
Ich glaub jetzt hat er's.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.