Bei Tastendruck -> UART

Gast #946317
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.


1
#include <avr/io.h>
2

3
void main (void)
4
{
5
  
6
  DDRA = 0x00;              //PORTA = Eingang
7
  DDRC = 0xFF;
8
  
9

10
  char c=0;
11

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

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

18
  PORTC = 0xFF;
19
  
20
  while( 1 ) 
21
  {
22
    while (!(UCSRA & (1<<RXC)));
23
                                     //warten bis ein Zeichen ankommt
24

25
    c = UDR;
26
  
27
  
28
  if (PINA == 0x7F)          //wenn irgendein Taster gedrückt wird....
29
  {
30
    while (!(UCSRA & (1<<UDRE)));   //ist die Sendestufe bereit? 
31
      UDR = 5;               //dann schicke 5 über UART
32
  }
33
  switch (c)
34
  {
35
    case '1':
36
      PORTC = 0x7F;
37
      break;
38
    case '0':
39
      PORTC = 0xFF;
40
      break;
41
  }                      
42
    
43
  
44
                  
45
  }
46
}



Vielen Dank!
#946355
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
#946358
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.
Gast #946392
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
1
#include <avr/io.h>
2

3
void main (void)
4
{
5
  
6
  DDRA = 0x00;              //PORTA = Eingang
7
  DDRC = 0xFF;
8
  
9

10
  char c=0;
11

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

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

18
  PORTC = 0xFF;
19
  
20
  while( 1 ) 
21
  {
22
    if (!(UCSRA & (1<<RXC)));
23
    {
24
      c = UDR;
25
    switch (c)
26
    {
27
    case '1':
28
      PORTC = 0x7F;
29
      break;
30
    case '0':
31
      PORTC = 0xFF;
32
      break;
33
    }
34
    UCSRA &= ~(1<<RXC);            
35
  }
36
  
37
  if (PINA == 0x7F)          //wenn irgendein Taster gedrückt wird....
38
  {
39
    while (!(UCSRA & (1<<UDRE)));   //ist die Sendestufe bereit? 
40
      UDR = 5;               //dann schicke 5 über UART
41
  }
42
            
43
    
44
  
45
                  
46
  }
47
}


Vielen Dank!
#946500
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-Tutorial:_IO-Grundlagen#Pullup-Widerstand

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

MFG
Falk
Gast #946560
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.
#946568
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
Gast #946573
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.

1
#include <avr/io.h>
2

3
void main (void)
4
{
5
  
6
  DDRA = 0x00;              //PORTA = Eingang
7
  DDRC = 0xFF;
8
  
9

10
  char c=0;
11

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

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

18
  PORTC = 0xFF;
19
  
20
  while( 1 ) 
21
  {
22
    if (!(UCSRA & (1<<RXC)))
23
    {
24
      c = UDR;
25
    switch (c)
26
    {
27
      case '1':
28
        PORTC = 0x7F;
29
        break;
30
      case '0':
31
        PORTC = 0xFF;
32
        break;
33
    }
34
              
35
  }
36
  
37
  if (PINA == 0x7F)          //wenn irgendein Taster gedrückt wird....
38
  {
39
    while (!(UCSRA & (1<<UDRE)));   //ist die Sendestufe bereit? 
40
      UDR = 5;               //dann schicke 5 über UART
41
  }
42
            
43
    
44
  
45
                  
46
  }
47
}
#946576
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.


1
#include <avr/io.h>
2

3
void main (void)
4
{
5
  
6
  DDRA = 0x00;              //PORTA = Eingang
7
  DDRC = 0xFF;
8
  
9

10
  char c=0;
11

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

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

18
  PORTC = 0xFF;
19
  
20
  while( 1 ) 
21
  {
22
    if ((UCSRA & (1<<RXC)))
23
    {
24
      c = UDR;
25
      switch (c)
26
      {
27
        case '1':
28
          PORTC = 0x7F;
29
          break;
30
        case '0':
31
          PORTC = 0xFF;
32
          break;
33
      }        
34
    }
35
  
36
    if (!(PINA & (1<<PA7)))          //wenn Taster PA7 gedrückt wird....
37
    {
38
      while (!(UCSRA & (1<<UDRE)));   //ist die Sendestufe bereit? 
39
      UDR = '5';               //dann schicke 5 über UART
40
    }              
41
  }
42
}

MFG
Falk

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.