Forum: Mikrocontroller und Digitale Elektronik Probleme mit UART


von Marcel (Gast)


Lesenswert?

Hallo, wollte eine UART bei einem ATMega8 einrichten und bin nachdem 
Tutorial auf der Hauptseite geangen. Das senden eines Zeichens klappt 
auch Problemlos,  jedoch will das Senden einer Zeichenkette nicht, da 
ich nur irgendwelche kryptischen Zeichen empfange.
Mein Code währe folgender:

#include <avr/io.h>

#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 
12000000"
#define F_CPU 12000000L    // Systemtakt in Hz, das L am Ende ist 
wichtig, NICHT UL verwenden!
#endif

#define BAUD 9600L          // Baudrate, das L am Ende ist wichtig, 
NICHT UL verwenden!

// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille

#if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu 
hoch!
#endif


void putc(char c)
{
  while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich 
*/
  {
  }

  UDR = c;                    /* schreibt das Zeichen x auf die 
Schnittstelle */
}

void puts (char *s)
{
    while (*s)
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
        putc(*s);
        s--;
    }
}

int main(void)
{

  UCSRB |= (1<<TXEN);                // UART TX einschalten
  UCSRC |= (1<<URSEL)|(3<<UCSZ0);    // Asynchron 8N1

  UBRRH = UBRR_VAL >> 8;
  UBRRL = UBRR_VAL & 0xFF;

  puts('Hallo');

  return 0;

}

Wo ist das Problem?

von Steffen K. (steffen3)


Lesenswert?

versuch doch mal
1
void puts (char *s)
2
{
3
    while (*s)
4
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
5
        putc(*s);
6
        s++;
7
    }
8
}

von Marcel (Gast)


Lesenswert?

So hatte ich es vorher, klappte jedoch auch nicht.

von David M. (md2k7)


Lesenswert?

Das Problem liegt hier:
1
  puts('Hallo');

In C werden in einfache Anführungszeichen '' einzelne Zeichen 
eingeschlossen 'a'. Ein String wird durch doppelte Anführungszeichen 
"Hallo" dargestellt. Daraus wird/das entspricht einem char-Array {'H', 
'a', 'l', 'l', 'o', '\0'}

P.S. bei der Ausgabe musst du in der Schleife natürlich den Pointer 
erhöhen, also s++

von Marcel (Gast)


Lesenswert?

Argh, verdammter Pascal-Syntax. Danke dir.

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.