- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 4 von 4

Thema: Grad zu doof für ATMega32 UART (Sendet nur 0x00)

  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    42
    Beiträge
    2.009

    Grad zu doof für ATMega32 UART (Sendet nur 0x00)

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Moin.

    Für ein Projekt sollen mit einem ATMega32 Daten ausgegeben werden.
    Bisher hatte ich mit den UARTs eigentlich nie Probleme; nur dieses Mal seh ich anscheinend den Fehler nicht.

    Wenn ich ein Testprogramm mit Bascom erstelle, erscheinen die gesendeten Daten fehlerfrei am Terminal. Versuch ich das ganze nun in C, erhalte ich am Terminal nur Unmengen 0x00.

    Da es in Bascom geht, schliesse ich einen Hardwarefehler aus => Irgendwo ein Fehler im Code.

    Hab die Teile hier mal angehängt. Sieht dort jemand nen Fehler?

    F_CPU: 8 MHz
    Baud: 9600/8/n/1

    Initialisierung:
    Code:
    void USART_Init(ui32_t baud)
    {
      ui8_t sreg = SREG;
      ui16_t ubrr = (ui16_t) ((ui32_t) F_CPU / (16 * baud) - 1);
      UBRRH = (ui8_t) (ubrr>>8);
      UBRRL = (ui8_t) (ubrr);
      cli();
      UCSRB = (1 << RXEN) | (1 << TXEN);
      UCSRC = (1 << UMSEL) | (1 << UCSZ1) | (1 << UCSZ0);
      do
      {
        UDR;
      } while (UCSRA & (1 << RXC));
      UCSRA = (1 << RXC) | (1 << TXC);
      SREG = sreg;
    }
    Schreibfunktionen:
    Code:
    void USART_PutC_Sync(const ui8_t c)
    { 
      while (!(UCSRA & (1 << UDRE))) 
      {;}
      UDR = c;
    }
    
    void USART_PutS_Sync(const char *s)
    {
      do
      {
        USART_PutC_Sync(*s);
      } while (*s++);
    }

    Testprogramm:
    Code:
    USART_Init(9600);
    while(1)
    {
      USART_PutS_Sync("Test\r\n");
      _delay_ms(1000);  
    }

    mfG
    #ifndef MfG
    #define MfG

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.685
    Sorry, bin grad auf dem Sprung ins Dorf - aber was soll das "cli();" - das ja nicht wieder freigegeben wird. Ist die Übertragung interruptgesteuert?
    Ciao sagt der JoeamBerg

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    42
    Beiträge
    2.009
    Die durch cli() abgeschalteten Interrupts werden durch die Anweisung "SREG = sreg" wieder aktiviert (sofern sie davor aktiviert waren).
    Das Senden soll synchron, also ohne Interrupts erfolgen.

    Ein Test, in dem das Senden aus einem FIFO-Puffer heraus per Interrupts gesteuert wird, bringt ebenfalls nur 0x00.
    (Hier wird das zu sendende Datenbyte auch nur in UDR geschrieben.)

    Das Problem ist also unabhängig von der Art, wie gesendet wird.
    #ifndef MfG
    #define MfG

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    55
    Beiträge
    524
    Hallo,

    hast du im Simulator mal ubrr geprüft?
    Mir fällt es schwer deinen Code zu kompilieren

    Gruß

    Jens

Berechtigungen

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

Solar Speicher und Akkus Tests