Schönen Abend,
habe wieder einmal ein kleines Problem. Möchte im Terminal ein zeichen
senden und dieses soll wieder empfangen werden. Wäre nett, wenn mir
jemand einen Tipp geben könnte, danke.
#include <avr/io.h>
#define F_CPU 3686400ul
#define BAUD 9600
#define UBRR_VAL = ((3686400/(9600*16))-1)
void uart_init(void) {
UBRR0H = 0x00;
UBRR0L = 0x17;
UCSR0B = (1<<TXEN0) | (1<<RXEN0); // UART TX und RX einschalten
UCSR0C = (1<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00); // Asynchron 8N2
}
int main(void) {
uart_init();
/*while(1){
while (!(UCSR0A & (1<<UDRE0))) { // warten bis Senden moeglich
}
UDR0 = 'a';
//_delay_ms( 10 );
}
*/while(1){
while (!(UCSR0A & (1<<RXC0))) { //warten bis Zeichen verfuegbar
}
return UDR0;
}
}
Sepp Horst schrieb: > Schönen Abend, > > habe wieder einmal ein kleines Problem. Möchte im Terminal ein zeichen > senden und dieses soll wieder empfangen werden. Kannst du senden? (Also nur senden. warum ich frage: Weil das die Eintrittskarte dazu ist, dass die UART Verbdindung erst mal grundsätzlich klappt)
1 | int main(void) { |
2 | uart_init(); |
3 | /*while(1){
|
4 | while (!(UCSR0A & (1<<UDRE0))) { // warten bis Senden moeglich
|
5 | }
|
6 | UDR0 = 'a';
|
7 | //_delay_ms( 10 );
|
8 | }
|
9 | */while(1){ |
10 | while (!(UCSR0A & (1<<RXC0))) { //warten bis Zeichen verfuegbar |
11 | }
|
12 | return UDR0; |
return? Warum return? Wohin möchtest du returnen. Du bist in main(), da gibt es nix mehr, wohin du returnen könntest. Zeichen aus UDR0 abholen (zb in eine Zwischenvariable) und mit dem Schreibecode in umgekehrter Richtung wieder auf den Weg bringen.
> #define UBRR_VAL = ((3686400/(9600*16))-1) > UBRR0L = 0x17; Die Berechung von UBRR_VAL ist fubbes, wenn sie letztendlich nicht benutzt wird. Standardfrage: Läuft dein AVR bestimmt mit 3686400 Hz? D.h. wie sieht die Schaltung aus und wie sind die AVR Fuses gesetzt? Dein main() macht gerade mal einen Versuch exakt ein Zeichen zu empfangen, ohne was mit dem Zeichen zu machen... das ist dünn. Ein Echo in main() könnte so aussehen:
1 | int main(void) |
2 | {
|
3 | uart_init(); |
4 | while(1) |
5 | {
|
6 | char c; |
7 | // Zeichen empfangen
|
8 | while (!(UCSR0A & (1<<RXC0))){} //warten bis Zeichen verfuegbar |
9 | c = UDR0; |
10 | // Zeichen zurücksenden (Echo)
|
11 | while (!(UCSR0A & (1<<UDRE0))){} // warten bis Senden moeglich |
12 | UDR0 = c; |
13 | }
|
14 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.