Erstes STK500 Pprogramm

Gast #896007
Lesenswert?

Moin

Ich habe mein erstes Programm für den STK500 geschrieben und natürlich 
funktioniert es nicht.

Gedachte Funktion:
Beim drücken der Tasten 1-7 soll die zur Taste gehörende LED angehen und 
beim drücken der Taste 8 sollen alle LEDs ausgehen.
Eigentlich ganz simple dachte ich. Allerdings bin ich nicht nur uC-, 
sondern auch C Anfänger :-(

Tatsächliche Funktion:
Ist ganz schnell beschrieben: es passiert nüscht.

Ich sehe einfach nicht wo hier der Fehler liegt. Das erstellen und 
schreiben der hex Datei ist fehlerfrei gelaufen (bis auf eine Meldung: 
warning: left shift count >= width of type). Kann mir jemand auf die 
Sprünge helfen?

Gruß
Michael

1
#include <avr/io.h>
2

3
int main (void) {
4

5
  DDRA = 0x00;  // alle Pins von Port A sind Eingang (Taster)
6
  PORTA = 0xff;  // alle Pins von Port A PullUp-Widerstand auf high
7
  DDRB = 0xff;  // alle Pins von Port B sind Ausgang (LEDs)
8
  PORTB = 0x00;  // alle Pins von Port B auf Low setzen
9
  
10
  while(1) { 
11
    
12
    // Taste 1 gedrückt
13
    if ( PINA & 0x01 ) {
14
      PORTB |= (1 << 0x01);
15
    } //if
16

17
    // Taste 2 gedrückt
18
    if ( PINA & 0x02 ) {
19
      PORTB |= (1 << 0x02);
20
    } //if
21

22
    // Taste 3 gedrückt
23
    if ( PINA & 0x04 ) {
24
      PORTB |= (1 << 0x04);
25
    } //if
26

27
    // Taste 4 gedrückt
28
    if ( PINA & 0x08 ) {
29
      PORTB |= (1 << 0x08);
30
    } //if
31

32
    // Taste 5 gedrückt
33
    if ( PINA & 0x10 ) {
34
      PORTB |= (1 << 0x10);
35
    } //if
36

37
    // Taste 6 gedrückt
38
    if ( PINA & 0x20 ) {
39
      PORTB |= (1 << 0x20);
40
    } //if
41

42
    // Taste 7 gedrückt
43
    if ( PINA & 0x40 ) {
44
      PORTB |= (1 << 0x40);
45
    } //if
46

47
    // Taste 8 gedrückt
48
    if ( PINA & 0x80 ) {
49
      PORTB = 0x00;
50
    } //if
51

52
  } //while
53

54
return 0;
55
}
#896024
Lesenswert?

Beim STK sind die Eingänge und Ausgänge invertiert.
D.h. ein gedrückter Taster liefert 0 und um einen
Ausgang zu setzen mußt du eine 0 schreiben.

Also so:
1
    // Taste 7 gedrückt
2
    if ( (PINA & 0x40) == 0 ) {
3
      PORTB &= ~(0x40);  //so oder  PORTB &= ~(1 << 6)
4
    } //if
5

6
    // Taste 8 gedrückt
7
    if ( (PINA & 0x80) == 0 ) {
8
      PORTB = 0xff;
9
    } //if
Gast #896105
Lesenswert?

>und bei (PINA & 0xX) gehört für X = 1,2,4,8,16,32,64,128 hin

Also "0x128"?  Oder wie?  Kerl, für X gehören 01, 02, 04, 08, 10, 20, 40 
und 80 hin, womit dann die Zahlen (dezimal) 1, 2, 4, 8, 16, 32, 64, und 
128 in Hexadezimalnotation angegeben sind.  OK?
Gast #896130
Lesenswert?

Danke für die Hilfe.
Ich habe es jetzt die verschiedenen Varianten getestet, aber ohne 
Erfolg.
Ich bin etwas Ratlos...

1.
1
// Taste 1 gedrückt
2
if (( PINA & 0xfe ) == 0 ) {  // 11111110
3
  PORTB |= (1 << 0x01);       // 00000001
4
} //if


2.
1
// Taste 1 gedrückt
2
if (( PINA & 0xfe ) {    // 11111110
3
  PORTB |= (1 << 0x01);  // 00000001
4
} //if


3.
1
    
2
// Taste 1 gedrückt
3
if ( PINA == 0xfe ) {    // 11111110
4
  PORTB |= (1 << 0x01);  // 00000001
5
} //if


4.
1
// Taste 1 gedrückt
2
if ( PINA & 01 ) {    // 11111110
3
  PORTB |= (1 << 0x01);  // 00000001
4
} //if


5.
oder eine Variante die ich noch gefunden habe:
1
// Taste 1 gedrückt
2
if ( PINA & (1<<PINA0 ) ) {  // 11111110
3
  PORTB |= (1 << 0x01);  // 00000001
4
} //if


6.
bei dieser Variante leuchten die LEDs dauernd,
die if-Abfrage müßte also immer true sein...
1
// Taste 1 gedrückt
2
if ( PINA & (1<<PINA0 ) ) {    
3
  PORTB = PINB ^ ( 1 << PB0 );
4
} //if
Gast #896147
Lesenswert?

>(1 << 0x01);       // 00000001

1 << 0x01 ist nicht gleich 1.

1 << 0 ist gleich 1
1 << 1 ist gleich 2
1 << 2 ist gleich 4
1 << 3 ist gleich 8
...
1 << 7 ist gleich 128

Du solltest Dich vielleicht mal über den Operator "<<" informieren.

PS: Eine Stunde Herumexperimentieren kann oft fünf Minuten 
Handbuchlektüre ersparen - oder so...
Gast #896212
Lesenswert?

Der Glaube ist schon da, es funktioniert nur nicht...  ;-)
Egal ob eine Taste gedrückt ist/wurde oder nicht, die LEDs leuchten von 
Anfang an.
1
#include <avr/io.h>
2

3
int main (void) {
4

5
  DDRA = 0x00;  // alle Pins von Port A sind Eingang (Taster)
6
  PORTA = 0xff;  // alle Pins von Port A PullUp-Widerstand auf high
7
  DDRB = 0xff;  // alle Pins von Port B sind Ausgang (LEDs)
8
  PORTB = 0x00;  // alle Pins von Port B auf Low setzen
9
  
10
  while(1) { 
11
  
12
    // Taste 1 gedrückt
13
    if ( ( PINA & 0x01 ) == 0 ){  
14
      PORTB &= ~(0x01);  
15
    } //if
16

17
...
Gast #896221
Lesenswert?

Die STK500 LED´s sind soviel ich weiß auch Low-Aktiv also schaltest du 
die am Anfang an oder seh ich das falsch.

Also als einfachstes versuchs doch erstmal mit einer Taste.
1
#include <avr/io.h>
2

3
int main (void) 
4
{
5
  DDRD = 0x00;  // alle Pins von Port D sind Eingang (Taster)
6
  PORTD = 0xff;  // alle Pins von Port D PullUp-Widerstand auf high
7
  DDRB = 0xff;  // alle Pins von Port B sind Ausgang (LEDs)
8
  PORTB = 0xFF;  // alle Pins von Port B auf High setzen (LEDs OFF)
9
  
10
  while(1)
11
  { 
12
    // Taste 1 gedrückt
13
    if (PIND & (1<<0)) //wenn nicht gedrückt => High wegen pullup
14
    {  
15
      PORTB |= (1<<0); //LED high = LED aus
16
    }
17
    else //Wenn der Taster gedrückt ist
18
    {  
19
      PORTB &= ~(1<<0); //LED low = LED an
20
    }
21
  }
22
}
Ich hab das auch getestet so geht es bei mir auch. Allerdings wollte er 
ers mir nicht mit DDRA kompilieren er meinte das wäre ne unbekannte Fkt. 
Mal an die anderen fehlt da bei mir ein Include? Das müsste doch in der 
avr/io.h drinn sein oder?

Gruß Puppetmaster
Gast #896225
Lesenswert?

>die LEDs leuchten von Anfang an.

Klar.  Du initialisierst PORTB am Anfang mit 0x00.  Das bringt alle LEDs 
zum Leuchten (die LEDs sind vom Portpin gegen VCC geschaltet, deshalb: 
Pin auf Low-Pegel --> LED leuchtet; Pin auf High-Pegel --> LED ist aus).

Anschließend ver-&-est Du den Wert 0x00 bei gedrücktem Taster mit 
irgendwas (bei nicht gedrücktem passiert nichts, d. h. PORTB bleibt 
unverändert).   Wenn Du aber Null mit irgendwas ver-&-est, dann kommt 
immer wieder Null dabei heraus, egal was das "irgendwas" ist.  Deshalb 
bleiben Deines LEDs an.

Das nachzuvollziehen war doch nicht so schwer, oder?
Gast #896325
Lesenswert?

Also ich habe jetzt mal das Beispiel von Puppetmaster per Copy&Paste 
übernommen und die Flachbandkabel angepaßt.

Danach hat es dann funktioniert. Danke an alle für ihre Geduld :-)

Eigentlich wollte ich gestern ja nur mal schnell ein erstes 
Erfolgserlebnis und dann glücklich vor dem Fernseher einschlafen. 
Stattdessen nix als Stress. Man merke sich also: Vor dem Schlafengehen 
nichts mehr essen und erst recht nicht mal eben was programmieren wollen 
(es sei denn man weis was man tut)

Nochmal Danke an alle
Gruß
Michael

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