UART senden

Gast #424800
Lesenswert?

Hallo,
Habe bisher wenig Ahnung von dem, was ich da mache, aber hier kann mir 
bestimmt jemand helfen.

System: Atmega32, AVR Studio 4.12

Ich versuche einfach nur ein Zeichen über die serielle Schnittstelle zum 
PC zu senden. Das klappt solange, wie ich diese ganzen "special function 
register", sprich "UCSRB, UCSRB, ..." direkt im Programm deklariere. Die 
sollten doch eigentlich auch in einer Header-Datei stehen, oder? In der 
"iom32.h" habe ich zumindest die passende Deklaration gefunden. Binde 
ich die Datei ein, meckert der Compiler (Object file not found on 
expected location D:\...).

Wenn mir da mal einer nen Anstoß geben könnte wäre ich froh.

M f G
Sebastian
Gast #424853
Lesenswert?

Hallo,

Hatte die Datei eingebunden, allerdings war bei den Projektoptionen der 
falsche Controller eingestellt...
Es mag jedoch noch nicht ganz funktionieren. Hier mal mein erster 
Versuch:


#define    F_CPU 4330000
#define   UART_BAUD_RATE 9600

#include <avr/io.h>
#include <lcd.h>
#include <uart.h>


int main(void)
{
        lcd_init(LCD_DISP_ON);
  lcd_puts ("Senden...");
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
main:
  uart_puts ("a");
goto main;
}


Viel ist da ja nicht dran, aber irgendwie ist da wohl noch was faul. Am 
Hyperterminal kommt absolut nichts an (Baudrate stimmt überein). Habe 
ich was wichtiges vergessen? Denke man muss da nicht mehr viel machen, 
die Fleury Bibliothek müsste ja reichen...

M f G
Sebastian
Gast #424962
Lesenswert?

Benutz bitte kein goto!
Für sowas gibt es in C z.B. die while-Schleife.
Warum willst du unbedingt eine Bibliothek benutzen, von deren 
Vorgehensweise du nichts weißt?
Wirf einen Blick ins Datenblatt deines Controllers! Dort findest du zu 
fast jeder Funktion ein (funktionsfähiges) Beispiel.
Wenn es da zu Problemen kommt, kann unsereins wenigstens ins Datenblatt 
gucken und muß sich nicht irgendwelche Libraries herunterladen und 
installieren.
Gast #425195
Lesenswert?

Wenn die uart_puts Funktion das 'A' einfach in das UART Senderegister 
schreibt und nicht wartet, bis der Sendevorgang beendet ist (wovon ich 
ausgehe), wirst du nichts sehen können, weil Du mit Deinem "GOTO" (Gott 
beware) zurück an den Anfang springst und dort die UART neu 
initialisierst. Und bei 9600Bd "dauert" ein Zeichen bekanntlich ca. 1ms.
Gast #425339
Lesenswert?

@WM-Rahul:
Ich hab es schonmal mithilfe des GCC Tutorials ans laufen bekommen, 
allerdings finde ich die Bibliotheks-Lösung einfacher.

@kbucheg:
Das ist ein normales Nullmodem-Kabel, also gekreuzt... hat bisher auch 
immer damit geklappt.

@Thorsten:
OK.. vll ist goto nicht wirklich sinnvoll, werde es mal mit einzelnen 
Zeichen probieren und ne gewisse Zeit dazwischen warten. Das ganze soll 
erstmal überhaupt funktionieren....


M f G
Sebastian
Gast #425345
Lesenswert?

Hallo Sebastion,

für die UART-Library von P.Fleury muss man noch 2 Defines für den gcc 
setzen, ich mache das von Linux aus in einem Makefile:

DEFINES += -DUART_TX_BUFFER_SIZE=16 -DUART_RX_BUFFER_SIZE=16

Die jeweiligen Sizes müssen Potenzen von 2 (8, 16, 32, usw.) sein. Beim 
AVR-Studio sollte das auch irgendwie gehen - hab' ich aber noch nicht 
probiert.

Viel Erfolg
HJ

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren