mikrocontroller.net

Forum: Compiler & IDEs Bei Tastendruck -> UART


Autor: ProGrammer! (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum schickt diese Routine beim Tastendruck am STK500 kein Zeichen über 
den UART an meinen PC?

Die andere switch-Anweisung klappt soweit, damit steuere ich eine LED am 
STK500 von einem von mir geschriebenen Programm am PC.



#include <avr/io.h>

void main (void)
{
  
  DDRA = 0x00;              //PORTA = Eingang
  DDRC = 0xFF;
  

  char c=0;

  UCSRB |= (1<<RXEN) | (1<<TXEN);
  UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);

  UBRRH = 00;                       //Baudrate einstellen 9600 bei 8 Mhz
  UBRRL = 51;

  PORTC = 0xFF;
  
  while( 1 ) 
  {
    while (!(UCSRA & (1<<RXC)));
                                     //warten bis ein Zeichen ankommt

    c = UDR;
  
  
  if (PINA == 0x7F)          //wenn irgendein Taster gedrückt wird....
  {
    while (!(UCSRA & (1<<UDRE)));   //ist die Sendestufe bereit? 
      UDR = 5;               //dann schicke 5 über UART
  }
  switch (c)
  {
    case '1':
      PORTC = 0x7F;
      break;
    case '0':
      PORTC = 0xFF;
      break;
  }                      
    
  
                  
  }
}





Vielen Dank!

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ ProGrammer! (Gast)

>Warum schickt diese Routine beim Tastendruck am STK500 kein Zeichen über
>den UART an meinen PC?

- weil es erst auf ein Zeichen vom PC wartet
- weil die internen Pull-Ups nciht aktiviert sind, PORTA=0xFF
- weil deine Abfrage nur dann ein zeichen sendet, wenn PA7 auf LOW liegt 
und alle andern auf HIGH

MFG
Falk

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> if (PINA == 0x7F)          //wenn irgendein Taster gedrückt wird....

"==" und "irgendein" widersprechen sich eigentlich.
Da ich die Hardware des STK500 nicht kenne und du auch keine weiteren 
Angaben dazu gemacht hast, kann ich dir nicht sagen, ob der Vergleich 
richtig ist.

Davon abgesehen wird in der Endlosschleife so lange gewartet, bis ein 
Zeichen per UART eintrifft. Wenn keine Zeichen kommen, werden auch die 
Tasten nicht ausgewertet.

Autor: ProGrammer! (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oki danke für die Hilfe

Habe jetzt aber folgendes Problem:

 Wenn ich zuerst eine '1' vom Terminal an das STK schicke und 
anschließend eine '0' dann ignoriert er die null und schaltet bei der 
NÄCHSTEN '1' die LED aus, obwohl er sie ja da einschalten sollte?!

Warum ist das so?

Die PullUps habe ich jetzt noch nicht umgeschaltet, einfach in 
invertierter Logik denken. 0x7F ist in meinem Fall dann der Taster 0x01 
;)

Hier der Code


#include <avr/io.h>

void main (void)
{
  
  DDRA = 0x00;              //PORTA = Eingang
  DDRC = 0xFF;
  

  char c=0;

  UCSRB |= (1<<RXEN) | (1<<TXEN);
  UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);

  UBRRH = 00;                       //Baudrate einstellen 9600 bei 8 Mhz
  UBRRL = 51;

  PORTC = 0xFF;
  
  while( 1 ) 
  {
    if (!(UCSRA & (1<<RXC)));
    {
      c = UDR;
    switch (c)
    {
    case '1':
      PORTC = 0x7F;
      break;
    case '0':
      PORTC = 0xFF;
      break;
    }
    UCSRA &= ~(1<<RXC);            
  }
  
  if (PINA == 0x7F)          //wenn irgendein Taster gedrückt wird....
  {
    while (!(UCSRA & (1<<UDRE)));   //ist die Sendestufe bereit? 
      UDR = 5;               //dann schicke 5 über UART
  }
            
    
  
                  
  }
}



Vielen Dank!

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Ernst wrote:
>> if (PINA == 0x7F)          //wenn irgendein Taster gedrückt wird....
>
> "==" und "irgendein" widersprechen sich eigentlich.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> if (!(UCSRA & (1<<RXC)));

