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