Pin-Abfrage Probleme bei Atmega32-Verbindung

Gast #3433980
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)
#3433990
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.
#3434004
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
Gast #3434010
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 ;)
Gast #3434027
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.

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