PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ausgabe mit rs232



Palmer
09.03.2008, 21:08
Hallo,
ich würde gerne über rs232 auf den Bildschirm etwas ausgeben lassen(irgend welche Werte oder Texte), doch es klappt nicht (bin in solchen Sachen noch ein Anfänger und benutze avrstudio4, c-Sprache).
Mit printf geht es gar nicht, hab auch schon im AVR-GCC Tutorial geschaut.
Kennt jemand eine Lösung?

MfG
Palmer

Reeper
09.03.2008, 21:29
Es gibt doch sehr viele Threads darüber...

Hier eine Möglichkeit:

für char:

void zeichen_senden(char zeichen)
{
while (!(UCSRA & (1<<UDRE)));
UDR = zeichen;
}

für string:

void string_senden(char *string)
{
while (*string)
{
while (!(UCSRA & (1<<UDRE)))
{}
UDR = *string++;
}
}

Init für Atmega 32:

void usart_init(void)
{
/* Baudrate: 115200*/
UBRRH = 0;
UBRRL = 7;
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}

Gruß
Stefan

Palmer
09.03.2008, 21:57
Hallo,
danke schon mal für die schnelle antwort, aber es funktioniert nicht wirklich, oder stell ich mich zu blöd an (ich verwende das rn controller board mit atmega 32).
Als Programm benutze ich HTerm und ich weiß, dass meine Baud-Rate immer auf 9600 war,doch es scheint nichts anzukommen. Gibt es keinen einzigen Befehl wie "print" oder so Ähnliches?

Reeper
09.03.2008, 23:25
@ Palmer

Die Init musst du natürlich nach Datenblatt (oben für 115200 !) anpassen oder allgemein:


#define UBRR_BAUD ((F_CPU/(16L*BAUD))-1)
#define BAUD 115200UL

void usart_init(void)
{
UBRRH = (uint8_t) (UBRR_BAUD>>8);
UBRRL = (uint8_t) (UBRR_BAUD & 0xFF);
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}

In main dann einfach nur noch für ein Zeichen senden zB.: "zeichen_senden('x');" und für einen string: "string_senden("Hallo");"

oberallgeier
10.03.2008, 08:40
Hi, Palmer,

für meinen mega168 (beispielsweise) verwende ich folgenden Code in (m)einer header-Datei:


/* ================================================== ============================ */
/* Initialisiere USART0 mit vorgegebener Baudrate Neu am 07jan2008
Zum Senden von Zeichen im Hauptprogramm entweder nach doc2545, S179
char irgendwas[] = "meintext";
sendUSART(irgendwas); oder direkt
sendUSART("meinText"); verwenden. */
void init_USART0( unsigned int ubrr )
{
UBRR0H = (unsigned char)(ubrr>>8); // Set baud rate
UBRR0L = (unsigned char)ubrr;
UCSR0B = (1<<RXEN0)|(1<<TXEN0); // Enable receiver and transmitter
UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00); // 8 Data, (async: UMSELnx empty, doc S193)
// no parity weil UPMn1:0 empty, 1 Stop, weil UPMn1:0 empty
}
/* ================================================== ============================ */
// ------------------------------------------------------------------
void sendchar(unsigned char c)
{
while(!(UCSR0A & (1<<UDRE0))) //Warten, bis Senden möglich ist
{
}
UDR0 = c; //schreibt das Zeichen aus 'c' auf die Schnittstelle
}
/* ================================================== ============================ */
void sendUSART(char *s) // *s funktiniert wie eine Art Array - auch bei
// einem String werden die Zeichen (char) einzeln ausgelesen - und auf die
// Sendeschnittstelle übertragen
{
while(*s)
{
sendchar(*s);
s++;
}
}
/* ================================================== ============================ */

Im main werden diese Schnippsel wie folgt angesprochen (Nachtrag beachten!!):


#define MCU = AVR_ATmega168

// Mit Quarz 20 Mhz-CPU
#define F_CPU 20000000
#define BAUD 56000
#define MYUBRR (unsigned int)(F_CPU/16/BAUD-1) //nach doc2545, S 179

/* ================================================== ============================ */
.
.
.
// hier folgen div. Initialisierungen sowie >>>>> hier Nachtrag!!!

init_USART0(MYUBRR); //USART0 initialisieren mit wählbarer Baudrate (s.o.)

// evtl. weitere Initialisierungen ....



Die Textausgabe geht - beispielsweise - so:


sendUSART("FLEX168/20MHz mit SFH415-37,0kHz und SFH5110-36\r\n");
sendUSART("Code irDMEm168-x24.c 27feb08 23:38ff");

Als Beispiel für eine Datenausgabe: den Wert mecho gebe ich damit so aus:


// Natürlich müssen die Variablen definiert werden - entweder lokal
// oder global (auch dies nur beispielhaft)

uint8_t mecho = 50;
char wortadc[10];


mecho = istaus / 10;

utoa(mecho, wortadc, 10);
sendUSART("\tAR \t"); //aktuellen Rampensteuerwert ausgeben
sendUSART(wortadc);sendUSART("\r\n"); // Meldung ausgeben

Vielleicht hilft Dir dies etwas weiter. Für Deine Anwendung musst Du natürlich einmal den Prozessortakt anpassen, der Name des Prozessors gilt nur für meine Anwendung, dem von mir verwendeten Prozessortyp entsprechen die Kommentare/Hinweise auf die Dokumentationsstellen, und, ganz wichtig, Du musst die Baudrate einstellen, die Deinem Problem und Deiner Sende- und Empfangshardware entspricht. Aufpassen: Wenn Du keinen Quarz verwendest, oder - wie ich - einen, der nicht für USART-Zwecke optimiert ist (das sind dann ziemlich krumme Werte), kann beim Einstellen der Baudrate durch die Ganzzahligkeit des Wertes ein Fehler auftreten, der von der Hardware (beispielsweise Deiner RS232 am PC) nicht mehr verdaut wird. Dazu such mal ein bisschen nach den entsprechenden Fehlertabellen in Abhängigkeit vom Quarztakt.

Nachtrag am 10.03.08, 19:23 im Codestück "main". Sorry, hatte diese Initialisierung vergessen.

carlitoco
10.03.2008, 13:48
Sehr schön das ich den Threat finde habe
hier (https://www.roboternetz.de/phpBB2/viewtopic.php?t=38756) ganz ähnliche sachen vor ...

also werd das mal schön lesen

grüße * wenn jemand tipps hat wäre ich dafür sehr dankbar !

izaseba
10.03.2008, 17:27
Gibt es keinen einzigen Befehl wie "print" oder so Ähnliches?

Natürlich gibt es die Möglichkeit printf zu benutzen sehe hier (http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Die_Nutzung_von_printf)
Es muß einfach nur die Ausgabe entsprechend auf UART "umgebogen" werden...
Es stellt sich nur die Frage, ob der Aufwand lohnt...
Auf einem M16,32,128 dürfte es egal sein, aber auf kleineren µC würde ich nicht unbedingt die stdio.h einbinden wollen und eher den schon oben gezeigten Weg gehen.

Gruß Sebastian

Palmer
12.03.2008, 14:48
Hallo Leute,

nach ein paar einstellung hat es dann geklappt, ich empfang jetzt alles, was ich ihm eingebe.
Mal ne Frage: wovon hängt eigentlich die Baudrate ab (Hardware, Software)?

MfG
Palmer