www.mikrocontroller.net

Forum: Compiler & IDEs switch-case Anweisung wird nur im WINAVR-Simulator ausgeführt Nicht auf Hardware ATMega8 (STK500)


Autor: Sebastian Würzer (rufus857)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
als totaler AVR Anfänger habe ich folgendes Problem mit der switch-case 
Anweisung. Dieses kleine Programm habe ich nur zu Testzwecke 
geschrieben. Das funktioniert auch im WINAVR-Simulator einwandfrei, 
jedoch nicht mit meiner AVR-STK500 Hardware.

Was habe ich nicht berücksichtigt?


//---------------------------------------------------------------------- 
---
// Titel : Test1
//---------------------------------------------------------------------- 
---
// Funktion : Test
// Schaltung : div. Versuch
//---------------------------------------------------------------------- 
---
// Prozessor : ATmega8
// Takt : 3686400 Hz
// Sprache : C
// Datum :
// Version :
// Autor : ws
// Programmer/Board: AVRISP MK2 / STK500
// Port : B = Eingabe; D = Ausgabe
//---------------------------------------------------------------------- 
---
//
#define  F_CPU   3686400
#include <avr\io.h>
#include <avr/wdt.h>
#include <util/delay.h>
//---------------------------------------------------------------------- 
--
// Initialisierungen
//---------------------------------------------------------------------- 
--
void init()
{
   // Ports initialisieren
   DDRD = 0b11111111;   // PORTD0 auf Ausgang
   DDRB = 0b00000000;  // PORTB auf Eingang
  PORTB = 0xff;    //PORTB PullUp aktivieren
}
//---------------------------------------------------------------------- 
--
// Main-Funktion
//---------------------------------------------------------------------- 
--
int main(void)
{
  unsigned char x=0;
   init();   // Initialisierungen
   while (1)    // Mainloop-Begin
   {
    x=PINB&0x1f;
    switch (x){
      case 1: {PORTD = 0b11111101;}  break;

      case 2: {PORTD = 0b11110110;}  break;

      case 4: {PORTD = 0b10101010;}  break;
      default: PORTD = 0b01010101;
      }
   } // Mainloop-Ende
}
//---------------------------------------------------------------------- 
-----

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian Würzer schrieb:

> Was habe ich nicht berücksichtigt?

Du schaltest den Port auf Eingang und aktivierst auf allen Pins die 
Pullup Widerstände. Damit wird dir jeder Pin, an dem nichts angeshlossen 
ist, ein 1-Bit liefern.

>     x=PINB&0x1f;
>     switch (x){
>       case 1: {PORTD = 0b11111101;}  break;
>
>       case 2: {PORTD = 0b11110110;}  break;
>
>       case 4: {PORTD = 0b10101010;}  break;
>       default: PORTD = 0b01010101;
>       }
>    } // Mainloop-Ende

Wenn du nicht explizit Hardware angeschlossen hast, die dir die 
restlichen Pins auf 0 ziehen, dann wirst du hier nicht 1, 2 oder 4 
erhalten.

Wenn du einzelne Pins abfragen willst, dann ist die beste Strategie das 
Eingelesene für jede Abfrage einzeln so zu maskieren, dass nur das 
interessierende Bit übrig bleibt.
   x = PINB;

   if( x & 0x01 )
     PORTD = 0b11111101;

   else if( x & 0x02 )
     PORTD = 0b11110110;

   else if( x & 0x04 )
     PORTD = 0b10101010;

   else
     PORTD = 0b01010101;

Du kannst natürlich auch einen switch-case benutzen. Nur solltest du 
dann aber sicherheitshalber von x auch wirklich nur die Bits zum 
Vergleich benutzen, für die du case-Fälle hast bzw. diejenigen, bei 
denen auch tatsächlich etwas extern angeschlossen ist.
     x=PINB&0x1f;
     switch (x & 0x07) {
       case 1:  PORTD = 0b11111101; break;
       case 2:  PORTD = 0b11110110; break;
       case 4:  PORTD = 0b10101010; break;
       default: PORTD = 0b01010101;
     }

Autor: Sebastian Würzer (rufus857)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo Herr Buchegger,
vielen Dank für diesen Hinweis. Das war kein Anfängerfehler wie ich 
glaubte, sondern ein absoluter Aussetzer meinerseits. Habe den Eingang 
darauf hin entsprechend maskiert und schon funktioniert es.

Danke.
Sebastian

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.