ATMega8 USART und PortExpander

Hero_123

Mitglied
17. Sep. 2010
183
3
18
Sprachen
  1. ANSI C
Hallo

Ich habe ein Problem mit der Initialisierung des USART bei meinem ATMega8.
Zu meiner Hardware:
Ich habe einen ATMega8 an dem ein PortExpander PC9555 angeschlossen ist, an diesem hängt eine 7-Segment Anzeige mit 6 Segmenten (diese werden vom PCA9555 angesteuert - ein 74LS138 für die Transistoren und ein 74HC5411für die Anzeigen).
Am ATMega8 sind auch 2 Potis an den ADC Eingängen angeschlossen, benutzt wird nur 1 Kanal.

Initialisiere ich den USART mit "UCSRB = (1 << RXEN)|(1 << TXEN)|(1 << RXCIE);" läuft der ATMega8 völlig problemlos, wenn ich NICHT den PortExpander und die 7-Segmentanzeige benutze - ich kann problemlos Daten zwischen PC - ATMega8 austauschen mit 38400 Baud. Der ATMega8 macht auch keine sporadischen Neustarts. Einlesen der ADC und Ausgabe am PC fkt problemlos.

Initialisiere ich den USART mit "UCSRB = (1 << RXEN)|(1 << TXEN)|(1 << RXCIE);" läuft der ATMega8 NICHT problemlos, wenn ich den PortExpander und die 7-Segmentanzeige benutze. Der ATMega8 macht sporadische Neustarts (der Watchdog ist nicht aktiv, sondern wurde auskommentiert) - erkennbar daran, dass die LED an PORTD PD5 sporadisch aufleuchtet, die LED an PORTD PD6 geht aus (wenn sie vorher aktiviert worden war.
Die Initialisierung des ATMega8 dauert sehr lange (mind. 20 sek), bis die Anzeige des Analogwertes (Poti an Kanal 0) erscheint.

Wenn ich aber beim USART "UCSRB = (1 << RXEN)|(1 << TXEN)|(1 << RXCIE);" auskommentiere und nur "UCSRB = (1 << RXEN)|(1 << TXEN);" habe, dann fkt der ATMega8 wie gewohnt - die Initialisierung erfolgt
sofort, es gibt keine Neustarts - auch wenn der PortExpander und die 7-Segmentanzeige aktiv sind; Datenaustausch PC - ATMega8 ist problemlos und korrekt.

Anbei mein Programm; es wäre schön wenn jemand wüßte, was da den ATMega8 so
"durcheinander" bringt; vor allem wüßte ich gerne, warum der ATMega8 einen
Neustart macht, wenn ich beim USART (1 << RXCIE) mache und der PortExpander "mitarbeitet"...

mfg

Hero_123
 

Anhänge

  • _atmega8_pe_7_seg_ADC_01.c
    15,1 KB · Aufrufe: 6
Anbei mein Programm


CodeBox C
ISR(USART_RXC_vect) {                       /* USART RX interrupt */
   c = UDR;                               /* schreib, was in UDR steht, in die Variable c */
   usart_putc(c);                           /* Ausgabe, wenn was reinkommt */
   if((rec_count < buf)||(c !='e')) {       /* solange Zaehler < 8 */
       rec_buf[rec_count] = c;               /* speicher den eingelesenen Wert im Char-Buffer */
       rec_count++;                       /* zaehle um 1 weiter */
       /*   if(c =='\n') rec_count = 8;*/
   }
   if((rec_count == buf)||(c== 'e')) {       /* wenn Zaehlwert = 8 */
       rec_buf[rec_count] = '\0';           /* Null-Zeichen fuer String-Ende */
       rec_flag = 1;                       /* Eintrag fertig! - setze Empfangs-Flag = 1*/
   }
}

rec_count wird nie auf null gesetzt.

Nachdem ich feststellte, daß nicht konsequent zwischen Variablen und Konstanten unterschieden wird, habe ich etwas die Lust verloren, weiterzusuchen. (In C ist es üblich alle Variablen klein und alle Konstanten groß zu schreiben. (buf ist als Konstante definiert))

PS: Ein Schaltplan wäre für die Fehlersuche sehr hilfreich.
 
Hallo Mikro23

Vielen Dank für Deine Hilfe.
Die Variable "rec_count" wird später im Hauptprogramm (nach Empfang der Daten) wieder zurückgesetzt; diesen Empfangs- und Auswerteteil habe ich noch nicht implementiert.
Ich weiß, dass es üblich ist, Konstante in C groß zuschreiben und ich habe es auch fast durchgängig gemacht - bis auf die 2 "buf" und "basis" (wobei "basis" auch erst später verwendet wird im Hauptprogramm (noch nicht implementiert).

Schaltpläne:
Der ATMega8 sitzt auf einem "myAVR Board MK2" (auf diesem ist auch ein "mySmart USB"), der PortExpander ist ein "myTWI PortExpander" und die 7-Segmentanzeige ein "my7-Segment Add-On" (alles von www.myavr.de). Die Verschaltung steht im Kommentar meines Programms.

Pläne mit reinstellen - ich weiß nicht, ob ich eine Kopie der Pläne (aus den techn. Beschreibungen der Platinen von myavr.de) ohne Genehmigung von SiSy Solutions GmbH ins Netz stellen darf - deshalb der
link auf www.myavr.de.

Anbei nochmals mein Programm, bei dem die Konstanten (hoffentlich alle jetzt) in Großbuchstaben geschrieben sind.

mfg
Hero_123
 

Anhänge

  • _atmega8_pe_7_seg_ADC.c
    15,2 KB · Aufrufe: 1
Hallo Hero_123
Die Variable "rec_count" wird später im Hauptprogramm (nach Empfang der Daten) wieder zurückgesetzt; diesen Empfangs- und Auswerteteil habe ich noch nicht implementiert.
Somit weißt Du nicht, ob der Puffer nicht ständig überläuft und andere wichtige Daten überschreibt.
Die Verschaltung steht im Kommentar meines Programms.
Habe ich gesehen, das ist schon ok, aber wenn das mein Projekt wäre, hätte ich mir selbst einen Schaltplan gezeichnet, in dem alle unwichtigen Teile der Fertigprodukte weggelassen wären (selbstgemacht darf man hochladen), schon allein als Übersicht, ob ich alles berücksichtigt habe. Wenn Du das alles im Kopf kannst, umso besser. Dann kannst Du selbst nachprüfen, ob alles richtig angeschlossen ist.

Bevor ich einen Fehler im Programm suchen würde, würde ich überprüfen, ob alle Komponenten so verbunden sind, wie im Schaltplan beabsichtigt (auf Sicht und ggf mit einem kleinen Testprogramm für die jeweilige Komponente). Was ist alles am Reset-Pin angeschlossen? Was kann sonst noch einen Reset auslösen? Was gibt es für mögliche Interruptquellen?

Hast Du das Programm am Stück geschrieben oder vorher einzelne Funktionen getestet? Die zweite Methode würde ich vorziehen.

Einige Teile sehen kopiert aus. Ist kein Problem, das mache ich auch gelegentlich. Die USART-Funktionen von Peter Fleury z.B. Die sind 1000fach getestet und lassen sich leicht an eigene Bedürfnisse anpassen, nicht nur für tinies und megas, auch für xmegas (auch wenn da etwas mehr zu ändern ist).

Wenn es Dir mehr ums Lernen geht, ist selbstschreiben sicher angebracht. Dann würde ich die UART-Funktionen aber erst mal unabhängig vom Rest des Programms testen.

µ
 
Hallo Mikro23

Vielen Dank für Deine Hilfe.

Ich habe den Fehler gefunden - in der "ISR(USART_RXC_vect)" war ein Aufruf "usart_putc(c);" (direkt nach dem Empfang der Daten " c = UDR;") - und dieser Aufruf hat die per Interrupt empfangenen Daten sofort wieder raus geschrieben - und damit den ATMega8 so "durcheinander" gebracht, dass er sporadisch Neustarts machte bzw zum Initialisieren ewig lange benötigte.

Ich habe den Aufruf "usart_putc(c)" raus genommen - und das Programm/ATMega8 macht was es/er soll :), d.h ich initialisiere den USART mit "UCSRB = (1 << RXEN)|(1 << TXEN)|(1 << RXCIE) - wie gewollt!

Schaltpläne - ja, ich habe natürlich Skizzen, wie die Verschaltung usw aussieht, habe aber nicht daran gedacht, diese Skizzen zur Verfügung zu stellen - das nächste Mal weiß ich Bescheid ;)

Ich habe schon einzelne Funktionen getestet - hat ja alles fkt, bis ich die USART-Funktionalitäten implementiert habe - da hat es die geschilderten Probleme gegeben.

Was das Drollige ist - diese USART-Funktionalitäten habe ich schon bei einem anderen Projekt verwendet - und da gab es keine Probleme (war allerdings nur Senden und Empfangen von Daten mittels Hterm).

mfg

Hero_123
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)