Forum: Mikrocontroller und Digitale Elektronik Problem beim Pin-Abfrage


von Iron Maiden (Gast)


Angehängte Dateien:

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ß

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Iron Maiden schrieb:
> als sei PD2 immer HIGH.
Ist er das nicht?

Irgendwie passt dein Codeschnipsel und die angehängte Datei nicht 
zusammen:
1
if(p==3){ 
2
  y++;
3
}
4
if(p==4){
5
  y--;
6
}
vs.
1
      if(p==3){
2
        y--;
3
      }
4
      if(p==4){
5
        y++;
6
      }
Was denn nu?

von amateur (Gast)


Lesenswert?

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

von Iron Maiden (Gast)


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++...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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?

von Thomas E. (thomase)


Lesenswert?

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
}
mfg.

von Iron Maiden (Gast)


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...

von Spess53 (Gast)


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

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.