Hallo zusammen,
ich habe das myAVR MK2 bei mir im Einsatz. Nun habe ich laut Datenblatt
versucht Text zu senden bzw. zu empfangen.
Der Versand einer Zeichenkette funktioniert. Seltsam ist nur, dass der
Terminal vor der Empfangenen Zeichenkette immernoch ein kryptisches
Zeichen darstellt.
Viel irritierender finde ich aber, dass ich LEDs am PORTC einschalte,
bevor ich in meinen while(1) gehe. In der Schleife rufe ich dann die
folgende Funktion auf:
unsigned char USART_Receive( void )
{
/*
Wait for data to be received
*/
while ( !(UCSRA & (1<<RXC)) );
/*
Get and return received data from buffer
*/
return UDR;
}
Den Rückgabewert setze ich dann als PORTC:
unsigned char zeichen = USART_Receive();
PORTC = zeichen;
Wenn ich den AVR nun resette, gehen die LEDs an und gleich wieder aus.
Und das ohne, dass ich den Terminal auch nur geöffnet, geschweige
verbunden habe.
PS: Ich hatte auch versucht das empfangene Zeichen gleich wieder zu
senden. Das ist dann aber ebenfalls ein kryptisches Zeichen, welches
immer und immer wieder im Terminal ankommt.
Hat jemand eine Idee??
Zeige mal das ganze Programm.
Hast du ein Oszilloskop oder Logiktester?
Kannst du den RxD Pin mal fest auf High legen, damit er ganz sicher
nichts empfängt?
Hallo Gerrit,
aus meinen Anfängen habe ich auch noch solch ein Board herumliegen.
Wie sieht dein Makefile aus und welchen AVR µC CPU hast Du verwendet ?
Gerrit schrieb:> Ja, so sieht das Zeichen aus, welches als erstes geschickt wird.
Das ist kein Zeichen, sondern ein simpler Pegelwechsel an der
RX-Leitung.
Du solltest da auch einen Übertragungsfehler "Framing Error" bekommen,
weil da kein Stopbit übertragen wird. Du solltest also hier diese
Fehlerbits auch noch auswerten, wenn dein Protokoll ein solches
Startup-Verhalten nicht ignorieren kann...
Wie bereits geschrieben, habe ich das MK2 mit mySmartUsb MK2 im Einsatz.
Heißt, das ist alles verkabelt und der SmartUsb steht auf Datenmodus. An
PORTC sind nur LEDs.
Ich tippe mal ganz schwer, das die LED's gegen Masse sind. Somit ist 1
gleich 0 und umgekehrt.
Schmeiss das hier mal raus
DDRC = 0b11111111;
PORTC = 0b11111111;
und stattdessen:
DDRC = 0xFF;
PORTC = 0x00;
Guten Abend zusammen,
ich habe mir das nun noch mal in Ruhe angesehen. Ich habe meine Main()
wie folgt geändert:
1
intmain(void)
2
{
3
/* Replace with your application code */
4
5
USART_Init(MYUBRR);
6
unsignedcharzeichen;
7
8
printString("Welcome AVR!\r\n");
9
10
DDRC=0xFF;
11
PORTC=0xFF;
12
_delay_ms(1000);
13
14
while(1)
15
{
16
zeichen=receiveByte();
17
PORTC=PORTC<<1;
18
//PORTC= zeichen;
19
//printString("Test\r\n")
20
_delay_ms(200);
21
}
22
23
return1;
24
}
Die Funktion zum Empfangen ist:
1
unsignedcharreceiveByte(void){
2
while(!(UCSRA&(1<<RXC)))/* Wait for incoming data */
3
returnUDR;/* return register value */
4
}
Es gehen nun alle LEDs an. Sobald ich in den Loop komme, geht eine nach
der anderen LED aus. Woraus ich schließe, dass die
receiveByte()-Funktion nicht auf das Bit wartet bzw. das Bit scheinbar
gesetzt ist.
Ich habe auch versucht in der Init das RXC Bit auf 0 zu setzen, änderte
am Verhalten auch nichts:
Stefan U. schrieb:> Interessant finde ich, dass der Compiler diese Stelle nicht mit einem> Syntaxfehler bemängelt hat.
Warum sollte er? War alle syntaktisch korrekt.
Lothar M. schrieb:> Er hat eben nur nicht
Genau das ist meist das Problem, der Compiler versteht einfach den
Programmierer nicht richtig. Für viele dieser Missverständnisse hat ein
guter Compiler Warnungen, die ein defensiver Programmierer auch ernst
nimmt. Aber leider funktioniert das nicht immer. Und viele Programmierer
finden es auch toll, wenn sie jede überflüssige Klammer, jeden Kommentar
weglassen.
> Dort steht: "solange nicht fertig, gib das UDR zurück"...
Und das ist dummerweise das genaue Gegenteil dessen, was beabsichtigt
war :-)