ATMega8 USART und PortExpander

Dieses Thema im Forum "Software" wurde erstellt von Hero_123, 20. November 2018.

Schlagworte:
  1. Hero_123

    Hero_123 Mitglied

    Registriert seit:
    17. September 2010
    Beiträge:
    33
    Zustimmungen:
    0
    Punkte für Erfolge:
    6
    Sprachen:
    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:

  2. Mikro23

    Mikro23 Mitglied

    Registriert seit:
    2. Januar 2017
    Beiträge:
    274
    Zustimmungen:
    21
    Punkte für Erfolge:
    18
    Sprachen:
    C, Assembler


    CodeBox C und 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.
     
  3. Hero_123

    Hero_123 Mitglied

    Registriert seit:
    17. September 2010
    Beiträge:
    33
    Zustimmungen:
    0
    Punkte für Erfolge:
    6
    Sprachen:
    C
    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:

  4. Mikro23

    Mikro23 Mitglied

    Registriert seit:
    2. Januar 2017
    Beiträge:
    274
    Zustimmungen:
    21
    Punkte für Erfolge:
    18
    Sprachen:
    C, Assembler
    Hallo Hero_123
    Somit weißt Du nicht, ob der Puffer nicht ständig überläuft und andere wichtige Daten überschreibt.
    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.

    µ
     
  5. Hero_123

    Hero_123 Mitglied

    Registriert seit:
    17. September 2010
    Beiträge:
    33
    Zustimmungen:
    0
    Punkte für Erfolge:
    6
    Sprachen:
    C
    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

    Unsere immer weiter wachsende Community beschäftigt sich mit Themenbereichen rund um Mikrocontroller- und Kleinstrechnersysteme. Neben den Themen Design von Schaltungen, Layout und Software, beschäftigen wir uns auch mit der herkömmlichen Elektrotechnik.

    Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  • Coffee Time

    Unser makerconnect-Team arbeitet hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und unser eigener makerconnekt-Server regelmäßig gewartet wird. Wir nehmen das Thema Datensicherung und Datenschutz sehr ernst und sind hier sehr aktiv, auch sorgen wir uns darum, dass alles Drumherum stimmt!

    Dir gefällt das Forum und die Arbeit unseres Teams und du möchtest es unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft, unser Team freut sich auch über eine Spende für die Kaffeekasse :-)
    Vielen Dank!
    Dein makerconnect-Team

    Spende uns! (Paypal)
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren und die Seite optimal für dich anzupassen. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden