Forum: Compiler & IDEs LED mittels uart_transmit ein/ ausschalten


von Michi (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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
}

von al_guesto (Gast)


Lesenswert?

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.

von Michi (Gast)


Lesenswert?

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

von Daniel (Gast)


Lesenswert?

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' ?

von Falk B. (falk)


Lesenswert?

@ 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
Noch kein Account? Hier anmelden.