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
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
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.
> Habe ich was wichtiges vergessen?
Kabel. Gekreuzt oder nicht gekreuzt?
Nimm dir doch mal ein Multimeter (Oszi wäre besser) und
untersuch mal die Strecke ausgehend vom µC. Bis wohin
kannst du das Signal verfolgen?
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.
@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
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
Empfehlenswert wäre auch noch ein while (!(UCSRA & 1 << TXC)); vor dem uart_puts ("a"); Dann wartet der Controller bis das vorherige Zeichen gesendet wurde. MW
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.