mikrocontroller.net

Forum: Compiler & IDEs UART Interrupt ATMEGA32


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Habe ein Problem mit dem UART Interrupt, er löst einfach nicht aus :)

Muss ich da noch irgendwas beachten?


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


ISR (USART_RXC_vect)
{

PORTA = 0x55;

}


So sieht die Interruptroutine aus. Der µC empfängt auch definitiv 
Zeichen (ich sende Sie als Echo wieder an den PC zurück).. aber PORTA 
reagiert einfach nicht (ja, er ist als Ausgang geschaltet).

Wo steckt der Anfängerfehler?

M f G
Sebastian

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wo steckt der Anfängerfehler?

Darin, dass du uns nichtssagende Codeschnipsel
zeigst anstatt das richtige Program.

> ich sende Sie als Echo wieder an den PC zurück

Mit dem oben gezeigten definitiv nicht.
Wenn du am PC siehst was du tippst, dann hast du wahrscheinlich
das lokale Echo am PC aktivierst. Wenn dem so ist, dann sagt
das überhaupt nichts darüber aus, ob der µC die Zeichen
empfängt oder nicht.

Ergo: Poste dein Program und nicht irgendwelche Codeschnipsel
die so ähnlich aussehen wie dein Program. Du gehst ja auch
selber zum Artz und schickst nicht deinen Bruder. Auch wenn
der so ähnlich aussieht wie du.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define F_CPU 4336180
#define UART_BAUD 9600

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


ISR (USART_RXC_vect)
{
  PORTA = 0x55;
}



void usart_init(void)
{
    UBRRH  = 0;                             // Highbyte ist 0
   UBRRL = (F_CPU / (16UL * UART_BAUD)) - 1;
  UCSRB |= ( 1 << TXEN )|( 1 << RXEN);          // UART TX einschalten
  UCSRC |= ( 1 << URSEL )|( 1<<UCSZ0 )|( 1<<UCSZ1 )|( 0<<UCSZ2 );  // 
Asynchron 8N1
   DDRA = 0xff;
}



int main (void)

  {
    char a;

    usart_init ();
    sei();

  for (;;)
  {
    while (!(UCSRA & (1<<RXC)));
    a = UDR;

    if (a == 'a')      //wenn 'a' dann PORTA = 03h
      {
      PORTA = 0x03;
      }
    if (a == 'b')      //wenn 'b' dann PORTA = 00h
      {
      PORTA = 0x00;
      }
    while (!(UCSRA & (1<<UDRE)));
    UDR = a;
  }
}




So sieht das ganze Programm aus. Es ist kein lokales Echo am PC was ich 
da empfange...
Noch was: wenn ich ein Programm auf den µC lade scheint es erstmal nicht 
zu  laufen. Dann lese ich mit PonyProg die Config. Bits aus und es 
läuft. auch nach Abschalten der Betriebsspannung ist alles OK.. nur muss 
ich halt einmal nach dem Brennen diese Bits auslesen um ihn anzustoßen.

Sebastian

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Echo machst du hier "händisch" in der main()
    while (!(UCSRA & (1<<UDRE)));
    UDR = a;

Wenn die Interruptroutine zum Zug kommen soll, musst du die auch 
anschalten. Dazu gibt es das Flag RXCIE im UART Register UCR bzw. UCSRB 
auf deinem Atmega32
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...
http://derjulian.net/pages/mikrocontroller/?page=m...

Wenn die Interruptroutine dann arbeitet, werden mit 0x55 bestimmte Pins 
an PORTA (der auf Ausgang geschaltet ist s. DDRA = 0xFF) auf HIGH andere 
auf LOW gelegt. Möglicherweise zum Debuggen mit LEDs...

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank, Stefan.. habe gar nicht gewusst, dass es ein RXCIE Bit 
gibt... bin davon ausgegangen, dass man nur den globalen Interrupt 
freigeben muss.
Klappt nun alles!(Außer dass er irgendwie nicht von alleine anläuft nach 
dem Brennen).

M f G
Sebastian

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie äussert sich das bzw. was musst du machen, damit der µC losläuft?

Wenn du z.B. den ISP abziehen musst, tippe ich, dass es etwas mit dem 
/RESET oder einer schwachbrüstigen Spannungsversorgung zu tun hat. Macht 
es beim Losstarten nach ISP einen Unterschied, ob du den RS232 Stecker 
dran hast oder nicht?

Für genaueres Spekulationen ;-) müsste man halt mehr zur Hardware 
wissen.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
man, hier wird man ja richtig geholfen :)
Wenn ich den ISP Stecker abziehe klappts. Ich tausch mal C, der den 
Resetpin auf Masse zieht beim Einschalten.

Die Spannungsversorgung besteht aus einem "normalen" stabilisierten 12V 
Steckernetzteil (1A). Auf der µC Platine ist dann nochmal ein 7805 und 
ein 22µF. Hat bisher auch nie Probleme gemacht.

M f G
Sebastian

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

Bewertung
0 lesenswert
nicht lesenswert
> Wenn ich den ISP Stecker abziehe klappts. Ich tausch mal C, der den
> Resetpin auf Masse zieht beim Einschalten.

Du verwendest nicht zufällig Windows XP und einen selbst
gebauten 3 Widerstand-Programmer am Parallel-Port?

Das hab ich auch. Allerdings ist es definitiv Windows, dass
sich nach ein paar Sekunden von PonyProg die parallele Schnitt-
stelle wieder holt und dabei den µC auf RESET zieht.

Ist ne zeitlang lästig. Zumindest solange, bis ich einen
Bootloader in den µC gebrannt hatte. Seitdem kümmert es
mich nicht mehr.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, selbstgebaut habe ich da nichts, aber besonders aufwendig siehts 
nicht aus (74244, 1C, 1 Diode, 1 R).
Ja, habe XP, ja es hängt am Parallelport.

Was ist denn ein Bootloader genau? Werde mal die Suche bemühen.

Sebastian

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

Bewertung
0 lesenswert
nicht lesenswert
> nicht aus (74244, 1C, 1 Diode, 1 R).
> Ja, habe XP, ja es hängt am Parallelport.

Könnte dasselbe Problem sein.
Kannst ja mal nachmessen.
Nach dem brennen dauerts bei mir so 3 bis 4 Sekunden.
Dann zieht XP den Reset Pin auf 0. Lässt sich mit
einem Voltmeter wunderbar nachmessen.

Bootloader:
Ich verwende den von PeDa aus der Codesammlung.
Kurz gesagt: Das ist ein Pgm dass du auf herkömmlichen
weg in den µC brennst. Dann noch ein paar Fuse-Bits umstellen.
Das Pgm wartet nach einem Controller Reset ein bischen, ob
über die Serielle Schnittstelle etwas hereinkommt. Wenn
ja (und wenn die Kennung stimmt) wird das was herein
kommt als Programm aufgefasst und ins Flash-RAM geschrieben.
Das ist im Grunde das, was auf µC Seite passiert.
Auf PC Seite gibt es ein Programm, dass dein µC Programm
über die Serielle Schnittstelle verschickt.

Der Ablauf ist dann so:
PC und µC über die ganz normale serielle Schnittstelle
verbinden. Am PC wird das Übertragungspgm mit den entsprechenden
Parametern gestartet. Den µC resetten (entweder Taster oder
Strom aus/Strom ein) und schon überspielt der PC das Pgm
zum µC. Fertig. Eine eigene Brennhardware ist nicht mehr
notwendig.


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Das Reset Problem hat sich erübrigt. Muss nur auf den gelben Pfeil in 
Pony Prog clicken, dann läufts an...

M f G
Sebastian

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.