mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART am ATmega644P


Autor: Jellbie*O (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

wie der eine oder andere ja vll noch weiß ist mein Team nach wie vor am 
Projekt "autonomer Roboter" dabei und neigt sich langsam dem Ende.

Nächsten Donnerstag, also dem 19.03.2009, ist Abgabe Termin, somit 
bleibt nur noch wenig Zeit.

Wir stehen allerdings erneut vor einem Problem - dem UART

Wenn wir versuchen ein einziges Zeichen zu senden und abzufangen, kommt 
zwar etwas an, allerdings meist nicht das gewünschte Zeichen wie wir 
eigentlich wollten.

Eigentlich von uns gewollt ist eine Standard-Übertragung
8 Datenbits, 1 Stopbit, Parity None, Asynchronous Modus, bei 9600 BAUD


Unser leider gescheitertes Vorgehen:

- ATmega644P-20PU
- Externer 16Mhz Quarz
- ISP-Schnittstelle nach RN Standard
- verwendeter UART#1
- MAX232 mit Kondensatoren
- NULL-Modem Kabel
- Stecker (RXD & TXD)


##### Initialisierung des UART #1
############
   unsigned int baud=9600;    

   UBRR1H = (F_CPU / 16* (unsigned char)(baud>>8)-1)>>8; 
   UBRR1L = (F_CPU / 16* (unsigned char)(baud>>8)-1); 
   UBRR1 = 103; 

   UBRR1  = (F_CPU / (BAUD * 8L) - 1); 
   UCSR1A = (0<<U2X1); 
   UCSR1B = (1<<TXEN1); 
   UCSR1C = (0<<UMSEL10); 
   UCSR1C = (0<<UPM11) | (0<<UPM10); 
   UCSR1C = (0<<USBS1); 
   UCSR1C = (0<<UCSZ12) | (1<<UCSZ11) | (1<<UCSZ10); 
   UCSR1C = (0<<UCPOL1);    


##### Senden eines Zeichens
############
void USART_Transmit( unsigned char data ) 
{ 

while ( !( UCSR1A & (1<<UDRE1)) ) 
; 
UDR1 = data; 
} 

USART_Transmit(65); 


Sämtliche Programmeinstellungen wurden kontrolliert, ebenfalls was die 
Baudrate von 9600 betrifft etc. Im Datenblatt des ATmega644P wurden wir 
unter anderem fündig was UBRR1 = 103; betrifft


Eigentlich sollte das ganze nun ein großes A übertragen.
Seit 2 Wochen probieren wir nun schon herum und kommen leider nicht 
weiter.

Wir würden uns wirklich über jeden Tipp freuen.
Hoffe natürlich bei möglichen Fragen schnell Antworten geben zu können.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jellbie*O wrote:
>    UBRR1H = (F_CPU / 16* (unsigned char)(baud>>8)-1)>>8;
>    UBRR1L = (F_CPU / 16* (unsigned char)(baud>>8)-1);
>    UBRR1 = 103;
>    UBRR1  = (F_CPU / (BAUD * 8L) - 1);
>    UCSR1A = (0<<U2X1);
>    UCSR1B = (1<<TXEN1);
>    UCSR1C = (0<<UMSEL10);
>    UCSR1C = (0<<UPM11) | (0<<UPM10);
>    UCSR1C = (0<<USBS1);
>    UCSR1C = (0<<UCSZ12) | (1<<UCSZ11) | (1<<UCSZ10);
>    UCSR1C = (0<<UCPOL1);
Das ist doch wohl nicht Dein Ernst, oder? Vielleicht mal überlegt, was 
passiert, wenn man einem Register einen Wert zuweist und in der nächsten 
Zeile einen anderen? Das, was da steht, ist kompletter Schwachsinn! Und 
das ist noch euphemistisch ausgedrückt...

Außerdem ist das ganze 0 << irgendwas nicht wirklich guter 
Programmierstil.

Autor: Jellbie*O (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <avr/io.h> 
#define F_CPU 16000000L   //definiert den CPU Takt 

void USART_Transmit( unsigned char data ) 
{ 
   while ( !( UCSR1A & (1<<UDRE1)) ) 
   ; 
    UDR1 = data; 
} 


int main() 
{ 
   unsigned int BAUD=9600; 
   UBRR1 = (F_CPU / (BAUD * 16) - 1); 

   UCSR1B = (1<<TXEN1); 
   UCSR1C = (1<<UCSZ11) | (1<<UCSZ10); 
   while (1) 
   { 
      USART_Transmit(65); 
   } 

   return 0; 
} 

Funktioniert auch nicht. Hat wer ein Idee? - abgesehen von meinem 
Vorposter welcher selbst keine Ahnung hat sondern anscheinend mehr drauf 
aus ist seine Beiträge-Statistik zu erhören.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Im Datenblatt ist doch ein Beispiel. Mal das Testen.

>Funktioniert auch nicht. Hat wer ein Idee? - abgesehen von meinem
>Vorposter welcher selbst keine Ahnung hat sondern anscheinend mehr drauf
>aus ist seine Beiträge-Statistik zu erhören.

Wieso? Wo er Recht hat, hat er Recht.

MfG Spess

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jellbie*O wrote:

> Funktioniert auch nicht. Hat wer ein Idee? - abgesehen von meinem
> Vorposter welcher selbst keine Ahnung hat sondern anscheinend mehr drauf
> aus ist seine Beiträge-Statistik zu erhören.

bei so einer Reaktion bekommt man echt Lust zu Antworten...

ich riskiere es trotzdem mal: µC ausbauen und Tx mit Rx verbinden, dann 
mit dem PC was hinschicken, was dann zurückkommen sollte...so könnte man 
mal Hardware-Fehler ausschliessen...

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Justus Skorps wrote:
> bei so einer Reaktion bekommt man echt Lust zu Antworten...
Tja, wenn er es selber besser weiß, warum fragt er dann?

> ich riskiere es trotzdem mal:
Eigentlich schade... Aber vermutlich wird er Dir nichts anderes sagen 
als über mich, denn Du bist ja auch angemeldet und nur darauf aus, Deine 
Beitragszahl hochzupuschen!

Ich kann langsam die langjährigen Teilnehmer hier verstehen, die nicht 
mehr angemeldet posten, damit keiner behaupten kann, sie wären 
Vielschreiber...

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wenn wir versuchen ein einziges Zeichen zu senden und abzufangen, kommt
>zwar etwas an, allerdings meist nicht das gewünschte Zeichen wie wir
>eigentlich wollten.

Dann stimmt die Baudrate nicht.

Autor: Jellbie*O (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hardware-Fehler sind auszuschließen weil ein Beispiel von Bascom
einwandfrei funktioniert.
$regfile = "m644pdef.dat"
$crystal = 16000000
$baud1 = 9600

   Open "com2:" For Binary As #2
    Do
      Waitms 800
      Print #2 , "**** Hier steht was ****"
    Loop
End

somit brauche ich die uc nicht testen oder?
Trotzdem danke für den Tipp. :)

Was die beiligenede Dokumentation betrifft...
das Beispiel dort oben ist bereits teil der Dokumentation und 
funktioniert leider nicht.

USART_TRANSMIT wurde 1:1 übernommen und halt an den UART1 angepasst, 
weil der ATMega644P 2 UARTs besitzt.

Vielen Dank schonmal für die vielen Ideen.
Sonst vielleicht noch wer eine Idee?

Wäre echt für jeden Tipp dankbar

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jellbie*O wrote:

>    UBRR1 = (F_CPU / (BAUD * 16) - 1);

sprengt (BAUD * 16) hier nicht die int-Grenze?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jellbie*O wrote:
> Hardware-Fehler sind auszuschließen weil ein Beispiel von Bascom
> einwandfrei funktioniert.

Und warum nimmste nicht einfach nen funktionierenden C-Code ausm Web?

Z.B.:
Beitrag "AVR-GCC: UART mit FIFO"


Peter

Autor: Jellbie*O (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weils leider nicht funktionierte....


Hab in einem anderen Forum allerdings nun Hilfe gefunden.
Ich will keine Werbung machen oder so aber deswegen poste ich hier 
einmal das Ergebnis und nicht den Link.


Ich will das andere auch etwas davon haben, weil hasse es meistens das 
Topicersteller nur wissen wie die ANtwort lautet  - liegt ja nicht im 
Sinne eines Forums
#include <avr/io.h> 
#include <avr/delay.h>
#define F_CPU 16000000L   //definiert den CPU Takt 

void USART_Transmit( unsigned char data ) 
{ 
   while ( !( UCSR1A & (1<<UDRE1)) ) 
   ; 
    UDR1 = data; 
} 


int main() 
{ 
   unsigned int BAUD=9600; 
  UBRR1 = (F_CPU / (BAUD * 16L) - 1);

   UCSR1B = (1<<TXEN1); 
   UCSR1C = (1<<UCSZ11) | (1<<UCSZ10); 
   while (1) 
   { 
       _delay_ms(500);
      USART_Transmit(65); 
   } 

   return 0; 
} 


Danke an alle die mir Tipps gaben und ja mir viele Denkanstöße gaben!
Danke! :)

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und an dem delay soll's gelegen haben? (Oder hab ich noch eine Änderung 
übersehen?)

Gruß, CowZ

Autor: Jellbie*O (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
man beachte die L`s


und ja weil das Programm zu schnell durchläuft

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jellbie*O wrote:
> man beachte die L`s

Justus Skorps wrote:
> sprengt (BAUD * 16) hier nicht die int-Grenze?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>      _delay_ms(500);
>      USART_Transmit(65);

Das soll wohl ein Scherz sein. Wenn das die Lösung sein soll, habe ich 
bis jetzt immer alles falsch gemacht. Nämlich ohne Wartezeit.

MfG Spess

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

stimmt, das L hatte ich übersehen :)

aber ist es nicht auch sträflich mit Longs zu rechnen und das ganze dann 
"einfach so" auf nen int zu übertragen? Und wär's nich cleverer, das 
ganze ohne den int zu machen, sondern einfach mit defines? dann kann der 
compiler gar nicht erst auf die idee kommen, das als variable 
zubetrachten...

Gruß, CowZ

Autor: Jellbie*O (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
// Nachtrag

Hätte nie gedacht das es einem einzigen L liegen könnte

Wo genau nun der Unterschied ist bei F_CPU 16000000L und dem UL am Ende
ist weiß ich immernoch net. Dasselbe bei der BAUD-Rate mit dem L.

Auf jeden Fall wirkte sich genau das auf das Ergebnis aus.

Nun bin ich in der lage ein einziges ZEichen zu senden und muss es 
nurnoch schaffen nen Buchstaben angeben zu können und daraus soller dann 
ja die Zahl schreiben.

Kann man da nicht einfach mit Char einen Buchstaben annehmen und dann 
einfach als INT übergeben?`

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
USART_Transmit('A');

Autor: Jellbie*O (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thanks a lot, werd dann mal eine Funktion schreibe´n damit man gleich 
nen ganzen String angeben kann.


Tja und das mit der Pause ... auch wenns mir keiner glauben mag aber ich 
kann nur schreiben wie es ist... ich musste mind. 1ms angeben

Anderenfalls lief gar nix.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Funktioniert auch nicht. Hat wer ein Idee? - abgesehen von meinem
>Vorposter welcher selbst keine Ahnung hat sondern anscheinend mehr drauf
>aus ist seine Beiträge-Statistik zu erhören.

frecher Hund!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jellbie*O wrote:
> Weils leider nicht funktionierte....

Dann hast Du was falsch gemacht, auf meinem ATmega644 funktioniert er 
ja.

Kann sein, daß Du ihn nicht verstehst und deshalb falsch verwendest.
Wenn Du aber keine Lust hast, mir dazu Fragen zu stellen, kann ich Dich 
nicht dazu zwingen.

Dein erstes Posting nährt allerdings den Verdacht, daß Du schon mal 
grundsätzliche Probleme mit der Programmiersprache C hast 
(Mehrfachzuweisungen sind witzlos).


Peter

Autor: Jellbie*O (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab den ATmega644P und nicht den ATmega644

Eventueller Unterschied?

Autor: ahem (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Datenblatt ?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jellbie*O wrote:
> hab den ATmega644P und nicht den ATmega644
>
> Eventueller Unterschied?

Haupsächlich nur die 2. UART.

Hast Du das Beispiel ausprobiert?
Hast Du Quarz und Baudrate definiert?
Was hat nicht funktioniert?


Peter

Autor: Tian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Nächsten Donnerstag, also dem 19.03.2009, ist Abgabe Termin, somit
>bleibt nur noch wenig Zeit.

keien Panik, nächster Donnerstag ist erst der 12.3.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.