Forum: Mikrocontroller und Digitale Elektronik UART funktioniert unter OS X nicht mehr


von Mario D. (wuermchen)


Lesenswert?

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
int main(void) {
2
  cli();
3
  systemInit();
4
  timerInit();
5
  //Initialize UART library, pass baudrate and AVR cpu clock with the macro
6
        uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
7
        sei();
8
        PORTC |= (1 << 7); // LED8 zeigt den Betrieb an.
9
10
        uart_puts("\n\nProgramm gestartet!\n\r");
11
12
  while(1) {
13
    PORTC |= (1 << 6);
14
  }
15
}

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.

von Oliver J. (skriptkiddy)


Lesenswert?

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

von Mario D. (wuermchen)


Lesenswert?

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 ****
2
3
make all 
4
Building file: ../uart.c
5
Invoking: AVR Compiler
6
avr-gcc -Wall -g2 -gstabs -O0 -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega644 -DF_CPU=16000000UL -MMD -MP -MF"uart.d" -MT"uart.d" -c -o "uart.o" "../uart.c"
7
Finished building: ../uart.c
8
 
9
Building target: avrtacho.elf
10
Invoking: AVR C Linker
11
avr-gcc -Wl,-Map,avrtacho.map -Wl,-u,vfprintf -lprintf_flt -lm -mmcu=atmega644 -o   "avrtacho.elf"  ./lcd.o ./main.o ./uart.o   
12
Finished building target: avrtacho.elf
13
 
14
Create Flash image (ihex format)
15
avr-objcopy -R .eeprom -O ihex avrtacho.elf  "avrtacho.hex"
16
Finished building: avrtacho.hex
17
 
18
Invoking: Print Size
19
avr-size --format=avr --mcu=atmega644 avrtacho.elf
20
AVR Memory Usage
21
----------------
22
Device: atmega644
23
24
Program:    9186 bytes (14.0% Full)
25
(.text + .data + .bootloader)
26
27
Data:        423 bytes (10.3% Full)
28
(.data + .bss + .noinit)
29
30
31
Finished building: sizedummy
32
 
33
34
**** Build Finished ****

Danke aber schon mal fürs drüber gucken, würde mich über andere Tipps 
wie ich den Fehler ausfindig machen kann sehr freuen.

von Oliver J. (skriptkiddy)


Lesenswert?

Schieb mal das komplette Projekt als Anhang hoch. Sonst kann dir 
wahrscheinlich niemand helfen.

Gruß Oliver

von Mario D. (wuermchen)


Angehängte Dateien:

Lesenswert?

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.

von holger (Gast)


Lesenswert?

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?

von Mario D. (wuermchen)


Lesenswert?

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?

von holger (Gast)


Lesenswert?

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

von Mario D. (wuermchen)


Lesenswert?

Hm, könntest Du mir vielleicht dann erklären wie ich es richtig machen 
kann, weil sobald ich in der uart.c die Kommentare entferne, also so:
1
#elif defined(__AVR_ATmega644__)
2
 /* ATmega with one USART */
3
 #define ATMEGA_USART0
4
 #define UART0_RECEIVE_INTERRUPT   SIG_USART_RECV
5
 #define UART0_TRANSMIT_INTERRUPT  SIG_USART_DATA
6
 //#define UART0_RECEIVE_INTERRUPT   USART0_RX_vect
7
 //#define UART0_TRANSMIT_INTERRUPT  USART0_TX_vect
8
 #define UART0_STATUS   UCSR0A
9
 #define UART0_CONTROL  UCSR0B
10
 #define UART0_DATA     UDR0
11
 #define UART0_UDRIE    UDRIE0

Bekomme ich folgenden Fehler:
1
**** Build of configuration Debug for project uarttest ****
2
3
make all 
4
Building file: ../uart.c
5
Invoking: AVR Compiler
6
avr-gcc -Wall -g2 -gstabs -O0 -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega644 -DF_CPU=16000000UL -MMD -MP -MF"uart.d" -MT"uart.d" -c -o "uart.o" "../uart.c"
7
../uart.c:194:36: error: attempt to use poisoned "SIG_USART_RECV"
8
../uart.c:195:36: error: attempt to use poisoned "SIG_USART_DATA"
9
make: *** [uart.o] Error 1
10
11
**** Build Finished ****

von Mario D. (wuermchen)


Lesenswert?

Ach, und in meiner iomxx4.h steht folgendes:
1
/* avr/iomXX4.h - definitions for ATmega164P/324P/644P and ATmega644 */
2
3
/* $Id: iomxx4.h 2235 2011-03-17 04:13:14Z arcanum $ */
4
5
...
6
...
7
...
8
9
/* USART0, Rx Complete */
10
#define USART0_RX_vect_num    20
11
#define USART0_RX_vect      _VECTOR(20)
12
#define SIG_USART_RECV      _VECTOR(20)
13
14
/* USART0 Data register Empty */
15
#define USART0_UDRE_vect_num  21
16
#define USART0_UDRE_vect    _VECTOR(21)
17
#define SIG_USART_DATA      _VECTOR(21)
18
19
/* USART0, Tx Complete */
20
#define USART0_TX_vect_num    22
21
#define USART0_TX_vect      _VECTOR(22)
22
#define SIG_USART_TRANS      _VECTOR(22)

von Mario D. (wuermchen)


Lesenswert?

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!

von Oliver J. (skriptkiddy)


Lesenswert?

1
 #elif defined(__AVR_ATmega644__)
2
 /* ATmega with one USART */
3
 #define ATMEGA_USART0
4
 //#define UART0_RECEIVE_INTERRUPT   SIG_USART_RECV
5
 //#define UART0_TRANSMIT_INTERRUPT  SIG_USART_DATA
6
 #define UART0_RECEIVE_INTERRUPT   USART0_RX_vect
7
 #define UART0_TRANSMIT_INTERRUPT  USART0_UDRE_vect
8
 #define UART0_STATUS   UCSR0A
9
 #define UART0_CONTROL  UCSR0B
10
 #define UART0_DATA     UDR0
11
 #define UART0_UDRIE    UDRIE0
So wird ein Schuh draus.

von Oliver J. (skriptkiddy)


Lesenswert?

USART0_TX_vect != USART0_UDRE_vect

von Mario D. (wuermchen)


Lesenswert?

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

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Haste nen mega644 odern 644p?
isn großer unterschied!

die lib von fleury arbeitet auf beiden gut, aber man muss eben aufs p 
achten

von holger (Gast)


Lesenswert?

>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.

von Mario D. (wuermchen)


Lesenswert?

@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 :-)

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.