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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren