Hallo Leute,
ich hatte die ganze Zeit unter Linux ein wenig auf meinem Atmega644
rumentwickelt, bin aber quasi noch ziemlicher Anfänger.
Zumindest hatte ich Eclipse laufen und hatte da auch UART auf meinem
Atmega zum laufen gebracht.
Jetzt habe ich einen Mac mit OS X bekommen und auch dort wieder Eclipse
zum entwickeln installiert. Funktioniert soweit auch alles, nur UART
will nicht und ich finde den Fehler nicht.
Sobald ich eine Ausgabe mit UART mache, funktioniert an meinem Programm
nix mehr. Auf Linux ging eigentlich alles. Ich benutze die UART Lib von
Fleury und bekomme ein paar Fehler, wenn ich durch meinen Programmcode
gucke, dass er Variablen nicht kennt, vielleicht liegt es daran?!
Hier mal ein kleiner Ausschnitt vom Code
1
intmain(void){
2
cli();
3
systemInit();
4
timerInit();
5
//Initialize UART library, pass baudrate and AVR cpu clock with the macro
Sobald ich uart_puts auskommentiere leuchten beide LEDs, wenn ich
uart_puts drin lasse leuchtet nur eine LED, also kommt er dann nie zur
while Schleife...
Die Fehler von denen ich eben noch gesprochen habe sind zum Beispiel,
dass er folgende Variablen nicht kennt, bzw nicht deklariert sind:
UDRIE, UDR, UCSZ0, UCSRB, UCRSA, UBRRH, UBRRL
Kann es sein, dass ich unter MAC noch eine andere Header Datei einbinden
muss? Oder kann mir Jemand ein Tipp geben? Ich denke ich hab sonst
eigentlich alles gleich gemacht wie damals unter Linux.
Vielen Dank schon mal im Voraus.
Mario Dejung schrieb:> Die Fehler von denen ich eben noch gesprochen habe sind zum Beispiel,> dass er folgende Variablen nicht kennt, bzw nicht deklariert sind:> UDRIE, UDR, UCSZ0, UCSRB, UCRSA, UBRRH, UBRRL
Diese Defines stehen in der iom644.h welche normalerweise über
1
#include<avr/io.h>
inkludiert wird. Dazu muss der Compiler aber den verwendeten
Microcontroller per Kommandozeile als Parameter bekommen.
1
avr-gcc -mmcu=atmega644 [...]
> Sobald ich uart_puts auskommentiere leuchten beide LEDs, wenn ich> uart_puts drin lasse leuchtet nur eine LED, also kommt er dann nie zur> while Schleife...
Wie kann das sein, wenn du oben genannte Fehler bokommst?
Gruß Oliver
Hm, ich kann es nicht sagen. Hab eben mal in diese uart.c genauer rein
geschaut und da wird ja abgefragt um welchem mc es sich handelt. Wenn es
ein atmega644 ist wird die variable ATMEGA_USART0 gesetzt, Wenn
ATMEGA_USART0 gesetzt ist wird der LastRxError gesetzt mit anderen
Werten als wenn ATMEGA_USART vorher gesetzt wurde etc...
Vielleicht optimiert der Compiler das dann soweit, dass diese Warnungen
von den Variablen bei mir nicht mehr zutreffen und ich die eigentlich
vernachlässigen kann?
Meine Includes sind folgende:
1
#include <avr/io.h>
2
//#include <avr/iom644.h>
3
#include <avr/interrupt.h>
4
#include <avr/pgmspace.h>
5
#include "uart.h"
wobei ich mit und ohne iom644 versucht habe, beides das gleiche Problem.
Aber das Problem, dass die zweite LED nicht leuchtet bleibt irgendwie
:-(
Wenn ich das richtig sehe hab ich auch die richtigen Flags beim
compilieren angegeben:
1
**** Build of configuration Debug for project avrtacho ****
Ich hab jetzt mal ein Minimalbeispiel zusammengebastelt und hab das mal
als ZIP angehängt.
Die ich hab mal ein zwei Zeilen aus der uart.c gelöscht, die mit meinem
Projekt eigentlich nix zu tun haben sollten, ist mit uart.c.noerror
benannt.
Wenn man planlos rumändert ist es kein Wunder wenn es nicht geht:
#elif defined(_AVR_ATmega644_)
/* ATmega with one USART */
#define ATMEGA_USART0
//#define UART0_TRANSMIT_INTERRUPT SIG_USART_DATA
#define UART0_TRANSMIT_INTERRUPT USART0_TX_vect
Welcher Interrupt wird bei dir aktiviert?
Hallo Holger,
ich muss ehrlich zugeben, ich weiß nicht mehr was ich da genau gemacht
habe. Unter Linux bin ich mir recht sicher lief es so. Wenn ich die
ursprünglichen Zeilen drin lasse, sagt er mir, "../uart.c:195:36: error:
attempt to use poisoned "SIG_USART_DATA""
Ich hab daraufhin nachgelesen und gesehen, dass sich da in der
Namensgebung etwas geändert hat und damals eben die neuen Namen aus dem
Datenblatt meines Atmegas übernommen. Dort wurde eben anstelle
SIG_USART_DATA USART0_TX_vect genannt.
Ansonsten weiß ich jetzt nicht genau was Du meinst mit "Welcher
Interrupt wird bei Dir aktiviert?" Hab ich etwas vergessen zu Starten?
>Dort wurde eben anstelle>SIG_USART_DATA USART0_TX_vect genannt.
Und das ist falsch. Ein Blick in die Headerdatei iomxx4.h liefert das:
/* USART0 Data register Empty */
#define USART0_UDRE_vect _VECTOR(21)
#define SIG_USART_DATA _VECTOR(21)
Ok, ok, wahrscheinlich wolltest mich auch die ganze Zeit auf den Fehler
stoßen... Nach dem ich eben selbst noch mal gelesen habe, was ich hier
geschrieben habe, ist mir der Fehler bewusst geworden. Ich dachte ich
hätte in Erinnerung gehabt, dass es damals so lief, aber scheinbar kann
es so doch nicht gewesen sein...
Nachdem ich es in #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect
geändert habe läuft wieder alles.
Nur versteh ich dann nicht, warum die anderen Definitionen nicht gehen.
Aber gut, so ist mir geholfen.
Danke für Eure Zeit!
Danke Oliver,
hatte es noch vor Deinem Post selbst gefunden... Nächstes mal guck ich
gleich in den Header Dateien und versuch es mir nicht aus dem Datenblatt
zusammen zu reimen. Vielleicht passiert mir es dann nicht mehr :-)
Danke trotzdem
>Nur versteh ich dann nicht, warum die anderen Definitionen nicht gehen.>../uart.c:195:36: error: attempt to use poisoned "SIG_USART_DATA"
Da meinte irgendein Schlaukopf das die alten Namen auf keinen Fall
mehr benutzt werden dürfen. Es wär ja auch viel zu einfach
alte Quellcodes ohne Ärger mit einem neueren Compiler zu übersetzen.
Da hat man dann ja gar keine Arbeit und Zeit reingesteckt.
Immer dasselbe beim AVR-GCC.
@Martin, ist ein 644 ohne p...
Aber jetzt läufst soweit zufrieden stellend... Das nächste größere
Problem ist mein Programmierknowhow, und da wird mir keiner so schnell
helfen :-)