Bascom RFID Service-Einheit von Cassio

Heinz2

Neues Mitglied
09. Okt. 2009
15
0
1
Sprachen
Hallo an das Forum,
ich baue die Serviceeinheit von Casio nach. Ein Lob was für eine Arbeit. Ich habe Bascom Programmroutinen abgeschrieben.
Alles soweit in Ordnung nur an eine Sache bin ich gestolpert ":confused: $external _key_code 'Externe Routine:hmmmm:
Ich finde diesen Code nicht. Ich hoffe casio kann mir dazu ein Tipp geben
Im Vorraus besten Dank für ein Antwort.
Gruß
Heinz2
 
Hallo Hein2!

Willkommen im AVR-Praxis Forum! :ciao:


Vielleicht hilft dir ja dieser Hinweis aus einem anderen Thema von mir.......
' I2C Matrixtastatur (Kent Andersson)------------------------
$lib "key_i2c.lib" 'LIB für I2C-Matrixtastatur
$external _key_code 'Externe Routine

'*****WICHTIG !*************************************************
'* Die Funktion "_key_scan", in der LIB "key_i2c.lib", MUSS ab BASCOM Ver. 2.0.3.0 auf _key_code geändert werden!
'* Ab BASCOM 2.0.3.0 dürfen Funktionen und Variablen NICHT mehr den selben Namen besitzen!
'* Bitte folgendes in der LIB ändern=
'* [_Key_code]
'* _Key_code:
'* Das war es dann auch schon !
'*****WICHTIG !*************************************************


Ich denke mal, damit sollte sich das Problem für dich lösen lassen. :wink:


Grüße und viel Spaß weiterhin,
Cassio
 
Rfid Service-Einheit von Casio

Hallo :)
Ich danke für die Antwort,Sorry :adore:ja ich habe dies gelesen! aber falsch Interpretiert!
Ich habe dies Korrigiert.
Ich habe hier noch eine Problem? Diese Fehler wird angezeigt.
BAscom Fehler.jpg

Muß man in der LCD_I2C.lbx was ändern?

Gruß
Heinz2
 
Hallo Heinz2!

Wie schön, dass es nach der kleinen Änderung in der LIB für die Matrix bei dir nun auch funktioniert. :)

Deine neue Fehlermeldung sagt mir leider gar nichts. :hmmmm:
Hast du auch die gleiche LIB für das LCD verwendet wie ich?
Auf Grund der Fehlermeldung kommt es mir so vor, als wäre es eine modifizierte Version (von MWS ?).
In seiner Variante konnte man die Pins am PCF8574 einzeln zuweisen.


Damit man den Fehler also besser eingrenzen kann wäre es gut, wenn du hier mal deinen kompletten Programmcode einstellen würdest.
Der Fehler liegt mit Sicherheit nicht in der LIB für das LCD. :wink:


Grüße,
Cassio
 
Rfid Service-Einheit von Casio

Hallo Cassio,:)
Darf ich es mit deiner Erlaubnis:confused:
Vorerst hier 2 Fotos mit den Libs
F_teil2.jpgF_teil2.jpg


Hier für LCD
Code:
Comment = Compiled LIB file, no comment included

copyright = Kent Andersson
www       = none
email     = [EMAIL="kent@smmab.se"]kent@smmab.se[/EMAIL]
comment   = I2C LCD driver
libversion   = 1.02
date         = 31 march 2002
statement    = You are free to use this code any way you like, if you are able to optimize
statement    = it better, please send me an update on my e-mail.
history      = No known bugs.
[_Init_LCD]
_Init_LCD:
 *BASIC: waitms 50
.OBJ EC00
.OBJ E083
 Rcall _Send_to_LCD
 *BASIC: waitms 4
 Rcall _Send_to_LCD
 Rcall _Send_to_LCD
.OBJ E082
 Rcall _Send_to_LCD
.OBJ E288
 Rcall _Write_lcd_byte
.OBJ E088
 Rcall _Write_lcd_byte
.OBJ E08C
 Rcall _Write_lcd_byte
.OBJ E081
 Rjmp _Write_lcd_byte
[END]
[_Write_lcd]
_Write_lcd:
* lds r16,{_lcd_e} 
.OBJ 6100
 rjmp _write_lcd_byte
_Lcd_Control:
* lds r16,{_lcd_e} 
_write_lcd_byte:
.OBJ 938F
.OBJ 9582
 Rcall _Write_lcd_Nibble 
.OBJ 918F
_Write_lcd_nibble:
.OBJ 708F
_Send_to_LCD:
.OBJ 93AF
.OBJ 93BF
.OBJ E093
_send_3_times:
.OBJ 939F
.OBJ FB80
* BLD  _temp2, PCF_D4
.OBJ FB81
* BLD  _temp2, PCF_D5
.OBJ FB82
* BLD  _temp2, PCF_D6
.OBJ FB83
* BLD  _temp2, PCF_D7
.OBJ FB84
* BLD  _temp2, PCF_RS
.OBJ FB85
* BLD  _temp2, PCF_RW
.OBJ FB86
* BLD  _temp2, PCF_E2
.OBJ FB87
* BLD  _temp2, PCF_E1
 *BASIC: i2csend pcf8574_LCD, _temp2
.OBJ 919F
.OBJ 2780
.OBJ E0A0
_LCD_delay:
.OBJ 95AA
 brne _LCD_delay
.OBJ 959A
 Brne _send_3_times 
.OBJ 2780
.OBJ 91BF
.OBJ 91AF
.OBJ 9508
[END]

Und [B]Hier für den Key[/B]
Comment = Compiled LIB file, no comment included

Comment = Compiled LIB file, no comment included
copyright = Kent Andersson
www       = none
email     = [EMAIL="kent@smmab.se"]kent@smmab.se[/EMAIL]
comment   = I2C Keyboard scanner
libversion   = 1.00
date         = 31 march 2002
statement    = You are free to use this code any way you like, if you are able to optimize
statement    = it better, please send me an update on my e-mail.
history      = No known bugs.
[_Key_code]
_Key_code:
 *BASIC: waitms 50
 *BASIC: i2creceive pcf8574_Kbd, _Temp1
.OBJ E000
* sts {_Key_scan},R16
.OBJ 308F
 Breq No_Key_Pressed
.OBJ FF81
.OBJ E001
.OBJ FF82
.OBJ E002
.OBJ FF83
.OBJ E003
.OBJ 930F
 *BASIC: i2csend pcf8574_Kbd, &HF0
 *BASIC: i2creceive pcf8574_Kbd, _Temp1
.OBJ 910F
.OBJ FF85
.OBJ 6004
.OBJ FF86
.OBJ 6008
.OBJ FF87
.OBJ 600C
.OBJ 9503
* sts {_Key_scan},R16
_Key_Init:
 *BASIC: i2csend pcf8574_Kbd, &H0F
