Forum: Mikrocontroller und Digitale Elektronik UART bei AVR Studio 4 / 6


von Karlheinz D. (kdruschel)


Lesenswert?

Hallo,
ich habe hier ein Olimex Protoboard mit einem MEGA 16 und möchte die 
UART zum Laufen bringen. Dazu nutze ich wie bisher die Library von P. 
Fleury.
Da ich das AVR Studio 6 ezum ersten mal nutze, habe ich es mit einem 
kleinen Testprogramm versucht (s.u.).
Das seltsame ist jetzt: Beim AVR Studio 4 läuft es, wenn ich den Code 
mit Copy & Paste in das Studio 6 kopiere, läuft es nicht mehr.
Also der Code wird einwandfrei compiliert, aber sobald ich das Programm 
in den AVR lade tut sich am Terminalprogramm gar nichts mehr.
Woran kann das liegen ? Irgendwelche Compilerflags ?

Gruß
Karlheinz



#define  _AVR_ATmega16_  1

#ifndef F_CPU
#define F_CPU  8000000
#endif

#include <stdio.h>
#include "avr/io.h"
#include "uart.h"

#define UART_BAUD_RATE  9600

int main()
{
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );

  while (1)
  {
    uart_puts("Test\n\r");
  }
  return 0;
}

von Peter II (Gast)


Lesenswert?

eventuell ist ja

#ifndef F_CPU

schon anders im 4er oder 6er definiert.

lass das mal weg und schreibe nur

#define F_CPU  8000000

(oder noch besser, lass es komplett weg. Dann kommt eine Warnung)

von Oliver S. (oliverso)


Lesenswert?

Karlheinz Druschel schrieb:
> #define  _AVR_ATmega16_  1

Die Zeile lass mal lieber weg. Sollte es dann in der 4er-Version nicht 
mehr funktionieren, ist etwas grundlegendes mit deinen 
Projekteinstellungen oder der Installation nicht in Ordnung.

> #ifndef F_CPU
> #define F_CPU  8000000
> #endif

Das ist eine leider unausrottbare Unsitte. Diese Zeilen nutzen gar 
nichts, sondern setzen dir nur unbemerkt ein nach Murphy garantiert 
falsches F_CPU. Lass das einfach weg.

F_CPU gehört an einer zentralen Stelle im Projekt gesetzt, beim Studio 
in den Projektsettings. Solltest du das mal vergessen, dann ist das 
Programm nicht mehr kompilierbar, und der Compiler zeigt das durch seine 
Fehlermeldungen.

> #include <stdio.h>
> #include "avr/io.h"
> #include "uart.h"
>
> #define UART_BAUD_RATE  9600
>
> int main()
> {
>   uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
>
>   while (1)
>   {
>     uart_puts("Test\n\r");
>   }
>   return 0;
> }

Das sieht soweit in Ordnung aus.

Oliver

von Karl H. (kbuchegg)


Lesenswert?

Karlheinz Druschel schrieb:

> #define  _AVR_ATmega16_  1
?
Wozu das hier?

Wenn das Projekt richtig aufgesetzt ist, dann kommt das entsprechende 
µC-define aus der IDE

>
> #ifndef F_CPU
> #define F_CPU  8000000
> #endif

Nimm da mal den #ifndef raus.

Ich halte die ehrlich gesagt für keine gute Idee.
Entweder man stellt den Wert für F_CPU in der IDE ein oder im Source 
Code. Aber nicht beides.
Wenn in beiden (Programm und IDE) eine Definition für F_CPU vorliegt, 
dann soll das ruhig ein Fehler sein, der behoben werden muss. Denn über 
kurz oder lang kennst sich nämlich kein Mensch mehr aus, was denn jetzt 
eigentlich benutzt wird. Verschlimmert wird das nur dadurch, dass im 
Programm ein F_CPU definiert wird, wenn von der IDE nichts kommt. Denn 
oft genug stimmen dann die benutzten Werte quer über mehrere Source Code 
Files nicht zusammen.
Idealerweise wird der Wert für F_CPU in der IDE eingestellt.

: Bearbeitet durch User
von Karlheinz D. (kdruschel)


Lesenswert?

Mit euren Bemerkungen habt ihr sicher recht, und ich sehe sie als 
lehrreich an.
Bloß habe ich beim 6er Studio nichts gefunden, wo ich die Taktfrequenz 
über die IDE vorgeben kann (beim 4er geht das ja).
Die Ursache hier war der fehlende sei(), die Bibliothek nutzt Interrupts 
:-)
Trotzdem Danke

von Peter II (Gast)


Lesenswert?

Karlheinz Druschel schrieb:
> Die Ursache hier war der fehlende sei(), die Bibliothek nutzt Interrupts
> :-)

dann kann es aber auch nicht mit der 4er funktioniert haben.

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.