Servus, ich möchte mittels uart_transmit(data) eine LED durch das drücken der taste 'a' ein/ausschalten. Leider finde ich meinen fehler bei folgenden Code nicht. Einfachheitshalber habe ich zunächst nur vor die LED durch das Drücken der Taste a einzuschalten: void uart_init(uint32_t baudrate){ uint16_t ubrr = (F_CPU/8/baudrate)-1; //Set baud rate UBRR0H = (uint8_t)(ubrr>>8); // get higher 8 bits UBRR0L = (uint8_t)(ubrr&0xff); // get lower 8 bits UCSR0A |= (1<<U2X0); UCSR0B = ( 1<<TXEN0 | 1<<RXEN0 ); // select character size, stop and parity bits: 8N1 UCSR0C = (1<<UCSZ01 | 1<<UCSZ00); DDRB = 0x10; PORTB = 0x10; } void uart_transmit (uint8_t data){ while((UCSR0A & (1<< UDRE0)) == 0); if(data == 'a'){ PORTB = 0x20; } UDR0 = data; } LG michi
@ Michi (Gast) >ich möchte mittels uart_transmit(data) eine LED durch das drücken der >taste 'a' ein/ausschalten. Bitte? Das ist so recht sinnlos. Denn normalerweise gibt es einen Sender, meist der PC, der dem Mikrocontroller per RS232 einen Befehl sendet. Also muss man auf dem Mikrocontroller ein Zeichen EMPFANGEN und auswerten, nicht SENDEN! Eher so.
1 | uint8_t uart_receive (){ |
2 | uint8_t tmp; |
3 | |
4 | while( !(UCSR0A & (1<<RXC)) ); // warte aus Empfang |
5 | |
6 | tmp=UDR0; // auslesen |
7 | if(tmp == 'a'){ // prüfen |
8 | PORTB ^= 1<<PB5; // wenn ja, Port toggeln |
9 | }
|
10 | retrun tmp |
11 | }
|
Hallo, hast du schonmal geschaut, ob überhaupt was bei deinem µC ankommt?
1 | DDRB = 0x10; |
2 | PORTB = 0x10; |
Mit diesem Ausdruck möchtest du die Pins für den UART aktivieren? Falls ja, das braucht man nicht. Zudem fehlt eine Endlosschleife mit den Funktionsaufrufen.
Vielen Dank für Eure Antworten, funktioniert nun super. Habe unteranderem auch vergessen in der Main - Methode eine Dauerschleife mit den Methodenaufrunfen recieve und transmit einzubauen (shame on me :P ). letzte Frage hätte ich noch: Wenn ich wissen möchte ob ein Taster aktiviert/ deaktiviert ist, sodass dieser mir per transmit die Wörter ("Ein/Aus") zurückgibt, so müsste ich doch nur folgendes machen oder? PORTD |= (1<<7) // BIT 7 Pullup aktivieren und dann in der receive Methode folgende Bedingung stellen if( (PIND && (1<<7) == 0)) tmp = 'EIN'; leider funktioniert das nicht so recht^^ LG Michi
Du musst bei deiner fehlerbeschreibung auch immer genau sagen was passieren soll bzw. Was nicht passiert Dein. if( (PIND && (1<<7) == 0)) tmp = 'EIN'; das ist erstmal ein und zuviel... Wie Top definiert und wie 'Ein' ?
@ Michi (Gast) >Habe unteranderem auch vergessen in der Main - Methode eine >Dauerschleife mit den Methodenaufrunfen recieve und transmit einzubauen >(shame on me :P ). Welche Methoden? Das ganz banales C, also ein Funktion, nix C++. Lern erstmal die Grundlagen, eh du dich in die C++ Liga begibts. >und dann in der receive Methode folgende Bedingung stellen >if( (PIND && (1<<7) == 0)) tmp = 'EIN'; >leider funktioniert das nicht so recht^^ Da sollte man eine Klammer setzen. Einen impliziten Vergleich mit Null braucht man nicht, es reicht eine logische Auswertung. Ausserdem kann man einer Variabeln in C kaum einen String zuweisen, schon gar nicht, wenn der in einfachen Hochkommas steht. C Grundlagen und so . . .. Siehe Bitmanipulation. Und man sollte den Unterschied zwischen & und && kennen.
1 | if( ( (PIND & (1<<PD7)) ) tmp = 1; // Pin ist high |
2 | if( ( !(PIND & (1<<PD7)) ) tmp = 0; // Pin ist low |
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.