No_Key_Pressed:
.OBJ 9508
[END]
Gruß Heinz2
 
Hallo Heinz2!

Ich weiß nicht, wo du dir LIB`s her hast, aber sie sehen nicht wie die original Kent_Andersson-LIB`s aus! :hmmmm:


Versuch es doch mal mit diesen LIB`s:

Für das LCD:
lcd_i2c.lib
Code:
copyright = Kent Andersson
www       = none
email     = kent@smmab.se
comment   = I2C LCD driver
libversion   = 1.02
date         = 31 march 2002
statement    = You are free to use this code any way you like, if you are able to optimize
statement    = it better, please send me an update on my e-mail.
history      = No known bugs.

;define a constant named PCF8574_LCD pointing to the i2c address
;dimension _lcd_e as byte to control the E-lines (4 lines LCD:s)
;_lcd_e should have one of the following values
;128 to enable E1, 64 to enable E2, 192 to enable both E1 and E2 (cls, deflcdchar) 
;Connect the following pins from PCF8574 to LCD
;
;P0 - D4
;P1 - D5
;P2 - D6
;P3 - D7
;P4 - RS
;P5 - RW (not used, set to 0 to ground for write)
;P6 - E2 (on 1 or 2 line display nc)
;P7 - E1

[_Init_LCD]
_Init_LCD:
 *BASIC: waitms 50
 ldi r16,&hc0       ; this is to make the initialization on both halfs of a 4-line LCD
 Ldi _temp1, &h03   ; at init-time I call all routines before _lcd_e is loaded into r16
 Rcall _Send_to_LCD
 *BASIC: waitms 4
 Rcall _Send_to_LCD
 Rcall _Send_to_LCD
 Ldi _temp1, &h02
 Rcall _Send_to_LCD
 Ldi _temp1, &h28
 Rcall _Write_lcd_byte  ;RS flag should to be 0, so jump directly to write byte
 Ldi _temp1, &h08
 Rcall _Write_lcd_byte
 Ldi _temp1, &h0c
 Rcall _Write_lcd_byte
 Ldi _temp1, &h01
 Rjmp _Write_lcd_byte
[END]


[_Write_lcd]
_Write_lcd:
* lds r16,{_lcd_e} 
 sbr r16,&h10                         ;set RS flag (4 high bits is used as control)
 rjmp _write_lcd_byte
_Lcd_Control:
* lds r16,{_lcd_e} 
_write_lcd_byte:
 push r24
 Swap _temp1                                
 Rcall _Write_lcd_Nibble 
 pop r24        
_Write_lcd_nibble:
 Cbr _temp1,&HF0                      ; E1, E2, RW, RS low

_Send_to_LCD:
push r26
push r27
 ldi r25,3
_send_3_times:
 *BASIC: i2csend pcf8574_LCD,_temp1
 eor _temp1,R16	                      ; Xor E1 and/or E2 to set them
; @genus(250)
 ldi r26,0
_LCD_delay:
 dec R26
 brne _LCD_delay
 Dec R25
 Brne _send_3_times 
 eor _temp1,R16			       ; Xor to restore to initial state (even number of times)
pop r27
pop r26
ret

[END]



Für die Matrix-Tastatur:
key_i2c.lib
Code:
copyright = Kent Andersson
www       = none
email     = kent@smmab.se
comment   = I2C Keyboard scanner
libversion   = 1.00
date         = 31 march 2002
statement    = You are free to use this code any way you like, if you are able to optimize
statement    = it better, please send me an update on my e-mail.
history      = No known bugs.

;define a constant named PCF8574_KBD pointing to the i2c address
;dimension a byte named _Key_Scan that will return a value depending on
;the key pressed (0 if none) returncode as follows:
;   C1 C2 C3 C4
;R1  1  2  3  4
;R2  5  6  7  8
;R3  9 10 11 12
;R4 13 14 15 16
;
;Connect the following pins from PCF8574 to your keyboard matrix
;
;P0 - Column 1
;P1 - Column 2
;P2 - Column 3
;P3 - Column 4
;P4 - Row 1
;P5 - Row 2
;P6 - Row 3
;P7 - Row 4
;
;If you want a interruptdriven keyboard connect INT to INT0 (or other)
;and call Key_init during the beginning of your program.
;Disable the interrupt during I/O intensive commands (like LCD, Locate etc.)
;Now you could build your own Keyboard interrupt routine, with keyboard buffer
;and anything you want.


[_Key_code]
_Key_code:
 *BASIC: waitms 50
 *BASIC: i2creceive pcf8574_Kbd, _Temp1
 Ldi R16,0
* sts {_Key_Scan},R16
 CPI _Temp1, &H0F
 Breq No_Key_Pressed
 sbrs _temp1, 1
 Ldi R16,1
 sbrs _temp1, 2
 Ldi R16,2
 sbrs _temp1, 3
 Ldi R16,3
 push R16
 *BASIC: i2csend pcf8574_Kbd, &HF0
 *BASIC: i2creceive pcf8574_Kbd, _Temp1
 pop R16
 sbrs _temp1, 5
 Sbr R16,&h04
 sbrs _temp1, 6
 Sbr R16,&H08
 sbrs _temp1, 7
 Sbr R16,&h0c
 inc R16
* sts {_Key_Scan},R16
_Key_Init:
 *BASIC: i2csend pcf8574_Kbd, &H0F
No_Key_Pressed:

Ret
[END]


Diesen beiden LIB`s sind wirklich die Original-Dateien!
In der Matrix-LIB habe ich allerdings schon die Änderung mit dem "_key_code" durchgeführt! :wink:

Danach sollte es dann aber gehen.


Grüße,
Cassio
 
Rfid Service-Einheit von Casio

Hallo:)
Vielen Dank Cassio für die Unterstützung :)
Danke für die LIB.:adore: Ich habe sie eingeflegt und noch eine Fehlermeldung Error 221: Input not found war übrig. Hier habe ich beim Schreiben des Soft-Uart statt Komma punkt gesetzt.
Die Fehlermeldung war fast gleich.Durch festlegen der Speichertabelle kamen mehr als 4k herraus.Habe mir jetzt eine Volllizenz bestellt.
Jetzt werde ich eine Platine mit Eagle Zeichnen.
Wenn ich alles soweit habe werde ich mich melden.
Gruß
Heinz2
 
Hallo Heinz2!

Die Vollversion wird bestimmt nicht lange auf sich warten lassen. :wink:

Trotzdem wäre es ganz praktisch, wenn du deinen derzeitigen Programmcode hier mal einstellen würdest.
Momentan sagt es mir natürlich nichts, warum du Fehlermeldungen vom USART bekommst. :hmmmm:


Grüße,
Cassio
 
Hallo,hier im Forum:D
Habe in der zwischen Zeit Platine und Schaltbild gemacht.

