Forum: Compiler & IDEs Bei Tastendruck -> UART


von ProGrammer! (Gast)


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!

von Falk B. (falk)


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

von Stefan E. (sternst)


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.

von ProGrammer! (Gast)


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!

von Simon K. (simon) Benutzerseite


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

> if (!(UCSRA & (1<<RXC)));

Entferne das Semikolon.

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

Wofür soll das gut sein?

von Falk B. (falk)


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

von ProGrammer! (Gast)


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.

von Falk B. (falk)


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

von ProGrammer! (Gast)


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
}

von Falk B. (falk)


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

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.