- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 17

Thema: USART Problem Atmega32

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    19.12.2009
    Beiträge
    30

    USART Problem Atmega32

    Hallo zusammen,

    ich versuche schon seit einer Weile die Usart-Verbindung von meinem Atmega32 über das MySmartUsb MK2 auf die Reihe zu bekommen. Zum empfangen/senden benutze ich das HyperTerminal. Das was der Atmega sendet empfange ich auch, allerdings kann ich nichts an den Atmega senden da er offenbar aus der Lesefunktion rausspringt. Hier mal meine Einstellungen zwecks Baudrate und Lesefunktion(diese hab ich zugegeben aus der Asuro lib "geklaut").

    Code:
    #include <avr/io.h>
    
    #ifndef MCU
    #define MCU atmega32
    #endif
    
    #ifndef F_CPU
    #define F_CPU 16000000
    #endif
    
    #include <util/delay.h>
    
    #define USART_BAUD_RATE 9600
    #define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16L)-1) 
    
    void SerRead (
      unsigned char *data,
      unsigned char length,
      unsigned int timeout)
    {
      unsigned char i = 0;
      unsigned int  time = 0;
      UCSRB = (1<<RXEN);                         // Empfaenger einschalten
      if (timeout != 0)
      {
        /*
          Die Funktion wird auf alle Faelle, auch ohne empfangene Daten, wieder
          verlassen. --> nonblocking mode
        */
        while (i < length && time++ < timeout)
        {
          if ((UCSRA & (1<<RXC)))
          {
            data [i++] = UDR;
            time = 0;
          }
        }
        if (time > timeout)
          data [0] = 'T';
      }
      else
      {
        /*
          Die Funktion wird auf alle Faelle erst nach dem Empfang von der
          vorgegebenen Anzahl Zeichen verlassen. blocking mode
        */
        while (i < length)
        {
          while(!(UCSRA & (1<<RXC)));
            data [i++] = UDR;
        }
      }
    }
    
    int main()
    {
     unsigned char data[4];
    
    UBRRH = (unsigned char) (USART_BAUD_SELECT>>8);
    UBRRL = (unsigned char) USART_BAUD_SELECT; 
    UCSRB = (1 << RXEN) | (1 << TXEN); 
    UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0); 
    
    SerRead(data, 2, 0);
    //...weiterer Code
    }
    Schreibe ich in die letzte while-Schleife der SerRead-Funktion rein, dass bei jedem Durchlauf/bei jeder Abfrage eine "hallo" gesendet wird, werd ich "zugespammt". Wenn ich das nicht tue, wird einfach der weitere Code ausgeführt und nichts gelesen.

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Zitat Zitat von neo98 Beitrag anzeigen
    [...]
    Code:
      {
        /*
          Die Funktion wird auf alle Faelle erst nach dem Empfang von der
          vorgegebenen Anzahl Zeichen verlassen. blocking mode
        */
        while (i < length)
        {
          while(!(UCSRA & (1<<RXC)));
            data [i++] = UDR;
        }
    Da ist der Fehler: In der While-Schleife prüfst du, ob das RXC-Bit NICHT (!!!) gesetzt ist, du möchtest eigentlich das Gegenteil machen (Abbruch wenn das Bit gelöscht ist, sonst weitermachen).

    mfG
    Markus

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    19.12.2009
    Beiträge
    30
    Ich würde sagen dass das so richtig ist. Hast du das ';' hinter der Schleife gesehen? (Der Code ist falsch eingerückt) Die Schleife wird solang ausgeführt bis RXC gesetzt ist. Steht auch so in der Doku...

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Mea culpa, du hast recht. Das kleine Semikolon habe ich doch glatt übersehen. Später gehe ich den Code nochmal durch, jetzt ist erstmal Klausur schreiben angesagt.

    mfG
    Markus

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Ich kann in dem Code keinen Fehler erkennen, ABER: SerRead schreibt den Wert von UCSRB neu (und macht dabei den Transmitter aus). Evtl. gibt es in anderen Codeteilen ähnliche Seiteneffekte.

    mfG
    Markus

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.06.2011
    Ort
    Dresden
    Beiträge
    219
    Hallo,
    in main() ist beim serread-aufruf das timeout auf 0 gesetzt ?!
    mein Compiler würde auch in dem Ausdruck while (i < length && time++ < timeout) ein paar Klammern anfordern,
    aber das ist wohl von Compiler zu Compiler unterschiedlich.
    mfg
    Achim

Ähnliche Themen

  1. UART/USART vom ATMega32 will einfach gar nicht
    Von Bamboocha im Forum C - Programmierung (GCC u.a.)
    Antworten: 8
    Letzter Beitrag: 04.06.2010, 11:21
  2. USART atmega32 mit Interrupt
    Von walterk im Forum C - Programmierung (GCC u.a.)
    Antworten: 12
    Letzter Beitrag: 07.12.2009, 12:14
  3. Software USART (bzw. RS232) ATMEGA32
    Von Sprengi im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 24.07.2009, 23:07
  4. ATMega32 USART Problem
    Von dEx82 im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 18.07.2009, 17:08
  5. Atmega32 Offset-Problem, Empfang von Nachrichten via USART
    Von buthus im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 17.04.2007, 12:46

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test