www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Erstes STK500 Pprogramm


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

#include <avr/io.h>

int main (void) {

  DDRA = 0x00;  // alle Pins von Port A sind Eingang (Taster)
  PORTA = 0xff;  // alle Pins von Port A PullUp-Widerstand auf high
  DDRB = 0xff;  // alle Pins von Port B sind Ausgang (LEDs)
  PORTB = 0x00;  // alle Pins von Port B auf Low setzen
  
  while(1) { 
    
    // Taste 1 gedrückt
    if ( PINA & 0x01 ) {
      PORTB |= (1 << 0x01);
    } //if

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

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

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

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

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

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

    // Taste 8 gedrückt
    if ( PINA & 0x80 ) {
      PORTB = 0x00;
    } //if

  } //while

return 0;
}

Autor: Werner A. (homebrew)
Datum:

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

Autor: AVRFan (Gast)
Datum:

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

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

Autor: 900ss D. (900ss)
Datum:

Bewertung
0 lesenswert
nicht 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:
    // Taste 7 gedrückt
    if ( (PINA & 0x40) == 0 ) {
      PORTB &= ~(0x40);  //so oder  PORTB &= ~(1 << 6)
    } //if

    // Taste 8 gedrückt
    if ( (PINA & 0x80) == 0 ) {
      PORTB = 0xff;
    } //if

Autor: Werner A. (homebrew)
Datum:

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

Autor: Thomas (Gast)
Datum:

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

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Michael (Gast)
Datum:

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

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


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


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


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


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


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

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: 900ss D. (900ss)
Datum:

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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <avr/io.h>

int main (void) {

  DDRA = 0x00;  // alle Pins von Port A sind Eingang (Taster)
  PORTA = 0xff;  // alle Pins von Port A PullUp-Widerstand auf high
  DDRB = 0xff;  // alle Pins von Port B sind Ausgang (LEDs)
  PORTB = 0x00;  // alle Pins von Port B auf Low setzen
  
  while(1) { 
  
    // Taste 1 gedrückt
    if ( ( PINA & 0x01 ) == 0 ){  
      PORTB &= ~(0x01);  
    } //if

...

Autor: Puppetmaster (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <avr/io.h>

int main (void) 
{
  DDRD = 0x00;  // alle Pins von Port D sind Eingang (Taster)
  PORTD = 0xff;  // alle Pins von Port D PullUp-Widerstand auf high
  DDRB = 0xff;  // alle Pins von Port B sind Ausgang (LEDs)
  PORTB = 0xFF;  // alle Pins von Port B auf High setzen (LEDs OFF)
  
  while(1)
  { 
    // Taste 1 gedrückt
    if (PIND & (1<<0)) //wenn nicht gedrückt => High wegen pullup
    {  
      PORTB |= (1<<0); //LED high = LED aus
    }
    else //Wenn der Taster gedrückt ist
    {  
      PORTB &= ~(1<<0); //LED low = LED an
    }
  }
}
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

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sind beide Flachbandkabel (Taster und LED) denn überhaupt richtig 
aufgesteckt ?

Gruss Otto

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: 900ss D. (900ss)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.