PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arduino UART



michi287
28.03.2013, 15:03
Hallo das ist meine erste Frage also entschuldigung im voraus falls ich etwas falsch mache.

Mein Problem:
Ich Arbeite mit Atmel Studio 6.0 und Programmiere ein Arduino Uno mit 16MHz.

Nun möchte ich ein Programm schreiben damit ich über Serielle Komunikation ein Char ('a') sende und diesen Buchstaben will ich am Terminal Window anzeigen.
Das Problem ist, dass immer irgendwelche Zeichen angezeigt werden.

Hir der Code:

#include <avr/io.h>
#define F_CPU 16000000UL

#define BAUD 9600
#define MYUBRR ((F_CPU/(BAUD*16))-1)


void USART_Init(unsigned int ubrr)
{
//baud rate
UBRR0H=(unsigned char) (ubrr>>8);
UBRR0L=(unsigned char) ubrr;

//frame format: 8data, 2stop bit
UCSR0C = (1<<UCSZ01)|(1<<UCSZ00)|(1<<USBS0);

//Enable receiver and transmitter
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
}

void data_send(unsigned char data)
{
while ( !( UCSR0A & (1<<UDRE0)) );
//daten senden
UDR0=data;
}

int main(void)
{
USART_Init(MYUBRR);
while(1)
{
data_send('a');
}
}

bitte um hilfe

DanielSan
28.03.2013, 15:22
Hi,

hast du am PC alle Einstellungen richtig vorgenommen?
Du hast im Code 8Datenbits und 2 Stopbits eingestellt. Ist das am PC auch so? Normalerweise nimmt man nur 1 Stopbit.
Ist am PC auch 9600 Baud eingestellt?

Sind die register wirklich alle richtig so? Ich hab jetzt nicht ins Datenblatt geguckt aber da kann sich schnell ein fehler einschleichen.

Gruß Daniel

oderlachs
28.03.2013, 16:33
Hallo Michi
Warum nimmst Du beim Arduino das AVR Studio zum Programmieren und nicht die Spottleichte Arduino-IDE, da kann man nix bei falschmachen...
Gewiss kann man den Arduino per ISP programmieren..aber ich habe dies ausser zum BL brennen noch nie genutzt...

Gerhard

michi287
28.03.2013, 16:45
hast du am PC alle Einstellungen richtig vorgenommen?
Du hast im Code 8Datenbits und 2 Stopbits eingestellt. Ist das am PC auch so? Normalerweise nimmt man nur 1 Stopbit.
Ist am PC auch 9600 Baud eingestellt?

Sind die register wirklich alle richtig so? Ich hab jetzt nicht ins Datenblatt geguckt aber da kann sich schnell ein fehler einschleichen.
Die PC Einstellungen sind alle richtig eingestellt. Und normalerweise sollten auch alle register richtig sein.
Hab ich vielleicht etwas vergesen zu aktivieren?
Ich benutze das Arduino über die USB-Schnitstelle, muss ich da was anders machen?



Warum nimmst Du beim Arduino das AVR Studio zum Programmieren und nicht die Spottleichte Arduino-IDE, da kann man nix bei falschmachen...
Ich benutze das AVR Studio weil ich es in der Schule benutze. Ich hab am Anfang in der Arduino-IDE programmiert (dort hat die Serielle komunikation auch funktioniert), aber das ist zu leicht, und funktioniert auch nur bei Arduino. Da ich auch andere MCU programmieren will ist das AVR-Studio besser geeignet.

oderlachs
28.03.2013, 17:28
Ich benutze das AVR (http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht) Studio weil ich es in der Schule benutze. Ich hab am Anfang in der Arduino-IDE programmiert (dort hat die Serielle komunikation auch funktioniert), aber das ist zu leicht, und funktioniert auch nur bei Arduino. Da ich auch andere MCU programmieren will ist das AVR (http://www.rn-wissen.de/index.php/AVR-Einstieg_leicht_gemacht)-Studio besser geeignet.

Das ist natürlich ein triftiger Grund, den ich nicht wusste.

na dann noch viel Spass und Glück dabei alles noch richtig hinzubekommen..
Gerhard

Chypsylon
28.03.2013, 19:45
Abgesehen davon hat der Arduino-Dialekt sehr viel Overhead und ist dementsprechend langsamer (bei den meisten Anwendungen natürlich nicht so wichtig) und mit avr-gcc lernt man auch mehr da das ganze nicht so vereinfacht ist und man einigermaßen verstehen muss was genau getan wird, sodass man in Zukunft Probleme auch selber lösen kann anstatt aus fertigen Bibliotheken und Codebeispielen zusammenkopieren muss. Über die Arduino-IDE möchte ich jetzt gar nicht herziehen aber wer schon mal mit einer richtigen IDE/Editor programmiert hat weiß was ich meine :rolleyes:

Die Idee hinter Arduino finde ich aber super und für Anfänger ohne Vorkenntnisse sind sie eben aufgrund der Einfacheit und der vielen Beispiele gut geeignet.

DanielSan
29.03.2013, 08:14
Naja den Overhead kann man aber loswerden indem man es in normalem C schreibt so wie oben. Dann kann man sachen die man noch nicht versteht erstmal aus der Lib ziehen und später eigene C Routinen schreiben die auf das spezielle Problem zugeschnitten sind.

@michi: Versuchs mal bitte mit nur 1 Stopbit. Kann es evtl sein das dein USB to RS232 Adapter nicht mit 2 stopbits klarkommt? Ist nur so ne Idee.

michi287
29.03.2013, 12:07
Versuchs mal bitte mit nur 1 Stopbit. Kann es evtl sein das dein USB to RS232 Adapter nicht mit 2 stopbits klarkommt? Ist nur so ne Idee.
Habe es veruscht aber ohne Erfolg. Habs auch mit anderer Baud versucht aber auch ohne Erfolg.
Ich benutze keinen RS232 Adapter.
Das Arduino (ATmega328P) wird über USB-Programmiert.

Hier mal ein Bild was ich im Terminal empfange:
24988

michi287
29.03.2013, 16:09
Das problem hat sich erledigt. Es Funktioniert schon.

Chypsylon
29.03.2013, 21:04
Falls andere Leute in Zukunft das gleiche Problem haben wäre es super wenn du noch sagst was das Problem/lösung war ;)

michi287
07.04.2013, 12:01
Ich hab 2 änderungen vorgenommen.
1.) Hab ich die Baudrate anders gesetzt. Laut datenblatt:
UBRR0H = 0;
UBRR0L = 103; //baudrate 9600 baud

2.)
Hab ich die Methode Senden umgeschrieben:

void data_send(uint8_t data) //Stat unsigned char hab ich jetzt uint8_t
{
while ( !( UCSR0A & (1<<UDRE0)) );
//daten senden
UDR0=data;
}

Dannach hatt alles funktioniert

oderlachs
07.04.2013, 14:56
Danke Michi, das hilft dann weiter, wenn ein anderer in solche Lage kommt, da denke ich schon mal an mich.. ;)