Forum: Mikrocontroller und Digitale Elektronik Zahlenschloss Mega8 hilfe


von Basti (Gast)


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.

von Avr N. (balze)


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

von Basti (Gast)


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.

von Wer misst misst Mist (Gast)


Lesenswert?

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

von Markus (Gast)


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?

von Markus (Gast)


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!

von Avr N. (balze)


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

von Joerg F. (Gast)


Lesenswert?

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

von Basti (Gast)


Lesenswert?

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

von Noob (Gast)


Lesenswert?

Basti schrieb:
> Ich programmiere in Bascom...

Schonmal der erste Fehler ;)

von Basti (Gast)


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.

von me (Gast)


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

von Karl H. (kbuchegg)


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.

von Basti (Gast)


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

von Avr N. (balze)


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

von Karl H. (kbuchegg)


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
1
Dim Address As Byte , Command As Byte
2
 
3
Codearray(1) = 1
4
Codearray(2) = 2
5
Codearray(3) = 3
6
Codearray(4) = 4
7
8
Do
9
10
  Getrc5(address , Command)
11
 
12
  If Address <> 255 Then
13
    Command = Command And &B01111111
14
15
    If Address = 8 Then
16
      If Command = Codearray(1) Then
17
        Toggle Portb.0
18
        Cls
19
        Cursor Off
20
        Lcd "Code angenommen ";
21
        Waitms 500
22
      End If
23
    End If
24
  Else
25
  End If
26
 
27
Loop
28
29
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.

von Peter D. (peda)


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

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.