Problem beim Pin-Abfrage

Gast #3286238
Lesenswert?

Hallo zusammen,

ich schreibe momentan ein über ein Kreuz aus vier Tastern steuerbares 
Snake-Spiel (12x10 LED-Matrix) für einen atmega8. Der µc ist auf einer 
SMD-Platine fest mit der Matrix verbunden, daher muss ich mich mit den 
übrig gebliebenen Pins begnügen. Nun meine Frage: ich muss das 
D-Register gleichzeitig als Input und als Output nutzen, eine andere 
Möglichkeit gibt die feste Pinbelegung nicht her. Kann dies zu Problemen 
führen?

Hier der Ausschnitt aus dem C-Code, der mir Sorgen macht:
1
uint_8 p=1, x=5, y=4;
2

3
DDRD = 0b11110000; //PD0-PD3 inputs, PD4-PD7 outputs?
4
PORTD = 0x00;
5

6
if(((PIND & (1<<0)) == (1<<0))&&p!=2){ //if PD0 high...
7
p=1;
8
}
9
if(((PIND & (1<<1)) == (1<<1))&&p!=1){ //if PD1 high...
10
p=2;
11
}
12
if(((PIND & (1<<2)) == (1<<2))&&p!=4){ //if PD2 high...
13
p=3;
14
}
15
if(((PIND & (1<<3)) == (1<<3))&&p!=3){ //if PD3 high...
16
p=4;
17
}
18

19
if(p==1){
20
x++;
21
}
22
if(p==2){
23
x--;
24
}
25
if(p==3){
26
y++;
27
}
28
if(p==4){
29
y--;
30
}

Aus irgendeinem Grund resultiert das immer in "y++" bzw. "p=3" - so, als 
sei PD2 immer HIGH.
Hat jemand eine Idee weshalb es dazu kommt?
Würde mich freuen, wenn mir jemand weiterhelfen könnte.

Ich habe das Snake-Programm mal auf einen steuerbaren Punkt herunter 
gebrochen und in den Anhang gepackt - das Problem existiert nach wie vor 
– der Punkt bewegt sich auf der Matrix immer in Richtung y++ und lässt 
sich nicht steuern.

Gruß
Angehängte Dateien:
Gast #3286471
Lesenswert?

amateur schrieb:
> Pin A1 erkennen
> if (( PINA & (1<<A1)) != 0) ...       // oder == 0 ... dem nach je
> ist "lesbarer".

Okay, darauf werde ich in Zukunft achten.

Lothar Miller schrieb:
> Iron Maiden schrieb:
>> als sei PD2 immer HIGH.
> Ist er das nicht?
>
> Irgendwie passt dein Codeschnipsel und die angehängte Datei nicht
> zusammen:if(p==3){
>   y++;
> }
> if(p==4){
>   y--;
> }
> vs.      if(p==3){
>         y--;
>       }
>       if(p==4){
>         y++;
>       }
> Was denn nu?

PD2 sollte durch den offenen Taster auf GND liegen... 
+5V__/__PD2__4k7__GND
Dass der Code nicht übereinstimmt, sollte nicht stören. Es ist egal, ob 
ich y++, y--, x++ oder x-- in if(p==3){...} schreibe - es ist immer so 
als ob PD2 high ist, sprich es kommt dann halt z.B. immer y-- statt 
y++...
Gast #3286571
Lesenswert?

Lothar Miller schrieb:
> Iron Maiden schrieb:
>> PD2 sollte durch den offenen Taster auf GND liegen...
> Tut er das auch? Hast du ein Messgerät?
>
>> +5V__/__PD2__4k7__GND
> Warum schließt du den Taster nicht so an, dass der interne Pullup
> verwendet werden könnte?

... habe gerade nachgemessen und tatsächlich: D2 ist aus irgendeinem 
Grund +5V, obwohl D2 mit "DDRD = 0b11110000; PORTD=0x00;" wohl eindeutig 
input und low ist, der fehler muss dann whol bei der Hardware liegen.

Vielen dank für den Hinweis und sorry, hätte wohl selbst drauf kommen 
sollen.

Thomas Eckmann schrieb:
> Iron Maiden schrieb:
>> amateur schrieb:
>>> Pin A1 erkennen
>>> if (( PINA & (1<<A1)) != 0) ...       // oder == 0 ... dem nach je
>>> ist "lesbarer".
>>
>> Okay, darauf werde ich in Zukunft achten.
> Das vergiss mal ganz schnell wieder.
>
>
1
> if(PINA & (1 << A1))    //Pin = 1
2
> {
3
> }
4
> //oder
5
> if(!(PINA & (1 << A1))) //Pin = 0
6
> {
7
> }
8
>
> mfg.

Dachte er meint, dass ich statt (1<<3) generell (1<<PA3) schreiben soll, 
da lesbarer...
Gast #3286618
Lesenswert?

Hi

>... habe gerade nachgemessen und tatsächlich: D2 ist aus irgendeinem
>Grund +5V, obwohl D2 mit "DDRD = 0b11110000; PORTD=0x00;" wohl eindeutig
>input und low ist, der fehler muss dann whol bei der Hardware liegen.

Das interpretierst du falsch. D2 ist ein Eingang. Der Wert im 
Portregister hat für D2 nur eine Wirkung wenn er 1 ist. Dann ist der 
interne Pull-Up-Widerstand eingeschaltet. Bei einer 0 im Portregister 
ist der Eingang offen und kann jeden Wert annehmen.

MfG Spess

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren