www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zahlenschloss Mega8 hilfe


Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ich würde gerne ein Zahlenschloss programmieren und benötige ein 
bißchen Hilfe.Ich weiß noch nicht genau wie sowas realisiert wird.

Aufgabe:

Zahlenschloss mit 4-5 Nummern.
Eingabe über RC5
Code soll geändert werden können
LCD ausgabe

Also wie das mit dem LCD/RC5 funktioniert ist mir klar.Ich weiß nur 
nicht so richtig wie man den Code manuell ändern kann.

Als erstes hatte ich vor mir eine Variable zu erstellen(für den Code).
Dann wollte ich die RC5 Signale auslesen und mit If else kontrollieren.
Soweit würde ich das auch alleine schaffen.


Nur mit der Eingabe von Parametern kenne ich mich noch nicht aus.

Autor: Avr Noob (balze)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Basti,

Basti schrieb:
> Eingabe über RC5

Damit meinst Du sicherlich dies:
http://de.wikipedia.org/wiki/RC-5

und nicht dies:
http://de.wikipedia.org/wiki/RC5

Richtig?

Basti schrieb:
> Ich weiß nur
> nicht so richtig wie man den Code manuell ändern kann.

Ich auch nicht, weil ich nicht weiss was Du vorhast.
- Der Code kann bei Erstellung des Schlosses geandert werden koennen.
- Der Code kann ueber RC-5 Fernbedienung geaendert werden.
- Der Code kann ueber Programmieradapter im EEPROM geaendert werden.
- Der Code kann durch mechanische Tasten am Zahlenschloss neu kodiert 
werden.
- Der Code wird ueber DIP-Schalter am Zahlernschloss geandert.
- ...........

Beschreib doch bitte mal genauer, sonst wird Dir wahrscheinlich keiner 
helfen koennen. (Es sei denn, es hat jemand 'ne gute Kristallkugel und 
kann damit umgehen.)

MfG,

Balze aka AVR Noob

Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich möchte gerne den Code über die Fernbedienung ändern können.
Z.B. drücke Taste xy um dann den Code zu ändern.Dann weiß ich noch nicht 
wie ich den Code von Anfang bis ende abfragen kann.
Also Ziffer 1 dann 2 usw. Wenn ich den Code in einer eizelnen Variable 
speichern möchte.

Bis jetzt habe ich den Code 4 stellig in 4 Variablen abgespeichert

Dann habe ich den mit einer If schleife kontrolliert

Ist Variable1=Eingabe?
wenn ja
Ist Variable2=Eingabe
usw.
Bei der letzen Variable dann wenn wahr
portxy=1 (öffne schloss)
else springe zum Anfang.

Was mir persönlich nicht gefällt ist das alles in 4 Variablem 
gespeichert ist das wird es mir nicht einfacher machen diese später zu 
ändern.

