PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ausgabe über COM



alecs
01.12.2005, 10:23
Hallo,

ich wollte mit "printf("meine Ausgabe");" eine Mitteilung über die COM-schnittstelle am RN Control schicken, jedoch wird leider nix ausgegeben.

Was muss ich beachten ? Die Com ist ok, in BASCOM funktioniert alles...

Danke

askazo
01.12.2005, 11:11
Die printf-Funktion spricht in C nicht automatisch die UART-Schnittstelle an.
Du kannst aber wohl mit fdevopen() definieren, dass printf auf die UART schreibt. Die Funktion, die ein Zeichen an die UART ausgibt, musst Du aber dann noch selber implementieren.

Hier mal ein bißchen Code wie's eventuell funktionieren könnte. Ich hab's allerdings selber noch nicht ausprobiert.


int uart_putchar(char c)
{

if (c == '\n')
uart_putchar('\r');
loop_until_bit_is_set(UCSRA, UDRE);
UDR = c;
return 0;
}

int main(void)
{
ioinit(); //Schnittstelle initialisieren
fdevopen(uart_putchar, NULL, 0);
printf ("Hello World");
return 0;
}


Gruß,
askazo

askazo
01.12.2005, 12:13
Hab's jetzt mal getestet.
Das funktioniert so!

Gruß,
askazo

alecs
02.12.2005, 23:12
Hallo, bei mir funktioniert es leider nicht, ich bekomme auch den Compilerfeher:

undefined reference to `ioinit'

also, er kennt die ioinit nicht... welche include benötige ich ?

Danke


Alecs

SprinterSB
02.12.2005, 23:45
Gar keines, ioinit() implementierst du selber und nimmst die Initialisierungen vor, die du brauchst. Oder nimmst ein ioinit von jemand anderem, welches das tut was du brauchst.

ioinit ist keine vordefinierte Funktion, du kannst die genausogut hamsterrad nennen.

alecs
03.12.2005, 12:54
also ich hab nun folgendes Programm:


#include <../avr/include/io.h>
#include <../avr/include/stdio.h>

#define USART_BAUD_RATE 9600
#define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16L)-1)

int uart_putchar(char c);

int uart_putchar(char c)
{

if (c == '\n')
uart_putchar('\r');
loop_until_bit_is_set(UCSRA, UDRE);
UDR = c;
return 0;
}

int main(void)
{
int zeichen;
fdevopen(uart_putchar, NULL, 0);
zeichen=printf("Hallo Welt");
printf(" enthaelt %d Zeichen\n",zeichen); //10 Zeichen
return 0;
}


doch leider kommt keine Ausgabe über die COM :(

was ist da falsch, es kommen keine Fehler beim compilieren!!!

skillii
03.12.2005, 17:18
Dir fehlt die Initialisierung der COM-Schnittstelle.
-> siehe
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Senden_mit_dem_UART

askazo
03.12.2005, 17:44
Sorry, ich dachte, Du kennst Dich durch Bascom schon ein wenig mit den Registern der UART aus.
Hier mal ein Programm, das Du direkt kompilieren kannst:


#include <io.h>
#include <stdio.h>

#define F_CPU 8000000 // 8 MHz Taktfrequenz
#define UART_BAUD_RATE 2400
#define UART_BAUD_SELECT (F_CPU/(UART_BAUD_RATE*16l)-1)

int uart_putchar(char c)
{

if (c == '\n')
uart_putchar('\r');
loop_until_bit_is_set(UCSR0A, UDRE);
UDR0 = c;
return 0;
}

void ioinit(void)
{
UCSRB = 0x08 //UART Transmitter aktivieren
UBRRL = UART_BAUD_SELECT; //Baud Rate einstellen
}


int main (void)
{

UartInit(); //Schnittstelle initialisieren
fdevopen(uart_putchar, NULL, 0);

printf ("HelloWorld");

}

alecs
06.12.2005, 09:58
@ askazo: Leider funktionierte dein Code nicht sofort und ich musst diesen nen bisl abändern, doch nun funktioniert er ohne Probleme:


#include <io.h>
#include <stdio.h>

#define F_CPU 16000000 // 8 MHz Taktfrequenz
#define UART_BAUD_RATE 9600
#define UART_BAUD_SELECT (F_CPU/(UART_BAUD_RATE*16l)-1)

int uart_putchar(char c)
{
if (c == '\n')
uart_putchar('\r');
while (!(UCSRA & (1<<UDRE)));
UDR = c;
return 0;
}

void ioinit(void)
{
UCSRB = 0x08; //UART Transmitter aktivieren
UBRRL = UART_BAUD_SELECT; //Baud Rate einstellen
}

int main (void)
{

ioinit(); //Schnittstelle initialisieren
fdevopen(uart_putchar, NULL, 0);
printf ("Hello World \n");
}



Vielen Dank =D> noch mal für die Hilfe, ich hab dieses Beispiel im Fall das noch jemand mal diese Hilfe brauch gepostet!!!!

Alecs

askazo
06.12.2005, 10:16
Naja, Taktfrequenz und Baud-Rate kann ich ja nicht erraten, da habe ich einfach mal Werte angenommen.
Die 0 bei den Registern UDR und UCSRA sind Copy&Paste-Fehler - hatte das Programm auf dem Mega128 getestet und vergessen, das wieder umzuschreiben...

Aber schön, dass ich Dir helfen konnte :)

askazo