Entferne das Semikolon.

> UCSRA &= ~(1<<RXC);

Wofür soll das gut sein?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ ProGrammer! (Gast)

>Die PullUps habe ich jetzt noch nicht umgeschaltet, einfach in
>invertierter Logik denken. 0x7F ist in meinem Fall dann der Taster 0x01
>;)

Du sollst vielleicht mal klein anfangen und es mit normaler Logik 
versuchen?!? Ohne Pull-Ups wird dein PA7 nie mehr HIGH sehen. Siehe

http://www.mikrocontroller.net/articles/AVR-Tutori...

Und auch Bitmanipulation wäre lohnenswert für dich.

MFG
Falk

Autor: ProGrammer! (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Simon K.

Sorry, mein Fehler, aber Kommentare werden vom Compiler ja bekanntlich 
"übersehen" ;-)



@ Falk Brunner

Der Taster funktioniert ja soweit, also das Senden an den PC, was mich 
nur wurmt ist, dass er nun nicht mehr in der Richtigen Reihenfolge die 
LED Ein und AUS macht, wenn ich vom PC aus eine "1" und eine "0" 
schicke.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ ProGrammer! (Gast)

>Der Taster funktioniert ja soweit, also das Senden an den PC, was mich
>nur wurmt ist, dass er nun nicht mehr in der Richtigen Reihenfolge die
>LED Ein und AUS macht, wenn ich vom PC aus eine "1" und eine "0"
>schicke.

Was soll das?

UCSRA &= ~(1<<RXC);

MFG
Falk

Autor: ProGrammer! (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
damit wollte ich den empfangspuffer zurücksetzen, damit er nicht in der 
If-Anweisung festhängt.


Ach ich weiß nicht weiter, ich hänge auch in der if-anweisung.....

jetzt klappt nicht mal mehr das steuern von den LEDs vom PC aus.


#include <avr/io.h>

void main (void)
{
  
  DDRA = 0x00;              //PORTA = Eingang
  DDRC = 0xFF;
  

  char c=0;

  UCSRB |= (1<<RXEN) | (1<<TXEN);
  UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);

  UBRRH = 00;                       //Baudrate einstellen 9600 bei 8 Mhz
  UBRRL = 51;

  PORTC = 0xFF;
  
  while( 1 ) 
  {
    if (!(UCSRA & (1<<RXC)))
    {
      c = UDR;
    switch (c)
    {
      case '1':
        PORTC = 0x7F;
        break;
      case '0':
        PORTC = 0xFF;
        break;
    }
              
  }
  
  if (PINA == 0x7F)          //wenn irgendein Taster gedrückt wird....
  {
    while (!(UCSRA & (1<<UDRE)));   //ist die Sendestufe bereit? 
      UDR = 5;               //dann schicke 5 über UART
  }
            
    
  
                  
  }
}


Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ ProGrammer! (Gast)

>damit wollte ich den empfangspuffer zurücksetzen, damit er nicht in der
>If-Anweisung festhängt.

Du solltest dich mal mit den Grundlagen vertraut machen.

AVR-Tutorial: UART

Und planloses Rumändern im Quellcode ist sinnlos.


#include <avr/io.h>

void main (void)
{
  
  DDRA = 0x00;              //PORTA = Eingang
  DDRC = 0xFF;
  

  char c=0;

  UCSRB |= (1<<RXEN) | (1<<TXEN);
  UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);

  UBRRH = 00;                       //Baudrate einstellen 9600 bei 8 Mhz
  UBRRL = 51;

  PORTC = 0xFF;
  
  while( 1 ) 
  {
    if ((UCSRA & (1<<RXC)))
    {
      c = UDR;
      switch (c)
      {
        case '1':
          PORTC = 0x7F;
          break;
        case '0':
          PORTC = 0xFF;
          break;
      }        
    }
  
    if (!(PINA & (1<<PA7)))          //wenn Taster PA7 gedrückt wird....
    {
      while (!(UCSRA & (1<<UDRE)));   //ist die Sendestufe bereit? 
      UDR = '5';               //dann schicke 5 über UART
    }              
  }
}

MFG
Falk

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.