Servus, alle die den ATMega 644 benutzen (wollen) und eine UART library suchen, finden im Anhang die angepasste Version von Peter Fleury. Schlicht weg um ATMega644 support erweitert... gruss Patrick
HiPatrick, ich benutze eine ATmega 16 und ich versuche eine Programm zu schreiben die die Daten empfangen und senden mit Interrupt und puffer vervaltung kann ich hab ja schon das Library von Fleury durchgeschaut und versucht mit dem klar zu kommen aber ich komme nicht recht. ich habe auch das test programm von fleury benutzt aber bei dem kompilierung habe ich einigen fehler meldung. kannst du mir helfen bitte? Danke MFG Marie #include <stdlib.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <avr/pgmspace.h> //#include "uart.h" //#include <avr/uart.h> #define UART_FRAME_ERROR 0x0800 /* Framing Error by UART */ #define UART_OVERRUN_ERROR 0x0400 /* Overrun condition by UART */ #define UART_BUFFER_OVERFLOW 0x0200 /* receive ringbuffer overflow */ #define UART_NO_DATA 0x0100 /* no receive data available */ /* define CPU frequency in Mhz here if not defined in Makefile */ #ifndef F_CPU #define F_CPU 4000000UL #endif /* 9600 baud */ #define UART_BAUD_RATE 9600 int main(void) { unsigned int c; char buffer[7]; int num=134; /* * Initialize UART library, pass baudrate and AVR cpu clock * with the macro * UART_BAUD_SELECT() (normal speed mode ) * or * UART_BAUD_SELECT_DOUBLE_SPEED() ( double speed mode) */ uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); /* * now enable interrupt, since UART library is interrupt controlled */ sei(); /* * Transmit string to UART * The string is buffered by the uart library in a circular buffer * and one character at a time is transmitted to the UART using interrupts. * uart_puts() blocks if it can not write the whole string to the circular * buffer */ uart_puts("String stored in SRAM\n"); /* * Transmit string from program memory to UART */ uart_puts_P("String stored in FLASH\n"); /* * Use standard avr-libc functions to convert numbers into string * before transmitting via UART */ itoa( num, buffer, 10); // convert interger into string (decimal format) uart_puts(buffer); // and transmit string to UART /* * Transmit single character to UART */ uart_putc('\r'); for(;;) { /* * Get received character from ringbuffer * uart_getc() returns in the lower byte the received character and * in the higher byte (bitmask) the last receive error * UART_NO_DATA is returned when no data is available. * */ c = uart_getc(); if ( c & UART_NO_DATA ) { /* * no data available from UART */ } else { /* * new data available from UART * check for Frame or Overrun error */ if ( c & UART_FRAME_ERROR ) { /* Framing Error detected, i.e no stop bit detected */ uart_puts_P("UART Frame Error: "); } if ( c & UART_OVERRUN_ERROR ) { /* * Overrun, a character already present in the UART UDR register was * not read by the interrupt handler before the next character arrived, * one or more received characters have been dropped */ uart_puts_P("UART Overrun Error: "); } if ( c & UART_BUFFER_OVERFLOW ) { /* * We are not reading the receive buffer fast enough, * one or more received character have been dropped */ uart_puts_P("Buffer overflow error: "); } /* * send received character back */ uart_putc( (unsigned char)c ); } } } fehler: Linking: uart1.elf avr-gcc -mmcu=atmega16 -I. -gstabs -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=uart1.o -std=gnu99 -Wundef -MMD -MP -MF .dep/uart1.elf.d uart1.o --output uart1.elf -Wl,-Map=uart1.map,--cref -lm uart1.o: In function `main': uart1.c:39: undefined reference to `UART_BAUD_SELECT' uart1.c:39: undefined reference to `uart_init' uart1.c:53: undefined reference to `uart_puts' uart1.c:58: undefined reference to `uart_puts_P' uart1.c:66: undefined reference to `uart_puts' uart1.c:72: undefined reference to `uart_putc' uart1.c:83: undefined reference to `uart_getc' uart1.c:99: undefined reference to `uart_puts_P' uart1.c:108: undefined reference to `uart_puts_P' uart1.c:116: undefined reference to `uart_puts_P' make.exe: *** [uart1.elf] Error 1 > Process Exit Code: 2 > Time Taken: 00:01
Servus, also die meisten fehlermeldungen ruehren von dieser Zeile: //#include "uart.h" //#include <avr/uart.h> du muss die uart.h auf jedenfall "includen". also nicht auskommentieren. eine moeglichkeit: kopier die uart.h und uart.c vom Fleury in dein projektordner deines programmes und sag im AVR Studio (falls du das benutzt) add source file (und waehl die uart.c aus) und anschliessend auf "add existing header files" und waehl die uart.h. in deinem hauptprogramm musst dann uart.h einbezogen werden:
1 | #include "uart.h" |
2 | #define UART_BAUD_RATE 57600
|
wie man die uart verwendet sieht man in fleurys beispiel.
1 | int main(){ |
2 | |
3 | sei(); //now enable interrupt, since UART library is interrupt controlled |
4 | uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); |
5 | uart_putc(0xAA); // 'AA' vesenden als Char |
6 | uart_puts("Hello World!"); //ein String verschicken usw |
aber besser einen eigenen thread aufmachen ;)
1 | #include "uart.h" /* Hier müsste der Pfad zu der Datei hin, |
2 | wenn die nicht im gleichen Verzeichnis ist, wie "main"*/ |
3 | #include <avr/uart.h> //das hier geht GANZ sicher nicht |
4 | //<...> Pfade werden vom Preprocessor anders aufgelöst
|
Bist du wenigstens das ganze AVR-Gcc-Tutorial durchgegangen? das gibt's auch das Kapitel: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Exkurs:_Makefiles und für's weitere Fehlersuchen: "undefined reference" heißt, das der Compiler einen Namen nicht kennt, weil: - er eine Header-Datei nicht findet - dieser Name falsch geschrieben ist - es diesen Namen nicht gibt hth. Jörg ps.: schau dir mal die Überschrift "Formatierung" an, knapp über dem Antwortfenster ;)
hallo ich benutze auch einen Mega644 mit 20 Mhz. Ich habe auch deine Lib eingebunden. Mit uart_putc (123); passiert aber rein garnichts. muss ich da noch etwas ändern oder sollte das so funktionieren. oder sind die 20Mhz zu groß?
Hi, ich hab mir deine veränderte Lib für den 644 heruntergeladen, bei mir meckert das AVR Studio aber trotzdem, bei allen Funktionen: Error 1 undefined reference to `uart_init' Error 2 undefined reference to `uart_puts' Error 3 undefined reference to `uart_puts_p Error 4 undefined reference to `uart_puts' Error 5 undefined reference to `uart_putc' Error 6 undefined reference to `uart_getc' Error 7 undefined reference to `uart_puts_p' Error 8 undefined reference to `uart_puts_p' Error 9 undefined reference to `uart_puts_p'/ Error 10 undefined reference to `uart_putc' Mein µC ist ein mega644p, der unterscheidet sich ja eigentlich nur durch das 2. UART Interface lg Martin
Ich verstehs nicht, bei mir kommt auch bei jeder Funktion die Meldung, dass der compiler die header dateien nicht findet. sogar als ich die UART Dateien direkt in die toolchain eingefügt hab, findet er sie scheinbar nicht :-(
ok, uart.h und uart.c in dem explorer einfügen und includen, dann funktionierts
Wisso zum geier wird die uart.h in die uart.c included und nicht umgekehrt?? Ich weis nicht woher das überhaupt kommt das man eine lib in ein *.c file und ein *.h file zerlegt? Das kann sogar dazu führen das versucht wird Code Doppelt zu Compilern je nach SDK. (was natürlich fehlschägt, aber man wundert sich eben wiso der Compiler auf einmal ein duzend fehler auswirft)
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.