Türöffnerboard.jpg

Türöffnerschaltbild.jpg

Die Software läuft in Bascom Fehler frei.
Werde das progamme hier rein stellen, wenn ich nicht weiter komme.
Mit vielen Fragen

Zu mein Letztes Problem waren die Punkte und die Lib.
hier hat punkte geschrieben statt kommas
Soft_Uart Einstellung------------------------
Open "COMD.6:9600,8,N,1" For Input As #1
'Open"COMC .3.9600.8.N.1" For Output As #2

Gruß
Heinz2
 
I2C Bus Probleme

Hallo im Forum,
ich bin fast am vezweifeln:mad:.
Ich bekomme einfach des Bus nicht zum laufen
Hier eine Osi. Aufnahme vom Bus
SDABus.jpgSCLBus.jpg

und hier das Schaltbild
Türöffner_Schaltbild.jpg

Die LCD Anzeige flackert.
Ich würde mich freuen auf ein Vorschlag wo ich suchen muß.
Hruß
Hein2
 
Hallo Heinz,

ich bin fast am vezweifeln:mad:.
Ich bekomme einfach des Bus nicht zum laufen
...
Die LCD Anzeige flackert.
Ich würde mich freuen auf ein Vorschlag wo ich suchen muß.

wenn eine LCD-Anzeige flackert, dann macht man meißt den Fehler alles mit CLS zu löschen und dann wieder was draufzuschreiben. Wenn man schnell hintereinander was draufschreibt, mit Leerzeichen löscht (oder CLS) und dann wieder was draufschreibt, dann flackert es.

Überschreib deine alte Ausgabe mit der neuen ohne vorher mit Leerzeichen zu löschen.

Beim Bus ... 4,7k PullUps für SDA und SCL benötigst du auf jeden Fall. Damit sollte es auch laufen. Hast du die Datenrate vom I2C eventuell zu hoch gedreht? Manche I2C-ICs vertragen nur 100kHz Bustakt.

Bei den Oszillogrammen kommen die halbhohen Spitzen eventuell von einer zu kleinen Abtastrate des Oszilloskops. Wenn man die Abtastrate allerdings hochstellt, dann wird eventuell der Speicher nicht mehr so viele Datagramme erfassen können weil er schneller voll ist. Für sowas wäre jetzt ein Logikanalysator gut. Vor allem weil man dort dann gleich die interpretierten Daten und die Start/Stop-Sequenzen sieht.

Das erste Oszillogram sieht nach SDA (Daten) aus und das zweite nach SCL (Takt). Es gibt immer 20 Taktpulse. Das sieht für das Datagramm "Start-Adresse-Daten-Stop" soweit plausibel aus. Die Daten kann man wegen der niedrigen Auflösung/Abtastrate etwas schlecht interpretieren.

Beim SCL-Oszillogramm zähle ich 7 Taktpulse in 100µs (0,1ms/div). Das müßte dann für einen Puls 14,2857µs Dauer sein. Also 1 / 14,2857 = 70kHz SCL-Takt. Das sollte den PCF8574 eigentlich nicht überfordern.

EDIT: Im Schaltplan ist ein Fehler. Dein SDA geht nur an IC4 und nicht an die anderen I2C-ICs. Dafür haben die anderen einen PullUp für SDA und IC4 nicht. Es fehlt da eine horizontale Verbindung.
Türöffner_Schaltbild2.jpg

Gruß
Dino
 
Irgendwie ist der Plan ... ähm ... arg gewöhnungsbedürftig - ich würde versuchen, daß ganze mehr in Blöcke zu trennen (räumlich), signale ggf zu Bussen zusammenzufassen, und Versorgungsspannungen (noch) mehr durch entsprechende Symbole zu ersetzen...

Sehe ich das richtig, daß Deine Busleitung(en) ->Oszi1 nicht sauber genug schalten? Was mir da als erstes auffällt, sind die Abblockkondensatoren an den Versorgungspins -> sollten 100nF haben (und zwar an allen Pärchen, und möglichst dicht an den Beinchen)

Wie funktioniert das Konstrukt T1 - Q2 eigentlich? Also WAS (welches Potential) kann T1 auf Gnd ziehen?
 
Irgendwie ist der Plan ... ähm ... arg gewöhnungsbedürftig - ich würde versuchen, daß ganze mehr in Blöcke zu trennen (räumlich), signale ggf zu Bussen zusammenzufassen, und Versorgungsspannungen (noch) mehr durch entsprechende Symbole zu ersetzen...

Sehe ich das richtig, daß Deine Busleitung(en) ->Oszi1 nicht sauber genug schalten? Was mir da als erstes auffällt, sind die Abblockkondensatoren an den Versorgungspins -> sollten 100nF haben (und zwar an allen Pärchen, und möglichst dicht an den Beinchen)

Wie funktioniert das Konstrukt T1 - Q2 eigentlich? Also WAS (welches Potential) kann T1 auf Gnd ziehen?

Hallo Forum!

So wie ich das sehe, kann das mit den beiden Transistoren nicht funktionieren. Irgendwie fehlt da noch was:confused:
Der PNP-Transistor könnte als Stromquelle geschaltet sein, aber dann fehlt da eine Verbindung nach Vcc, oder irre ich mich jetzt.
Der NPN-Transostor ist als einfacher Schalter zu sehen, Er soll wohl die Stromquelle einschalten...

Die beiden PullUp-Widerstände (typisch 4k7 Ohm) hat Dino ja schon angesprochen.
Irgendwie habe ich mit dem Schaltplan auch so meine Problemchen, aber habe auch schon schlimmere gesehen:rolleyes:

MfG
FreeVee
 
