Forum: Mikrocontroller und Digitale Elektronik Pin-Abfrage Probleme bei Atmega32-Verbindung


von Jakob (Gast)


Lesenswert?

Hallo, ich habe ein Problem.

Vor weg, was will ich machen ?

Habe ein Atmega32 der mit ein Display als Codeschloss funktioniert oder 
andere Funktionen. Angeschlossen ist eine 3x4 Tastatur. Und einen 
LED-Cube mit einem Atmega32.

Nun möchte ich dass, wenn ich auf meinen "Codeschloss" eine Auswahl 
treffe das der Led-Cube das Muster abspielt....Was habe ich gemacht ? 
Freien Pin vom "Codeschloss" Atmega32 mit dem Led_Cube verbunden (PD5). 
Auch GND Verbunden.

Wenn ich nun wenn ich auf dem CS auswähle das der Cube Starten soll 
passiert nix, die 5V High Signal liegt aber an...

Ich denke mal das ich einfach iwo ein Denk-Fehler drinnen habe.




Code :

in der Main:
1
char test=PIND;
2
3
for(int e=0;e<10000;e++)
4
    {
5
      if(test==0b00100000)
6
      {
7
        e=10000;
8
      }
9
      _delay_ms(4);
10
    }
so habe auch noch eine Tastatur Routine gestet aber auch mit wenig 
Erfolg :
1
void scan_key () {
2
  
3
  
4
unsigned  char key1,key2; 
5
  key1 = PORTD;
6
  key1 ^= 0b11011111;
7
  key1 &= 0b11011111;
8
  if (key1 != 0){
9
  _delay_ms(4);
10
    key2 = PORTD;
11
    key2 ^=0b11011111;
12
    key2 &=0b11011111;
13
    if ((key1 == key2) & (key1 != lastkey)) {
14
      lastkey = key1;
15
      if (keybuf == 0){
16
        keybuf = key1; 
17
    }
18
  }  
19
  }
20
  else lastkey = 0;  
21
  }
22
/*---------------------------------------------------------------------------
23
 readkey(): Liefert den gelesenen Tastaturwert zurück                             
24
---------------------------------------------------------------------------*/
25
char readkey()
26
{
27
  char a;
28
  a = keybuf;
29
  if(a != 0) 
30
  {
31
  keybuf = 0;
32
  return(a);
33
  } 
34
};

in der Main:
1
for(int e=0;e<10000;e++)
2
    {
3
      if(readkey()==1)
4
      {
5
        e=10000;
6
      }
7
      _delay_ms(4);
8
    }




''Wenn der die Taste gedrückt wird soll er aus der Schleife 
rausspringen..(Nur zum Test wecken eine for Schleife)

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

1
char test=PIND;
2
3
for(int e=0;e<10000;e++)
4
    {
5
      if(test==0b00100000)
6
      {
7
        e=10000;
8
      }
9
      _delay_ms(4);
10
    }

kompliziert geschrieben.

Das hier

      if(test==0b00100000)

willst du mit Sicherheit nicht. Denn das bedeutet, dass an diesem Port 
ALLE Bits genau wie vorgesehen stehen müssen. Nicht nur das eine Bit, an 
dem dein Taster hängt (der offenbar an PD5 hängt).

Zum anderen: wie soll denn test innerhalb der Schleife jemals seinen 
Wert ändern können? Es kriegt vor der Schleife seinen Wert von PIND und 
auch wenn du 10 Millionen mal abfragst, dieser Wert ändert sich nicht.

Wenn schon dann
1
    for(int e=0;e<10000;e++)
2
    {
3
      if( PIND & ( 1 <<PD5) )
4
      {
5
        e=10000;
6
      }
7
      _delay_ms(4);
8
    }
so wie man eben Taster abfragt und wie man das in den Vorübungen zur 
Programmierung mit LED und Taster zur Genüge gelernt hat, ehe man dann 
seinen ersten Cube baut.

von Karl H. (kbuchegg)


Lesenswert?

1
void scan_key () {
2
  
3
  
4
unsigned  char key1,key2; 
5
  key1 = PORTD;

PIND


PORTD ist für die Ausgabe. PIND für die Eingabe.

von Karl H. (kbuchegg)


Lesenswert?

> Ich denke mal das ich einfach iwo ein Denk-Fehler drinnen habe.

Ich denke mal du solltest deinen Cube beiseite legen und erst mal mit 
den Grundlagen, wie sie in jedem Tutorial beschrieben sind, anfangen.
Portpins sicher und zuverlässig programmieren zu können, sowohl als 
Output Pin als auch als Input Pin, ist das kleine Einmal Eins in der 
µC-Programmierung. Solange das nicht 100% sitzt, hat es keinen Sinn, da 
irgendwas komplexeres zu bearbeiten.

AVR-GCC-Tutorial

: Bearbeitet durch User
von Jakob (Gast)


Lesenswert?

SEHR VIELEN DANK =)

Karl Heinz ! Funktioniert jetzt ^^ Mein Projekt kann weiter gehen

von Jakob (Gast)


Lesenswert?

Den Cube habe ich schon lange fertig und auch alles verstanden !

Mit dem Codeschloss ( Tastatur + Atmega32 + Display ) bin ich dran, um 
mir das etwas unterhaltsamer zumachen verbinde ich diese !

Ich habe jetzt nach über ein halben Jahr wieder angefangen und muss mich 
erstmal wieder rein arbeiten ;)

von Karl H. (kbuchegg)


Lesenswert?

Jakob schrieb:
> Den Cube habe ich schon lange fertig und auch alles verstanden !

Mit Verlaub: das glaub ich nicht.
(also das du alles verstanden hast, das er funktioniert glaub ich dir, 
wenn du das Programm kopiert hast)

von Jakob (Gast)


Lesenswert?

Nein..habe ich nicht..ist ja auch egal...bei mir harkt es noch mit dem 
Port/Pin abfragen. Der Cube ist ne andere Geschichte...

von ConvertsQuestionsToAnswers (Gast)


Lesenswert?

Erlaube mir den Rat, Deine Kenntnisse, soweit Du sie früher erworben 
hast, noch einmal aufzufrischen.

Einer das "ALLES" verstanden hat schreibt auch nicht:
1
    for(int e=0;e<10000;e++)
2
    {
3
      if( PIND & ( 1 <<PD5) )
4
      {
5
        e=10000;
6
      }
7
      _delay_ms(4);
8
    }

sondern:
1
    for(int e = 0;(( e < 10000) && (PIND & (1 << PD5))); e++)
2
      _delay_ms(4);

wenn er überhaupt Busy-Waiting verwendet.

Glaube ich jedenfalls.

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.