Forum: Mikrocontroller und Digitale Elektronik [AVR][ATMega8]Problem mit PortB6 und PortB7 als Eingang an Schalter


von Florian S. (floschu)


Lesenswert?

Hallo liebe Mikrocontroller-Gemeinde,

in meinem aktuellen Projekt möchte ich gerne PORTB6 und B7 als Eingänge 
nutzen. An den Ports hängt ein Schalter, der die einzelnen Pins gegen 
Masse schaltet. Dabei gibt es drei Schalterstellungen. In der ersten 
Stellung wird PB6 auf Masse geschaltet, woraufhin eine LED aufleuchtet, 
in der Mittelstellung wird keiner der Pins auf Masse gelegt und in der 
dritten wird PB7 gegen Masse geschaltet.
bei PB7 als auch der Mittelstellung, soll die LED ausgeschaltet sein. 
Später sollen ausgehend von der Stellung verschiedene Zustände 
abgeleitet werden, die LED dient nur zum Testen.
Das Problem besteht nun darin, dass die LED in der Mittelstellung nicht 
ausgeschaltet wird. Durch verschiedene Versuche, die eingehenden Signale 
an den beiden Ports sichtbar zu machen haben ergeben, dass die Ports 
keine eindeutigen Zustände annehmen. D.h. auf einer 
Siebensegment-Anzeige habe ich mir die Zustände der beiden Ports 
ausgeben lassen, und musste eine Überlagerung feststellen. Dies erkennt 
man auch daran, dass sie LED nicht so kräftig leuchtet wie in der ersten 
Stellung, aber auch nicht aus ist, wie in der dritten Schalterstellung.

Elektrische Fehler kann ich mittlerweile ausschließen. Der Schalter 
funktioniert einwandfrei. Außerdem habe ich auch schon einen anderen 
Controller benutzt, um den Fehler durch ein defektes Bauteil 
auszuschließen.

Zudem benutze ich einen Internen RC Oscillator und auch das AS2 Bit ist 
0. Ansonsten würde auch überhaupt keine Eingabe angenommen werden.

Ich habe den kritischen Code mal zusammengefasst:
1
//main --> Initialisierung des Controllers
2
ASSR = (0 << AS2);     // asynchrone Zeitnahme abschalten   
3
      
4
   DDRB  = 0b00010111;    // PORTB0-2 und 4 als Ausgang, PORTB3,5,6-7 sind Eingänge
5
   PORTB = 0b11101000;    // die internen Pull UP Widerstände für die Eingänge aktivieren
6
7
// der Programmteil, in dem das Einlesen und Auswerten des Eingangs erfolgt
8
  
9
if(PINB&0x40)      // PB6 - oben
10
{
11
    sbi(PORTC,2);       
12
}
13
if(PINB&0x80)      // PB7 - unten
14
{
15
    cbi(PORTC,2);
16
}
17
if(!PINB&0x80 && !PINB&0x40)    // Mittelstellung --> beide Pins = 0
18
{                               // DIESER ZUSTAND WIRD NIE ERREICHT
19
    cbi(PORTC,2);
20
}

Bei meinen Tests ist mir aufgefallen, dass die letzte if-Abfrage nie 
TRUE wird, also nie beide Pins gleichzeitig Null sind, was aber wie 
gesagt rein elektrisch aber zutrifft. Es muss sich also um etwas 
Controller-internes handeln. Leider ist es mir ein Rätsel wodurch dieser 
Fehler entsteht.

Ich hoffe jemand kann mir helfen.

MfG
FloSchu

von Pull (Gast)


Lesenswert?

Florian Schulze schrieb:
>
1
> if(!PINB&0x80 && !PINB&0x40)    // Mittelstellung --> beide Pins = 0
2
>
>
> Bei meinen Tests ist mir aufgefallen, dass die letzte if-Abfrage nie
> TRUE wird, also nie beide Pins gleichzeitig Null sind, was aber wie

In Mittelstellung, dadurch offene Eingänge und den internen Pullups, 
ergibt die Abfrage zweimal high.

von Rainer B. (katastrophenheinz)


Lesenswert?

Florian Schulze schrieb:
> > if(!PINB&0x80 && !PINB&0x40)    // Mittelstellung --> beide Pins = 0

Da sind gleich zwei Fehler drin:
- Operatorpräzedenzen: ! hat höhere Präzedenz als & - was passiert also?
  Oder wolltest du bitweise invertieren? Dann ! falscher Operator.
- Wie sollen denn die beiden Pins 0 werden, wenn du die im offenen 
Zustand auf High ziehst?

Gruss, Rainer

: Bearbeitet durch User
von Florian S. (floschu)


Lesenswert?

Vielen Dank für die schnelle Hilfe und Antwort. Es funktioniert jetzt :D
So sieht mein Quellcode jetzt aus:
1
if(!(PINB&0x40))      // PB6 - oben
2
{
3
    sbi(PORTC,2);       
4
}
5
if(!(PINB&0x80))      // PB7 - unten
6
{
7
    cbi(PORTC,2);
8
}
9
if(PINB&0x80 && PINB&0x40)    // Mittelstellung --> beide Pins = 0
10
{                               
11
    cbi(PORTC,2);
12
}
und siehe da, kaum macht mans richtig, schon funktionierts.

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.