Forum: Mikrocontroller und Digitale Elektronik Dataregister speichern/auslesen


von Adam (Gast)


Lesenswert?

Guten Abend,

ich hätte gerne eine Frage bezüglich ARM 32-bit.

ich schreibe gerade mit c-sprache ein Program für Alarmanlage für ein 
Familienhaus.

Ich erwarte ein 4-stellige Code vom Benützer, er soll das Code über PS2/ 
Tastur eingeben.
Ich möchte gerne zunächst diese 4-Ziffern in einem Register speichern, 
danach werden mit einem fesgelegten Code verglichen. In dem Fall, wo Man 
drei mal falsch das code eingegeben hat soll Alarm ausgelöst werden.

wie kann ich das realisieren?
wie kann eine Register initialisiert werden?.
wie kann ich die ziffern in der Register speichern?.
wie kann ich die im Register gespeicherte Data vergleichen?.

Vielen Dank im Vorraus für jede Hilfe Von Euch.

LG. Adam

von Lehrmann M. (ubimbo)


Lesenswert?

Also grundsätzlich: fang mit einem einfacheren Programm an - so wie das 
klingt hast du nicht die Bohne Ahnung von Microcontrollern.

Zu deinen Fragen:
1) mit einem Microcontroller
2) int eingaberegister; (int = integer)
3) eine Tastatur an den Microcontroller anschließen und dann 
multiplexen, entprellen und einlesen. das ganze in einen int umwandeln. 
=> eingaberegister
4) if(eingaberegister==1234) {             // 1234 ist der "richtige" 
Code
//Alarmanlage unscharf schalten
}


ALLERDINGS GEHT OHNE GUTE KENNTNISSE IM BEREICH VON µControllern ABSOLUT 
NICHTS.

Hier sind infos über das PS2 Protokoll

http://www.computer-engineering.org/ps2protocol/

Überlege mal ob du ein einfaches Lauflicht realisieren kannst. 8 Led's 
von links nach rechts laufen lassen. Und lerne C.

Bei deinen Fragen hast du nochnie auch nur ein Programm geschrieben! 
Sorry.

von Peter D. (peda)


Lesenswert?

Adam schrieb:
> Ich erwarte ein 4-stellige Code vom Benützer, er soll das Code über PS2/
> Tastur eingeben.
> Ich möchte gerne zunächst diese 4-Ziffern in einem Register speichern,
> danach werden mit einem fesgelegten Code verglichen. In dem Fall, wo Man
> drei mal falsch das code eingegeben hat soll Alarm ausgelöst werden.

Deine Fragen erwecken den Eindruck, daß Du noch nicht sehr lange 
programmierst (wenige Stunden/Tage).


> wie kann ich das realisieren?

Indem Du erstmal einen Programmablaufplan erstellst.


> wie kann eine Register initialisiert werden?.

C kennt keine Register, sondern man benutzt Variablen.


> wie kann ich die ziffern in der Register speichern?.

In C sind Arrays und Pointer dafür gedacht.


> wie kann ich die im Register gespeicherte Data vergleichen?.

Dazu gibts die Vergleichsoperatoren == bzw. !=

Wies der Zufall will, hatte ich kürzlich was fertiges:

Beitrag "Re: [AVR|C] Codeschloss Projekt - wie den Code verbessern"

Mußt nur noch das PS2-Wandeln hinzufügen.
Oder nimmst ein übliches 3*4 Tastenfeld, Sieht eh blöd aus, ein ganzes 
Keyboard an die Wand zu nageln.


Peter

von Adam (Gast)


Lesenswert?

Hallo Michael, Hallo Peter!

Zuerst vielen Dank für eure schnelle Antwort.

Ihr beide habt richtig eingeschätzt, ich habe keine Ahnung bei 
Programmieren.
Aber ich muss es lernen, oder ich will es lernen.

Ich habe bis jetzt die folgendes geschaft:

Ein Interrupt EXTI auszulösen, sobald ein Taste gedruckt wird
dann auslesen was für scancode geschickt wurde.
und auf lcd auszugeben.

Also mit Tastatur etwas einzugeben und es auf lcd auszugeben ist 
überhaupt nicht mein Problem.

ok, ich habe mir überlegt, wie das Porgramm balaufen soll.und zwar

zuerst empfange ich die Eingabe( das ist erledigt)
dann speichere ich sie in einer Register oder Array(leider noch nicht 
fertig)
dann vergleiche ich die Eingabe.
und demfolge passiert was.

so siehst mein code:

unsigned char ident(void)
{
 ch= kb_getchar(); // diese Funktion liefert das eingegebene Ziffern
 int l;
 for(l=0;l<5;l++)// ich habe hier for schleife aufgebaut, bis 4x
     {

        while(ch != 0)
         {
              xpos+=7;
                if (xpos>121)
                  { xpos = 0;
                    ypos = ypos - 14;
                  }

           GPIO_WriteBit (GPIOE, GPIO_Pin_LED0, Bit_RESET);
                 GPIO_WriteBit (GPIOE, GPIO_Pin_LED1,Bit_RESET);
                LCD_DisplayChar( xpos, ypos, ch, RGB_RED, RGB_YELLOW, 1 
);

                if (l==4)
               {
               LCD_DisplayChar( xpos, ypos, 83, RGB_RED, RGB_YELLOW, 1 
);
               LCD_DisplayChar( xpos, ypos, 79, RGB_RED, RGB_YELLOW, 1 
);
               LCD_DisplayChar( xpos, ypos, 82, RGB_RED, RGB_YELLOW, 1 
);
               LCD_DisplayChar( xpos, ypos, 82, RGB_RED, RGB_YELLOW, 1 
);
               LCD_DisplayChar( xpos, ypos, 89, RGB_RED, RGB_YELLOW, 1 
);
               }
           return;


              }

           }
das Problem damit ist das Ignorieren der forschleife.

woran kann es liegen?

von Stefan Kunz (Gast)


Lesenswert?

Das liegt am return direkt nach der LCD Ausgabe. Mit dem return Befehl 
verläßt du gänzlich deine Funktion ident.

von Adam (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Stefan,

nachdem ich "Return" entfernt habe, und die "While schleife" gegen "if 
schleife" getauscht habe (weil mit wheile schleife hatte ich unendlische 
Schleife), bekomme ich jetzt beim Druck einer Taste (z.b "Taste-4") 
bekomme ich auf einmal statt 1x 4 bekomme ich 4x 4.

Ich begreife das net, er tritt zwar in der "for schleife", aber zählt 
nicht.

Ich habe 100x die for-schleife überdenken, und bin ich fast sicher an 
die for-schleife selbst ist überhaupt kein problem.

ich danke euch alle,jeder kleine Tipp hilft mir sicher weiter!

Anbei füge ich das ganze code bei.

von Lehrmann M. (ubimbo)


Lesenswert?

Es wäre sehr hilfreich zu wissen, was genau die kb_getchar() Function 
zurück gibt. Nur ein einzelnes Char oder alle 4 auf einmal ?

Sagmal ehrlich den Code hast doch nicht du geschrieben oder ?

Gruß

PS für einfache Hilfsvariablen in for-Schleifen verwendet man 
"normalerweise" i als Variable =) Aber das beleibt natürlich jedem 
selbst überlassen :-D

von Adam (Gast)


Lesenswert?

Hallo Michael;

ja den code wurde mir gegeben, und ich will es so ändern, dass meinen 
Ziel erfüllt.

diese Funktion "kb_getchar()" gibt natürlich den Ascii-code aus,und zwar 
nur ein mal und nicht 4x.

ich habe hier mit Array versucht:
unsigned char ident(void)
{

 ch= kb_getchar();


    if(ch != 0)
         {
          unsigned char _code [3];
         int m;
         for(m=0;m<5;m++)
             {
             _code [m]= ch;
             }
         if (m>=5)
            {


                xpos+=7;
                if (xpos>121)
                  { xpos = 0;
                    ypos = ypos - 14;
                  }

                 GPIO_WriteBit (GPIOE, GPIO_Pin_LED0, Bit_RESET);
                 GPIO_WriteBit (GPIOE, GPIO_Pin_LED1,Bit_RESET);
              if(_code[0]!= RESET)
                 LCD_DisplayChar( xpos, ypos, 66, RGB_RED, RGB_YELLOW, 
1);
              if(_code[1]!= RESET)
                 LCD_DisplayChar( xpos, ypos, 67, RGB_RED, RGB_YELLOW, 
1);
              if(_code[2]!= RESET)
                 LCD_DisplayChar( xpos, ypos, 68, RGB_RED, RGB_YELLOW, 
1);
              if(_code[3]!= RESET)
                 LCD_DisplayChar( xpos, ypos, 69, RGB_RED, RGB_YELLOW, 
1);
              }






              }

           }
Aber leider tue nicht was ihm gesagt.
er sollte 4 verschieden Buchstaben für jeweils  ausgeben, tatsäschlich 
gibt für vier elemente das gleiche Buchstabe.

Ich versteh net was ist das.!

von Joachim (Gast)


Lesenswert?

Hallo

Du liest doch nur ein mal ein, wo sollen da vier verschiedene
Werte herkommen?

Gruß
Joachim

von Lehrmann M. (ubimbo)


Lesenswert?

servus,

wieso nicht so:

int i=0, status=0;
unsigned char eingabe[4]={0}, korrekt[4]={"1","2","3","4"}; // 1234 als 
Bsp.

interrup ausgelöst =>

for(i=0;i<4;i++){
 eingabe[i]=kb_getchar();
}

status=0;
for(i=0;i<4;i++){
 if(eingabe[i]==korrekt[i]){
  status++;
 }
}

if(status==4) öffne Türe;

von Adam (Gast)


Lesenswert?

Hallo Joachim!

Ja, zuerst durch for-schleife wird die erste 4 ziffern im Array 
gespeichert.
Nachher wird aus der for-schleife ausgesprungen, und fragte ob m>5 ab, 
ja ist größer und geht rein, dort soll die erster Stelle im Array 
prüfen(die natürlich besetzt ist) und demfolge das Buchstabbe ausgegeben 
werden muss, das gleiche paasiert mit den anderen Stellen im Array aber 
jeweils andere Buchstabe.

ist das richtig oder habe ich falsch gemacht!?

Danke Joachim für deine Hilfe!

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.