mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme beim Einlesen vom Dip-Schalter


Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen, Ich möchte den Wert eines Dipschalters einlesen. Dieser 
hat 8 schalter und belegt so genau den Port B des Atmega8. im 
Mainprogramm, vor der Programmschleife initialisiere ich nun die Ports 
und lese den wert von Port B ein. Dieser wird in eine uint8_t variable 
geschrieben. Dann beginnt das eigentliche Programm in der while(1).
Jedoch wird der auf dem Dipschalter binär eingestellte wert nur manchmal 
nach dem reset des kontrollers übernommen, jedoch nicht bei jedem 
reset/startup. kann mir jemand sagen, warum?

#include <avr/io.h> 
             
uint8_t wert;

int main (void) 
{            
 
   DDRB  = 0x00;  //Data Direction Register Port B als input           
   PORTB = 0xff;  //Interne Pullup Widerstände für B aktivieren

   wert = (~PINB);  
   while(1)
   {
    //hier ist der Rest des programms
   }

return 0;  
} 

Autor: hans Flip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
pull-up ?

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marco schrieb:
> wert = (~PINB);

so:
wert = PINB;

mfg.

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke schonmal für die hilfe.

Thomas Eckmann, Da ich pullup widerstände benutzte liegt an den ports 
bei schalterstellung "0" eine Logische "1". Daher dachte ich, der Port 
muss Bitweise Invertiert werden, damit die logische 0 am eingang auch 
der 0 im register entspricht. Diese Annahme ist doch richtg, oder? 
Verwunderlich finde ich ja, dass es machchmal nach dem startup/reset des 
controllers funktioniert und ein wert eingelesen wird und manchmal 
nicht.

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Diese Annahme ist doch richtg, oder?
Ja (richtig).

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Verwunderlich finde ich ja, dass es machchmal nach dem startup/reset des
>controllers funktioniert und ein wert eingelesen wird und manchmal
>nicht.

Warte mal ein bisschen nach einschalten der Pullups.
Deine Schaltungskapazitäten wollen auch aufgeladen werden;)

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so, ich habe das programm jetzt modifiziert:

#include <avr/io.h> 
#define F_CPU 1000000     /* Interner oszillator mit 1.0000 Mhz */         
#include <util/delay.h>  
           
uint8_t wert;

int main (void) 
{            
 
   DDRB  = 0x00;  //Data Direction Register Port B als input           
   PORTB = 0xff;  //Interne Pullup Widerstände für B aktivieren
   DDRC  = 0xff;  //Data Direction Register Port C als output 
   PORTC = 0x00;  //alle Portpins C auf NULL setzen

 
   _delay_ms(100);
   wert = (~PINB);  

   while(1)
   {
    if (wert==2)            //testprogramm
      {PORTC = 0xff}
   }

return 0;  
} 
 


ich habe als Beispiel am dipschalter 00000010 eingestellt, also eine 2. 
wenn die 2 eingelesen wurde gehen leds an portC an. bevor der Wert 
eingelesen wird habe ich noch eine 100ms pause verbaut. Allerdings 
bleibt das problem dass in der hälfte der fälle kein Wert eingelesen 
wird.

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

Bewertung
0 lesenswert
nicht lesenswert
Dann, denke ich, wird es Zeit sich mit der Schaltung zu beschäftigen.
Wie sieht die aus?

PS: Dein gepostetes Programm enthält einen Syntaxfehler. Bist du sicher, 
dass du den bei dir korrigiert hast und damit auch das richtige Programm 
in den µC gebrannt hast?

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eine Schaltung existiert praktisch nicht. Der AVR steckt im STK 500 und 
ich verwende die LEDs des boards. dann greife ich mir einem 
Wannenstecker den Port B auf dem STK500 ab und ziehe die Portpins per 
Dipschalter auf GND.

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger, welcher Syntaxfehler ist gemient? Ich sehe 
keinen:)

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

Bewertung
0 lesenswert
nicht lesenswert
Marco schrieb:
> eine Schaltung existiert praktisch nicht. Der AVR steckt im STK 500 und
> ich verwende die LEDs des boards. dann greife ich mir einem
> Wannenstecker den Port B auf dem STK500 ab und ziehe die Portpins per
> Dipschalter auf GND.

OK.

Was ist mit dem Syntax-Fehler?

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wo ist denn der syntaxfehler? ich sehe irgendwie keinen;)

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

Bewertung
0 lesenswert
nicht lesenswert
Marco schrieb:
> wo ist denn der syntaxfehler? ich sehe irgendwie keinen;)


Dein Compiler sagt ihn dir.

Im Ernst: Du musst auf solche Dinge achten. Ausnahmslos immer nach dem 
Build Vorgang dsas Ausgabefenster studieren, ob es irgendwo einen Fehler 
gab. Sonst brennst du ständig ein altes HEX_File in den µC und wunderst 
dich, warum deine Programmänderungen nichts bewirken.

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

Bewertung
0 lesenswert
nicht lesenswert
     {PORTC = 0xff}

hier fehlt ein ;

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achso, hab das ; vergessen. Ich habs gefunden, danke. Aber das ist nur 
im Forum falsch, nicht im Programm. Also ich fürchte, daran liegts auch 
nicht

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marco schrieb:
> Diese Annahme ist doch richtg, oder?

Das ist richtig. Kann man natürlich so machen. Ich denke allerdings 
immer Low-Aktiv.
Ich hab das mal mit Tilde ausprobiert, hab' ich noch nie so gemacht. 
Funktioniert, auch ohne Delay. Mit oder ohne invertieren.
Da ist viellecht irgendwas anderes nicht in Ordnung.
Stützkondensator, Lötfehler etc. ?

Marco schrieb:
> Allerdings
>
> bleibt das problem dass in der hälfte der fälle kein Wert eingelesen
>
> wird.

Wird denn kein Wert, ich vermute mal du meinst damit 0, eingelesen oder 
wird irgendwas gelesen?


Ändere das mal:

Marco schrieb:
> if (wert==2)            //testprogramm
>
>       {PORTC = 0xff}

  PORTC = wert;

damit du siehst was da reinkommt.

mfg.

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

Bewertung
0 lesenswert
nicht lesenswert
Marco schrieb:
> achso, hab das ; vergessen. Ich habs gefunden, danke. Aber das ist nur
> im Forum falsch, nicht im Programm.

Du bist neu hier.
Drum sei dir gesagt, dass die Forenteilnehmer so etwas gar nicht gerne 
sehen, wenn du Code hier präsentierst, der so nie auf deiner Hardware 
gelaufen ist.
Denn dann suchen (und finden) wir Fehler, die im richtigen Code gar 
nicht existieren. Sprich: Wir machen uns Arbeit für nichts.

Wenn du deinen Code immer per Cut&Paste aus deinem Programmeditor 
übernimmst, dann kann das nicht passieren.

> Also ich fürchte, daran liegts auch
> nicht

Mach mal folgendes:
An Port B sind ja auch die Anschlüsse für eine externe Taktversorgung.

Ändere deine Abfrage mal so um, dass tatsächlich wirklich nur der eine 
DIP-Schalter abgefragt wird und der Rest des Port-Zustandes egal ist.
   while(1)
   {
     if (wert & 0x02)            //testprogramm
     {
       PORTC = 0xff;
     }
   }


Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> per Cut&Paste

ja, werd ich demnächst auch machen, war nur das problem dass mein 
programmierpc kein internet hatte. aber demnächst ächte ich da drauf.

naja, und zum problem: Ich jetzt den DipSchalter einfach an PortD hängen 
und da läuft alles. Vielen dank nochmal.

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.