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
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.
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
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?
Das liegt am return direkt nach der LCD Ausgabe. Mit dem return Befehl verläßt du gänzlich deine Funktion ident.
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.
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
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.!
Hallo Du liest doch nur ein mal ein, wo sollen da vier verschiedene Werte herkommen? Gruß Joachim
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;
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.