Forum: Compiler & IDEs AtMega 644 UART library Fleury


von Patrick K. (kaplan)


Angehängte Dateien:

Lesenswert?

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

von Marie (Gast)


Lesenswert?

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

von Patrick K. (kaplan)


Lesenswert?

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 ;)

von Jörg X. (Gast)


Lesenswert?

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 ;)

von Mike (Gast)


Lesenswert?

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ß?

von NewUser (Gast)


Lesenswert?

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

von timo (Gast)


Lesenswert?

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 :-(

von timo (Gast)


Lesenswert?

ok, uart.h und uart.c in dem explorer einfügen und includen, dann 
funktionierts

von maxbit (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.