Forum: Compiler & IDEs UART Interrupt ATMEGA32


von Sebastian (Gast)


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

von Karl heinz B. (kbucheg)


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.

von Sebastian (Gast)


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

von Stefan (Gast)


Lesenswert?

Das Echo machst du hier "händisch" in der main()
1
    while (!(UCSRA & (1<<UDRE)));
2
    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-Tutorial#Der_UART
http://derjulian.net/pages/mikrocontroller/?page=mikrocontroller#usart

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...

von Sebastian (Gast)


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

von Stefan (Gast)


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.

von Sebastian (Gast)


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

von Karl H. (kbuchegg)


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.

von Sebastian (Gast)


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

von Karl H. (kbuchegg)


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.


von Sebastian (Gast)


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

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.