Forum: Mikrocontroller und Digitale Elektronik Erstes STK500 Pprogramm


von Michael (Gast)


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
}

von Werner A. (homebrew)


Lesenswert?

Die Tasten sind anders angeschlossen.
Du musst glaub ich so abfragen:
1
   if (PINB==0xFE)    //wenn Taste1 gedrückt
2
   {  
3
      PORTB |= (1 << 0x01);
4
   } //if

von AVRFan (Gast)


Lesenswert?

>PORTB |= (1 << 0x08)
>PORTB |= (1 << 0x10)
>PORTB |= (1 << 0x40)

                 /\
        Hierhin  ||  gehören BitNUMMERN (0, 1, 2 ... 7), keine 
Bitmasken!

von 900ss (900ss)


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

von Werner A. (homebrew)


Lesenswert?

@AVRFan
klar, dass auch noch
also eher so:
1
   if (PINB==0xFE)    //wenn Taste1 gedrückt
2
   {  
3
      PORTB |= 0x01;
4
   } //if

von Thomas (Gast)


Lesenswert?

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

von AVRFan (Gast)


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?

von Michael (Gast)


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

von AVRFan (Gast)


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...

von 900ss (900ss)


Lesenswert?

Ich wiederhole mich jetzt.....
Beitrag "Re: Erstes STK500 Pprogramm"
Glaube es einfach :-)

von Michael (Gast)


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
...

von Puppetmaster (Gast)


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

von AVRFan (Gast)


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?

von Otto (Gast)


Lesenswert?

Sind beide Flachbandkabel (Taster und LED) denn überhaupt richtig 
aufgesteckt ?

Gruss Otto

von Michael (Gast)


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

von 900ss (900ss)


Lesenswert?

Das wäre mir sicher genauso gegangen.
Computer in Verbindung mit AVRs sind ein schwarzes Loch für Zeit :-)

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.