Autor: Wer misst misst Mist (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was machst eigentlich, falls dein Controller mal stromlos ist? Was 
passiert dann mit dem geänderten Code?

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Basti schrieb:
> Was mir persönlich nicht gefällt ist das alles in 4 Variablem
> gespeichert ist das wird es mir nicht einfacher machen diese später zu
> ändern.

Wie wäre es mit einem Array und Pointer-Addressierung?
Oder mir dem Speichern aller Ziffern in einer längeren Variablen und 
Shiften beim Abfragen und Einlesen?
Das müsste doch bei fast allen heutigen µC funktioniern, oder?

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wer misst misst Mist schrieb:
> Was machst eigentlich, falls dein Controller mal stromlos ist? Was
> passiert dann mit dem geänderten Code?

Sofort nach der Eingabe im Flash speichern und beim Neustart den 
selbigen auslesen!

Autor: Avr Noob (balze)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hall Basti,

am besten waere aber wohl ein Array von 8bit Werten.

Die kannst Du dann in einer Schleife nacheinander abfragen.
Ist einmal das Ergebnis ungleich, stratet die Schleife neu.

So kannst Du auch einfach die Anzahl Deiner Nummern im Code variieren.

In etwa so:

#define Anzahl_Codes 4

main{
 uint8_t Code_Array[Anzahl_Codes];
 read_Code_from_EERPOM (&Code_Array, Anzahl_Codes) // aus EEPROM ins 
Array !
 uint8_t counter = 0;
 for (;;){
   if(read_RC-5 () == CodeArray[counter]{
    counter++;
    if (counter == Anzahl_Codes)
     oeffnen ();
   }
   else
    counter = 0;
 }
}

MfG,

Balze aka AVR Noob

Autor: Joerg F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eventuell kannst du ja den Artikel in der Elektor 10/2010 
http://www.elektor.de/jahrgang/2010/oktober/cl-3-d... 
als Denkanstoß benutzen und das Teil für deine Zwecke erweitern

Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich programmiere in Bascom kann mir jemand sagen wo ich Erklärungen zu 
Arrays finde?

Autor: Noob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Basti schrieb:
> Ich programmiere in Bascom...

Schonmal der erste Fehler ;)

Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann ja sein aber diese Diskussion soll hier nicht besprochen 
werden,habe mich für Bascon entschieden und dabei bleibt es auch solange 
ich das nicht im schlaf kann.

Autor: me (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Basti schrieb:
> Ich programmiere in Bascom kann mir jemand sagen wo ich Erklärungen zu
> Arrays finde?

google?
http://lmgtfy.com/?q=bascom+array

Bascom Onlinehilfe?
http://avrhelp.mcselec.com/dim.htm

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Basti schrieb:
> Kann ja sein aber diese Diskussion soll hier nicht besprochen
> werden,habe mich für Bascon entschieden und dabei bleibt es auch solange
> ich das nicht im schlaf kann.

Du hast das misverstanden.
Der Fehler ist gar nicht so sehr, dass du BASCOM benutzt.
Der Fehler betseht darin, dass du denkst das sich BASCOM von alleine 
lernt.

Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Programm sieht bist jetzt so aus bin ich auf dem richtigen Weg??

$regfile = "m8def.dat".dat "
$crystal = 8000000

Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , 
Db7 = Portd.7 , E = Portd.3 , Rs = Portb.1
Config Lcd = 16 * 2
Config Lcdbus = 4

Dim Codearray(4)as Byte
Dim Platz As Byte
Config Rc5 = Pind.2
Config Portb.0 = Output


Enable Interrupts
Dim Address As Byte , Command As Byte

Codearray(1) = 1
Codearray(2) = 2
Codearray(3) = 3
Codearray(4) = 4

Do

Getrc5(address , Command)

If Address <> 255 Then
    Command = Command And &B01111111

If Address = 8 Then
If Command = Codearray(1) Then
Toggle Portb.0
Cls
Cursor Off
Lcd "Code angenommen ";
Waitms 500
End If
End If
Else
End If


Loop
End

Autor: Avr Noob (balze)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keine Ahnung, programmiere in C


:)


Warum faengst Du nicht mit C (Assembler) an und lernst Bascom wenn Du C 
(Assembler) kannst ?  ;-)

MfG,

Balze aka AVR Noob

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Basti schrieb:
> Mein Programm sieht bist jetzt so aus bin ich auf dem richtigen Weg??

Schwer zu sagen, von den wesentlichen Dingen ist ja noch kaum was zu 
sehen.

Funktioniert es denn bisher?


Ein Tip:
Gewöhn dir gleich von vorne herein an, deinen Code einzurücken.
Dann sieht man die logische Struktur viel besser

Dim Address As Byte , Command As Byte
 
Codearray(1) = 1
Codearray(2) = 2
Codearray(3) = 3
Codearray(4) = 4

Do

  Getrc5(address , Command)
 
  If Address <> 255 Then
    Command = Command And &B01111111

    If Address = 8 Then
      If Command = Codearray(1) Then
        Toggle Portb.0
        Cls
        Cursor Off
        Lcd "Code angenommen ";
        Waitms 500
      End If
    End If
  Else
  End If
 
Loop

End

Jetzt sieht man viel besser, welcher Code von welchem If abhängt.

PS: Ich würde mir als allererstes eine Ausgabe einbauen, die nach
  Getrc5(address , Command)
erst mal ausgibt, was denn da so empfangen wurde.
Sowas könnte sich bei Fehlersuche als sehr nützlich erweisen.
Und wenn das Programm fertig ist, entfernt man diese Ausgabe wieder.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde die Zahlen als String abspeichern, z.B. "154137".
Dann ergibt sich die Länge automatisch durch die Länge des Strings, max 
würde ich 10 Byte festlegen.
Der String wird im EEPROM gespeichert.

Jede Ziffer wird in einen Empfangsstring eingelesen und dann die beiden 
Strings verglichen.
Nach Öffnen oder einem Timeout wird der Empfangsstring geleert 
(genullt).

Eine 11. Taste startet die Änderung. Danach muß der alte Code und 2* der 
neue Code eingegeben werden.


Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.