Hallo:eek: im Forum danke für die Tollen Tipps.
Habe die Verbindung hergestellt. Die Spiks da bin ich noch dran.(abblocke c 100n.
Aber die Anzeige geht.
Aber die 4x4 Matrix Tastatur will jetzt nicht. Keine Reaktion
Habe versucht die Tastatur über ein Testcode anzusprechen.
kein Erfolg
Die Lib von Anderson,
Ich weiss nicht ob ich die richtig initialisiert habe.
Super für die schnell Antworten :rolleyes:

Hier ein Auszug vom Code

Code:
$regfile = "m8adef.dat"
    $crystal = 8000000

    $hwstack = 128
    $swstack = 128
    $framesize = 120

Ddrd = &B_1010_0000           '1 ist Ausgang  0 ist Eingang
Portd = &B0101_1111           'auf Hi oder Low setzen


Ddrc = &B_11_1100             '1 ist Ausgang  0 ist Eingang Ddrc = &B_11_1100
Portc = &B00_0011             'auf Hi oder Low setzen Portc = &B00_0011

Ddrb = &B_010                 '1 ist Ausgang  0 ist Eingang
Portb = &B101                 'auf Hi oder Low setzen
 '======= Aliasnamen:=============================




Tuer Alias Pinb.0
T_sperre Alias Pinc.0
T_auf Alias Pinc.1
Licht Alias Pinb.2

Toeff Alias Portd.5

Led_rfid Alias Portd.7
Led_gn Alias Portc.2
Led_rt Alias Portc.3
Led_ws Alias Portb.1



Declare Sub Lese_key
Dim Key_scan(2) As Byte
Dim Key_code As Byte
Dim Key As String * 1
'Globale Interrupts einschalten
Enable Interrupts

'======================================================
'config für INT0  (I2C -Matrix)

'======================================================
Enable Int0
On Int0 Matrix_scan           'Überwache INT0
Enable Int0

Config Scl = Portc.5          'I2C SCL
Config Sda = Portc.4          'I2C SDA

I2cinit
'Config I2cdelay = 10
'I2C Matrixtastur (Kent Andersson) __________________
$lib "key_i2c.lib"
$external _key_code           '    Externe Routine          'LIB für I2C-Matrixtastatur

Const Pcf8574_kbd = &H72      'I2C-Adresse des PCF8574A 114 Dezimal
                               'A0=1
                               'A2=0
                               'A3=0


!RCALL _key_Init              'Initialisierung aufrufen

Dim _key_scan As Byte         'Variable für Tastenausgabe

'=========I2C LCD (Kent Anderson)=====================
$lib "Lcd_i2c.lib "

Const Pcf8574_lcd = &H74      '116 Dezimal
                               'A0=1
                               'A2=0
                               'A3=0

'=== _LCD_e Variable für LCD-Zeilen

Dim _lcd_e As Byte
    _lcd_e = 128              'E1 4 Bit



Waitms 100

Dim Kb As String * 1          'Keyboard-Wert
Dim Kba As Byte At Kb Overlay 'ASCII-Nummer des Strings
Dim Kbn As Byte               'Nummerischer Wert des Keyboards


Do

If _key_scan = 1 Then

      Toeff = 1
       Locate 1 , 1 : Lcd "Key geht"

 Else
  Toeff = 0
  Locate 1 , 1 : Lcd "geht  nicht"


  End If

If _key_scan = 1 Then

Locate 1 , 1 : Lcd "geht  1 "


  End If



 Loop

 Sub Lese_key:
 Key_scan(1) = &H00
 Key_scan(2) = &H0F
 I2creceive Pcf8574_lcd , Key_scan(1) , 2 , 2

  ' Select Case Key_send(2)
   'Case 14 Key_code = 1
   'Case 13 Key_code = 2
   'Case Else
   'Key_code = 0
   Goto Key_end
  ' End Select

 Key_end:

 Key = Lookupstr(key_code , Matrix)

 End Sub

 Return

 '-----------------Matrix_scan--------------------------------
Matrix_scan:

 !Rcall _key_code

 If _key_scan > 0 Then        'externe Routine aufrufen


    Kb = Lookupstr(_key_scan , Matrix)
    Kbn = Kba - 48            'Wert von Keyscan der Tastur anpassen
 Else
 End If


 If _key_scan = 16 Then

    !RCALL _init_lcd
    Waitms 250
    Locate 2 , 1 : Lcd "INIT...... OK"

 Else
 End If

 Return

 '_____________Matrix_wert__________________________________________________



 Matrix:
Data "Z" , "7" , "8" , "9" , "A" , "4" , "5" , "6" , "B" , "1" , "2" , "3" , "C" , "F" , "0" , "E" , "D"
 
Hallo im Forum:eek:
ich brauche doch eure Hilfe ich habe jetzt soweit alles fertig,leider bleibt der Code bei der ersten Arbeitsschleife stehen und ich weiß nicht warum:banghead:
Er geht bis Bitwait Licht ,set .
Warum bleib das programm shet wen hier ein Bit gesetzt wird
hier mal der Code:
PHP:
    $regfile = "m8adef.dat"
    $crystal = 8000000

    $hwstack = 128
    $swstack = 128
    $framesize = 120

'=========================================================
'Ein. und Ausgänge bestimmen
' PD.0 =
' PD.1 =
' PD.2 = INT0 (Matrixtastatur)
' PD.3 =
' PD.4 =
' PD.5 =Töff
' PD.6 = Rfid-In
' PD.7 = Rfid-LED
Ddrd = &B_1010_0000           '1 ist Ausgang  0 ist Eingang
Portd = &B0101_1111           'auf Hi oder Low setzen

'PC.0 = Taster-Sperre
'PC.1 = Taster-Auf
'PC.2 = LED-gn-AUF
'PC.3 = LED-rt_Sperre
'PC.4 = SDA
'PC.5 = SCL
Ddrc = &B_11_1100             '1 ist Ausgang  0 ist Eingang Ddrc = &B_11_1100
Portc = &B00_0011             'auf Hi oder Low setzen Portc = &B00_0011

'PB.0 = Töff-Kontakt
'PB.1 = LED-ws_NAchtlicht
'PB.2 = Taster_Nachtlicht
'PB.3 = _MOSI
'PB.4 = _MISO
'PB.5 = _ SCK
'PB.6 = _XTAL1 (8MHz, Resonator)
'PB.7 = _XTAL2 (8MHz, Resonator)
Ddrb = &B_010                 '1 ist Ausgang  0 ist Eingang
Portb = &B101                 'auf Hi oder Low setzen
'####################################################
' Aliasnamen:
Tuer Alias Pinb.0
T_sperre Alias Pinc.0
T_auf Alias Pinc.1
Licht Alias Pinb.2

Toeff Alias Portd.5

Led_rfid Alias Portd.7
Led_gn Alias Portc.2
Led_rt Alias Portc.3
Led_ws Alias Portb.1

'##############################################
'Bestimme die Variablen
Dim Timer_zaehler As Byte     'Zähler für Lich-Verzögerung

Dim Kb As String * 1          'Keyboard-Wert
Dim Kba As Byte At Kb Overlay 'ASCII-Nummer des Strings
Dim Kbn As Byte               'Nummerischer Wert des Keyboards
Dim I As Word                 'Indexzähler
Dim Ie As Byte                'index_EEprom Zähler
Dim Temp As Byte              'Temp.-Variable

'-----------------Rfid-Array & Overlays_-------------
'+---------+--------+----.....__

Dim Rfid(16) As Byte          'Rfid-Rohdaten= "2 DDDDDDDDDD SS D A 3"
Dim Rfid0(12) As Byte At Rfid(2) Overlay
Dim Rfids As String * 12 At Rfid0(1) Overlay

Dim Srfid(9) As String * 16
Dim Srfid_pos As Byte

Dim Rfid_gruppe As Byte
Dim Key_nummer As Byte
Dim Rfid_schluessel As Byte
Dim Rfid_add As Byte

Dim Tab_nr As Word
Dim Lrfid(12) As Byte
Dim Lrfids As String * 12 At Lrfid(1) Overlay
Dim Finder As Byte
Dim Speicher_voll As Bit
Dim Finder_pos As Word
Dim Old_fund As Byte

Dim Zutritt As Byte
Zutritt = &H00
'Zutritt.0= ---frei__
'Zutritt.1= wenn HIGH, dann Zutritt
'Zutritt.2= wenn HIGH, dann besteht die Gruppen-Sperre
'Zutritt.3= wenn HIGH, dann Tür Dauer-auf
'Zutritt.4= wenn HIGH, dann Nachtlicht ein
'Zutritt.5= ---frei----
'Zutritt.6= wenn HIGH, dann RFID-Key der Gruppe 2-4 gefunden
'Zutritt.7= wenn HIGH, dann RFID-Key der Gruppe 1 gefunden

Dim Toeffzeit As Byte
Toeffzeit = 2

'Globale Interrupts einschalten
Enable Interrupts

'======================================================
'config für INT0  (I2C -Matrix)

'======================================================
Enable Int0
On Int0 Matrix_scan           'Überwache INT0
Enable Int0


'======================================================
'Config Timer1 für Nachtlicht-Verzögerung
Config Timer1 = Timer , Prescale = 256       '3036 bei Prescale 256 = 2 Sekunden
On Timer1 Timer_isr
Enable Timer1

Const Timer_ladewert = 3036   '3036 bei Prescale 256 = 2 Sekunden

'=====================================================
'Software I2C Variante-------------

                                           'Bus-Takt
Config Scl = Portc.5          'I2C SCL
Config Sda = Portc.4          'I2C SDA

I2cinit

'I2C Matrixtastur (Kent Andersson) __________________
$lib "key_i2c.lib"
$external _key_code           '    Externe Routine                                                                   'LIB für I2C-Matrixtastatur


Const Pcf8574_kbd = &H72      'I2C-Adresse des PCF8574A
!RCALL _key_Init              'Initialisierung aufrufen

Dim _key_scan As Byte         'Variable für Tastenausgabe

'=========I2C LCD (Kent Anderson)=====================
$lib "Lcd_i2c.lib "

Const Pcf8574_lcd = &H74


'=== _LCD_e Variable für LCD-Zeilen

Dim _lcd_e As Byte
    _lcd_e = 128

!RCALL _init_lcd

Waitms 100
'Soft_Uart Einstellung------------------------
Open "COMD.6:9600,8,N,1" For Input As #1       'Rfid-Scanner Input
'Open"COMC .3.9600.8.N.1" For Output As #2


Led_ws = 1

Waitms 200

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 '##########################################################
 '##________System start ___________________________---_####
 '##########################################################


Cls
Locate 1 , 1 : Lcd "Systemstart"

Stop Timer1

Led_rt = 1
Waitms 500

Led_rt = 0
Led_gn = 1
Led_ws = 0                    ' PNP Transistor, invertiertes Signal

Locate 1 , 1
Lcd "RFID-Oeffner"
Locate 2 , 1
Lcd "System A1"
Wait 1
Led_gn = 0                    ' PNP Transistor, invertiertes Signal
Led_ws = 1

Srfid_pos = 1                 '* Startposition                                                             'Für Last_visit

'#################################################
'-------------Arbeitsschleife---------------------
'#################################################

Do
'Nachtlicht____________________



If Licht = 0 Then             'Nachtlicht Ein / Aus Schalten
   Toggle Zutritt.4
 If Zutritt.4 = 1 Then        'PNP Transistor, invertiertes Signal
     Led_ws = 1
    Else
      Led_ws = 0              'PNP Transistor, invertiertes Signal
 End If
      Waitms 250
'ab hier bleib erstehn????????????????????????????


Bitwait Licht , Set

 Else


End If

Cls
Locate 1 , 1 : Lcd "Nachtlicht!"



'Nachtlicht____________________'


'Matrix-Tastatur_________________________________________
'***> Taste D veranlasst ein INIT des Displays ( in der ISR Matrix_Scan)

If _key_scan = 13 Then        '*=Service
   Gosub Service              'Keys Speichern oder löschen (alle Löschen)
Elseif _key_scan = 4 Then     'A= RFID-Key Anzeige
   Gosub Rfid_info            'einen Rfid-Tag zur Info NUR Anzeigen
Elseif _key_scan = 15 Then    '#=Start-LCD anzeigen
   Gosub Sys_start
   While _key_scan > 0
        NOP
   Wend
Elseif Kbn = 3 Then           '3= Rfid_Tag der Gewählten Schlüsselnummer anzeigen
   Gosub Speicheranzeige
Elseif Kbn = 2 Then
   Gosub Last_visit
'Elseif Kbn = 9 Then       '9 = gesamten EEPROM-Speicher via RS232 ausgeben
'  Gosub Rs232
Else
End If

' Matrix-Tastatur_________________________________________________
If T_auf = 0 Then             'Tür Dauer-Auf Ein / Aus schalten
   Toggle Zutritt.3
    If Zutritt.3 = 1 Then
       Cls
       Locate 1 , 1 : Lcd "Dauer_Auf aktiv!"
       Led_gn = 1
       Led_rfid = 1
       Toeff = 0
       Gosub Sys_start
    End If
  Waitms 250
  Bitwait T_auf , Set
Else
End If

'*****************************************************
If Zutritt.3 = 0 Then         'Dauer_Auf inaktiv

 If T_sperre = 0 Then         'Gruppen-Sperre EIN / Aus schalten
   Toggle Zutritt.2
     If Zutritt.2 = 1 Then    ' Gruppenb-Sperre Ein
        Led_rt = 1
        Cls
        Locate 1 , 1 : Lcd "Gruppen-Sperre!! "
     Else
        Led_rt = 0
        Gosub Sys_start
     End If
  Waitms 250
  Bitwait T_sperre , Set
  Else
 End If



'_________________________________________________
If Tuer = 0 Then              'Wenn Tür geschlossen ist , dann...
   Led_rfid = 0
   Led_gn = 0

   Rfid(1) = Inkey(#1)        'Erstes Byte einlesen
     If Rfid(1) = 2 Then      'Prüfe, ob 1.Byte = &H02 ist
        Gosub Read_rfid
        Gosub Reverse_key     'gesamten RFID-Tag von 2 bis 16 einlesen
        Gosub Gefunden
        Gosub Zutritt_pruefen
     Else
     End If

   If Zutritt.1 = 1 Then
      Led_rfid = 1
      Led_gn = 1
      Toeff = 1
         Wait Toeffzeit
      Zutritt.1 = 0
      Toeff = 0
      Led_rfid = 0
      Led_gn = 0
      Gosub Sys_start
  Else
  End If
  Else

 ' Else
'  Led_rfid = 1
'Led_gn = 1
 End If
'_________________________________
'*********************************

Else
End If


Loop


 '***********************************************************
                                '18.10.2012

Sys_start:
Cls

If Zutritt.2 = 0 Then
   Locate 1 , 1 : Lcd "Rfid-System A1"
   Locate 2 , 1 : Lcd "Scan / Menue"
   Speicher_voll = 0
End If



Return


'---------------Read Rfid----------------------------------


Read_rfid:


For I = 2 To 16
Rfid(i) = Waitkey(#1)
Next I
'------------Rfid-Array & Overlays--------------

Rfid(1) = 0
Rfid(14) = 0
Rfid(15) = 0
Rfid(16) = 0

Rfid_schluessel = 0
Gosub Reverse_key

If Srfid_pos < 10 Then
   Srfid(srfid_pos) = Str(rfid_schluessel)
   Srfid(srfid_pos) = Srfid(srfid_pos) + "="
   Srfid(srfid_pos) = Srfid(srfid_pos) + Rfids
   Incr Srfid_pos
Else
   Srfid_pos = 1
   Srfid(srfid_pos) = Str(rfid_schluessel)
   Srfid(srfid_pos) = Srfid(srfid_pos) + "="
   Srfid(srfid_pos) = Srfid(srfid_pos) + Rfids
End If


Return

Service:
Cls
Locate 1 , 1 : Lcd "Servicemenue"
Locate 2 , 1 : Lcd "System A1"
Wait 1
While _key_scan > 0
NoP
Wend


Locate 1 , 1 : Lcd " 1= Key speicher"
Locate 2 , 1 : Lcd "2 = key loeschen"
While _key_scan = 0
Nop
Wend
'--------------------------


Select Case _key_scan
   Case 9 : Gosub Key_add
   Case 10 : Gosub Key_del
   Case 3 : Gosub Key_del_all
   Case Else
   Cls
   Locate 1 , 1 : Lcd "Servicemenue"
   Locate 2 , 1 : Lcd "abgebrochen"
   Wait 1
   While _key_scan > 0
   NOP
   Wend
   End Select

   Gosub Sys_start
   Return
 '###########################################


Key_add:


 Gosub Gruppe
Gosub Nummer
 Rfid_schluessel = Rfid_gruppe * 10
 Rfid_schluessel = Rfid_schluessel + Key_nummer

 Gosub Speicher_pruefen
 Rfid_add = Rfid_schluessel
 Rfid_schluessel = 0

If Speicher_voll = 0 Then
 Locate 1 , 1 : Lcd "Key" ; Rfid_add ; " einlesen:"
 Locate 2 , 1 : Lcd "Warten auf Key . . . "
    Wait 1
 While _key_scan > 0          'Keine Teste mehr gedrückt? Sonst warten!
 NOP
 Wend


 While Rfid(1) < 2
     Rfid(1) = Inkey(#1)
     If _key_scan = 14 Then Exit While
 Wend                         'Null gedrückt?

If _key_scan = 0 Then         'KEINE Matrix-Taste gedrückt
        Gosub Read_rfid
        Gosub Doppel_pruefung 'Key schon einmal vorhanden?
        Rfid_schluessel = Rfid_add
        Gosub Tab_platz
   If Speicher_voll = 0 Then
        Locate 1 , 1 : Lcd "key"
        Locate 1 , 5 : Lcd Rfids
        Locate 2 , 1 : Lcd "            "
           Waitms 250
        Gosub Key_speicher
        Locate 2 , 1 : Lcd "Gespeichert ! "
        Led_rfid = 1
           Wait 1
       Else
         Locate 1 , 1 : Lcd " Speichern     "
         Locate 2 , 1 : Lcd " abgebrochen! "
                Wait 1
   End If
Else

        Locate 1 , 1 : Lcd " Key Einlesen  "
        Locate 2 , 1 : Lcd " abgebrochen!  "
               Wait 1
   End If
Else
End If


Return
'#################Key_del#############################

Key_del:
Gosub Gruppe
Gosub Nummer
      Rfid_schluessel = Rfid_gruppe * 10
      Rfid_schluessel = Rfid_schluessel + Key_nummer
Gosub Tab_platz

For Ie = 1 To 12
    Readeeprom Lrfid(ie) , Tab_nr
    Incr Tab_nr
Next Ie

Locate 1 , 1 : Lcd "Key " ; Rfid_schluessel ; "loeschen?"
Locate 2 , 1 : Lcd " 1=Ja   / 0 = Nein"

Waitms 250
While _key_scan > 0
      NOP
Wend

'-------------------------------------             'Keine Taste mehr gedrückt? Sonst warten
While _key_scan = 0           'Warten Bis Eine Taste Gedrückt Wurde
NOP
Wend                          'weil zur Anzeige schon Incr 12 erfolgt

Select Case Kbn
       Case 1
           Temp = &H00
           Tab_nr = Tab_nr - 12
           For Ie = 1 To 12
              Writeeeprom Temp , Tab_nr
              Incr Tab_nr
           Next Ie
              Locate 1 , 1 : Lcd "Key:" ; Lrfids
              Locate 2 , 1 : Lcd "   GELOESCHT ! "
                Wait 1
              While _key_scan > 0
              NOP
              Wend
       Case 0
          Locate 1 , 1 : Lcd "Key: " ; Lrfids
          Locate 2 , 1 : Lcd "NICHT geloescht ! "
            Wait 1
          While _key_scan > 0
          NOP
          Wend
End Select


Return

'--------------Key_del_all-----------------------

 Key_del_all:

 Locate 1 , 1 : Lcd "ALLE LOESCHEN ??"
 Locate 2 , 1 : Lcd " 7=ja        0=NEIN "
 Waitms 250
 While _key_scan > 0          'Keine Teste mehr gedrückt? Sonst warten!
   NOP
 Wend

 Waitms 100
 '------------------------------
 While _key_scan = 0          'Warten bis eine Taste gedrückt wurde
  NOP
 Wend

 Select Case Kbn
        Case 7
           Temp = &H00
           For Tab_nr = 0 To 512
              Writeeeprom Temp , Tab_nr
           Next Tab_nr
               Locate 1 , 1 : Lcd "ALLE Keys wurden"
               Locate 2 , 1 : Lcd "   GELOESCHT  ! "
                    Wait 3
               While _key_scan > 0       'keine Teste mehr gedrücskt? sonst warten!
               NOP
               Wend
        Case 0
        Locate 1 , 1 : Lcd "Vorgang wurde "
        Locate 2 , 1 : Lcd " abgebrochen !"
              Wait 3
        While _key_scan > 0   'Keine Teste mehr gedrückt? Sonst warten!
        NOP
        Wend
 End Select

 Gosub Sys_start

 Return
 '---------------Gruppe------------------------------
 Gruppe:
 Locate 1 , 1 : Lcd "Gruppe (1-4): "
 Locate 2 , 1 : Lcd "              "
 Waitms 250
 While _key_scan > 0          'Warten bis eine Taste gedrückt wurde
 NOP
 Wend

 Waitms 100

 '-----------------------------------------

 While _key_scan = 0          'Keine Teste mehr gedrückt? sonst warten!
 NOP
 Wend

 Rfid_gruppe = Kbn


 Select Case Rfid_gruppe
        Case 1 To 4
        Locate 2 , 1 : Lcd Rfid_gruppe
        Locate 2 , 2 : Lcd " Gruppe,OK!"
        Waitms 500
           While _key_scan > 0       'Warten bis eine Taste gedrückt wurde
           NOP
           Wend
        Case Else
           Locate 2 , 1 : Lcd "  ----FEHLER---"
           Waitms 500
           Goto Gruppe
 End Select

 While _key_scan > 0          'Keine Taste mehr gedrückt? sonst warten!
 NOP
 Wend


 Return

 '----------------Nummer------------------------------
 Nummer:

  Locate 1 , 1 : Lcd " Key-Nummer (1-9)"
  Locate 2 , 1 : Lcd "                 "
  Waitms 250
  While _key_scan > 0         'Keine Taste mehr gedrückt? sonst warten!
  NOP
  Wend

  Waitms 100
  While _key_scan = 0         'Warten bis eine Taste gedrückt wurde
  NOP
  Wend
  Key_nummer = Kbn


  Select Case Key_nummer
         Case 1 To 9
        Locate 2 , 1 : Lcd Key_nummer
        Locate 2 , 2 : Lcd " Key-Nummer,OK!"
        Waitms 500
          While _key_scan > 0 'Keine Taste mehr gedrückt? sonst warten!
          NOP
          Wend
        Case Else
           Locate 2 , 1 : Lcd "  ----FEHLER---"
           Waitms 500
           Goto Nummer
  End Select


  While _key_scan > 0         'Keine Taste mehr gedrückt? sonst warten!
  NOP
  Wend


  Return

  '-----------------Tab_platz--------------------------------

  Tab_platz:

  Tab_nr = Rfid_schluessel - 11
  Tab_nr = Tab_nr * 12

  Return

  '---------------Speicher_pruefen---------------------------------
  Speicher_pruefen:

  Gosub Tab_platz

  Readeeprom Lrfid(1) , Tab_nr

  If Lrfid(1) > 0 Then
        Locate 1 , 1 : Lcd "Speicher " ; Rfid_schluessel ; "voll"
        Locate 2 , 2 : Lcd " 1=Weiter 0=Abbr."
           While _key_scan = 0
           NOP
           Wend

           If Kbn = 0 Then
               Locate 1 , 1 : Lcd " Speichern     "
               Locate 2 , 1 : Lcd " abgebrochen!  "
           Else
           End If

        Else
            Speicher_voll = 0
        End If


        Return

'----------------Doppel_pruefung---------------------------

   Doppel_pruefung:

   Gosub Reverse_key

   Select Case Rfid_schluessel
   Case 11 To 49
      Locate 1 , 1 : Lcd " Key vorhanden in "
      Locate 2 , 1 : Lcd " Speicher:  " ; Rfid_schluessel ; "!!!"
       While _key_scan = 0
       NOP
       Wend
     Speicher_voll = 1
   Case Else
     Speicher_voll = 0
   End Select


   Return

   '-----------Reverse_key----------------------------------

      Reverse_key:
      Finder = 0
      Finder_pos = 0
      Ie = 1
      Tab_nr = 0
      Old_fund = 0

      While Tab_nr < 468

      Readeeprom Lrfid(ie) , Tab_nr


   If Lrfid(ie) = Rfid0(ie) Then
      Finder_pos = Tab_nr
      Incr Ie
      Incr Finder
      Incr Tab_nr
      Old_fund = 1
      Else
   If Old_fund = 1 Then
      Tab_nr = Finder_pos
      Tab_nr = Tab_nr - Finder
      Tab_nr = Tab_nr + 13
      Old_fund = 0
      Finder = 0
      Ie = 1
      Else
      Tab_nr = Tab_nr + 12
   End If
End If

If Finder = 12 Then
   Finder_pos = Finder_pos - 11
   Finder_pos = Finder_pos / 12
   Rfid_schluessel = Finder_pos + 11
   Exit While
End If

Wend

Return
Gefunden:
If Finder = 12 Then
   If Rfid_schluessel > 20 Then
      Zutritt.6 = 1           'key der Gruppe 1 Key gefunden
   Else
      Zutritt.7 = 1           'key der Gruppe 2-4 gefunden
   End If

Else
   Zutritt.1 = 0              'Keine Freigabe
   Cls
   Locate 1 , 1 : Lcd "Keinen RFID-Key"
   Locate 2 , 1 : Lcd "  gefunden"
End If

Return










'-------------Key_speicher---------------------------
Key_speicher:

For Ie = 1 To 12
   Writeeeprom Rfid0(ie) , Tab_nr
   Incr Tab_nr
Next Ie

Return

'----------------Zutritt_pruefen-----------------------------------
Zutritt_pruefen:

If Zutritt.7 = 1 Then
   Zutritt.1 = 1
   Locate 1 , 1 : Lcd "Key gefund " ; Rfid_schluessel
   Locate 2 , 1 : Lcd " Zutritt erlaubt!"
      Led_ws = 0
      Timer1 = Timer_ladewert : Start Timer1
   Elseif Zutritt.6 = 1 Then
If Zutritt.2 = 0 Then
      Zutritt.1 = 1
   Locate 1 , 1 : Lcd "Key gefund " ; Rfid_schluessel
   Locate 2 , 1 : Lcd " Zutritt erlaubt!"
      Led_ws = 0
      Timer1 = Timer_ladewert : Start Timer1
   Else
     Zutritt.1 = 0
   Locate 1 , 1 : Lcd "Key gefund " ; Rfid_schluessel
   Locate 2 , 1 : Lcd "KEIN Zutritt!!!"
End If

Else
End If
Zutritt.7 = 0
Zutritt.6 = 0

Return

'-------------------------------------
        Last_visit:
        Locate 1 , 1 : Lcd "Letzten 9 RFIDs "
        Locate 2 , 1 : Lcd "# waehlen 0=Abbr"
        Wait 1
        While _key_scan > 0
        NOP
        Wend

        Do
          While _key_scan = 0
          NOP
          Wend

          If Kbn = 0 Then
          Locate 1 , 1 : Lcd "Funktion beendet "
          Locate 2 , 1 : Lcd "zurueck zum Scan "
          Wait 1
        Elseif Kbn = Srfid_pos Then
          Temp = 9
        Elseif Kbn > Srfid_pos Then
          Temp = Srfid_pos - Kbn
          Temp = Temp - 247
        Else
          Temp = Srfid_pos - Kbn
        End If

        If Kbn > 0 Then
            Locate 1 , 1 : Lcd "RFID-TAG vor: " ; Kbn ; " "
            Locate 2 , 1 : Lcd "              "
            Locate 2 , 1 : Lcd Srfid(temp) ; " "
        Else
        End If

        Waitms 500
        While _key_scan > 0   'Keine Taste mehr gedrückt? sonst warten!
        NOP
        Wend
 Loop Until Kbn = 0

 Gosub Sys_start


 Return

 '-------------------------------------------------

 Speicheranzeige:

        Locate 1 , 1 : Lcd "Speicheranzeige "
        Locate 2 , 1 : Lcd "Nummer  ?       "
        Wait 1
        While _key_scan > 0   'Keine Taste mehr gedrückt? sonst warten!
        NOP
        Wend


        Gosub Gruppe
        Gosub Nummer
        Rfid_schluessel = Rfid_gruppe * 10
        Rfid_schluessel = Rfid_schluessel + Key_nummer
        Locate 2 , 1 : Lcd "Nummer " ; Rfid_schluessel ; "        "
        Waitms 500

        Gosub Tab_platz

        For Ie = 1 To 12
            Readeeprom Lrfid(ie) , Tab_nr
            Incr Tab_nr
        Next Ie


        Locate 1 , 1 : Lcd "Speicher " ; Rfid_schluessel ; "        "
        Locate 2 , 1 : Lcd "Key "
        Locate 2 , 4 : Lcd Lrfids
        Waitms 100
        While _key_scan = 0
        NOP                   'Warten bis eine Taste gedrückt wurde
        Wend

        Gosub Sys_start

        Return

'____________________________________________

     Rfid_info:
     Cls

     Do

     Locate 1 , 1 : Lcd "RFID-Key Anzeige "
     Locate 2 , 1 : Lcd "Warte....        "
     Wait 1

     While Rfid(1) < 2
     Rfid(1) = Inkey(#1)
     If _key_scan = 14 Then Exit While
     Wend


     If _key_scan = 0 Then    'Keine Taste mehr gedrückt? sonst warten!
        Gosub Read_rfid
        Locate 1 , 1 : Lcd "Der RFID-Key ist "
        Locate 2 , 1 : Lcd "---> " ; Rfids
     Else
       Exit Do
     End If


     Set Led_rfid
     While _key_scan = 0      'Warten bis eine Taste gedrückt wurde
     NOP
     Wend
     Reset Led_rfid


     Loop



     Locate 1 , 1 : Lcd "RFID-Key Anzeige "
     Locate 2 , 1 : Lcd "beendet!         "
     Wait 1
     While _key_scan > 0
     NOP
     Wend

     Gosub Sys_start

     Return

     '---------------Timer_isr-----------------------------------

     Timer_isr:
     '7 x 2s = 14s + 2s bis zum ersten Interrupt = 16 Sekunden insgesamt !
     If Timer_zaehler < 7 Then
        Incr Timer_zaehler
        Timer1 = Timer_ladewert

     Else
        If Zutritt.4 = 0 Then Led_ws = 1
        Timer_zaehler = 0
        Stop Timer1
     End If
Return

'-----------------Matrix_scan--------------------------------
Matrix_scan:

 !Rcall _key_code
 If _key_scan > 0 Then        'externe Routine aufrufen

    Kb = Lookupstr(_key_scan , Matrix_wert)
    Kbn = Kba - 48            'Wert von Keyscan der Tastur anpassen
 Else
 End If


 If _key_scan = 16 Then
    !RCALL _init_lcd
    Waitms 250
    Locate 2 , 1 : Lcd "INIT...... OK"

 Else
 End If

 Return
'_____________Matrix_wert__________________________________________________
Matrix_wert:
Data "Z" , "7" , "8" , "9" , "A" , "4" , "5" , "6" , "B" , "1" , "2" , "3" , "C" , "F" , "0" , "E" , "D"

Return

'*******************************************************************************************
'Rfid_data:
                   $eeprom


Die Software ist von Cassio

Für eine Antwort oder ein Tipp wäre ich dankbar.:rolleyes:

Gruß
Heinz 2
 
Hallo!

Hm.... also das Bit für Licht setzt sich allein, sobald der Taster öffnet und am AVR-Eingang durch den internen Pullup wieder Vcc anliegt.
Es darf also an "Licht" (PinB.2) kein GND-Potential anliegen!

Hilft dir das ggf. weiter?


Grüße,
Cassio
 
Genau:
Bascom Onlinehilfe zu Bitwait schrieb:
Action
Wait until a bit is set or reset.
Da wird mit ziemlicher Sicherheit eine Schleife eingerichtet, die das Bit pollt, und nur dann verlassen wird, wenn das Bit gesetzt/gelöscht ist. So in etwa:
Code:
SBIS/SBIC Pinregister, Bit
RJMP -1
 
Hallo hier im Forum:)
Super danke für die Antworten von Cassio und Lotadac.:dance3:
ich habe den Fehler gefunden Feinschluss. Jetzt geht auch diese Funktion.
Ich habe jetzt eine weiter Funktion die ich ich nicht verstehe.
Wenn ich das Service Menü aufrufe und 1 Drücke zum Speichern eines Key. Wird die Routine abgebrochen:stupido2:
Was mach ich falsch???
Gruß
Heinz
 
Wenn ich das Service Menü aufrufe und 1 Drücke zum Speichern eines Key. Wird die Routine abgebrochen:stupido2:
Was mach ich falsch???


Hallo Heinz!

Das Einzige was mir dazu einfällt.....

Verlaufen die Zahlen auf deiner Matrixtastatur vielleicht anders? :hmmmm:

Bei mir ist die "1" unten links!
ISE-1.jpg


Wenn das bei dir auch so sein sollte dann wäre es immer noch möglich, dass du deine Matrix auf andere Weise mit dem PCF8574 verbunden hast.
Ich habe es so angeschlossen, dass ich beim Druck auf Taste "7" den _KEY_SCAN = 1 bekomme!
Folglich muss bei einem Druck auf die Taste "1" auch der _KEY_SCAN = 9 ergeben.


Grüße,
Cassio
 
Hallo, danke Cassio für deine Antwort,
Ja meine Tastatur sieht anders aus. Ich habe die Reien folge in der Datenbank geändert.

Matrix_werte:
Data "Z","1","2","3","A","4","5","6","B","7","8","9","C","F","0","E","D"

Ich habe hier wohl ein Fehler drin. Ich habe angenommen, wenn ich die Datenbank ändere was wohl.
Gruß
Heinz2
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)