' *****************************************************************************
' * Firmware für einen RFID-Reader mit dem Chip U2270B *
' * softwareseitig funktionsgleich mit EM4095 (Manchester-Code) *
' * Hardwareunterschied: U2270B.CFE ist highaktiv - EM4095.SHD ist lowaktiv *
' * Die Programmierung basiert auf den Vorlagen von BASCOM und Pollin-Elektr. *
' * Wesentliche Schwachstellen der Pollinvariante wurden korrigiert *
' * !!!! Dieses Programm funktioniert NICHT mit der Pollinhardware !!!!! *
' * (andere Portbelegung!) *
' * *
' * Die Funktionalität beinhaltet: *
' * Einlesen der Transponderantwort (Transponder vom Typ EM4100 *
' * Abfragen einer Taste am Port PIN5 des ATTINY2313 *
' * Statusausgabe via highaktiver LED am Port PD6 des ATTINY2313 *
' * Ausgabe von Lesedaten über die RS232 des ATTINY2313 *
' * Autor: J. Grzesina, KRS Neumarkt/OPf. *
' * Rev. U2270B.01 *
' * Compiliert mit BASCOM 1.11.9.3 *
' *****************************************************************************
$regfile = "2313def.dat" ' Wir verwenden einen ATTINY2313
$baud = 9600 ' Baudrate
$crystal = 8000000 ' Quarzfrequenz
Dim Tags(5) As Byte ' Es werden 5 Bytes übertragen
Dim Zaehler As Byte ' Wir brauchen einen Zähler für die Bytes
Dim Wert As String * 10 ' Der String "Wert" wird schließlich die 10 eingelesenen Nibbelwerte enthalten
Config Portb = Output 'Port B als Ausgang definieren
Config Pind.5 = Input
Set Portd.5 ' Pullup-Widerstand einschalten
_led Alias Portd.6 ' LED-Ausgang auf Port PD6 festlegen und als Ausgang setzen
Config _led = Output
_led = 0 ' LED aus
Config Hitag = 64 , Type = Em4095 , Demod =
Pind.3 , Int = @int1
'konfiguriert den Timer und die Variablen für HITAG
' Der verwendete Chip entspricht dem EM4095 in der Funktion, es ist daher möglich
' die Bibliothek für EM4095 zu verwenden. Zur Auswertung werden 64 Bits übertragen
' die über Pin3 von PortD eingelesen werden
Config Lcdpin = Pin , Rs = Portb.2 , E = Portb.3 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
'LCD definieren
Config Lcd = 16 * 2 'zwei Zeilen je 16 Zeichen
_cfe Alias Portd.2 '_cfe liegt auf PortD.2
Config _cfe = Output '_cfe ist Ausgang
_cfe = 1 '_cfe wird high = U2270B Endstufe ein
Config Debounce = 30 'Tastenentprellung = 30ms
On Int1 Checkints Nosave 'PinD3=Int1 ruft bei Pegelwechsel die ISR Checkints auf
Mcucr.isc10 = 1 ' INT1 = changing einrichten
Mcucr.isc11 = 0 '
Enable Interrupts 'Enable all interrupts
Locate 1 , 1 'Cursor am Display in Zeile 1, ganz links
Lcd "RFID-READER" ' Text schreiben
Locate 2 , 1 'Cursor am Display in Zeile 1, ganz links
Lcd "MIT U2270B" ' Text schreiben
' Set Portd.6 ' Led 1 einschalten
_led = 1
Wait 2 ' Warte 2 Sekunden
' Reset Portd.6 'Led 1 ausschalten
_led = 0
' ************************ MAIN *******************************
Main: ' ab hier beginnt das Hauptprogramm
Do '
Do-Schleife
Cls ' Display
löschen
Lcd "WARTE AUF TAG" ' Text schreiben
If Readhitag(tags(1)) = 1 Then ' Wenn Readhitag() 1 zurückgibt wurde ein Tag ausgelesen
For Zaehler = 5 To 1 Step -1 ' For-Schleife beginnend von 5 nach 1; rückwärts zählend
Wert = Wert + Hex(tags(zaehler)) ' Wert wird 5 mal um 2 Characters erweitert
Next '
Ende For-Schleife
Toggle Portd.6 ' Led
an
Gosub Senden ' Sende über RS232
Toggle Portd.6 ' Led
aus
End If '
Ende der If-Abfrage
Debounce Pind.5 , 0 , Taste , Sub ' Taste entprellen; wenn gerdückt (= 0), zur Unterroutine "Taste" springen
Waitms 500 ' Warte 500 ms
Loop ' Sprunganweisung zum Anfang Do-Schleife
'
---------------------------- SUBROUTINES --------------------
Taste: '
Unterroutine "Taste"
Cls '
Display löschen
Locate 1 , 1 '
Cursor home
Lcd " T1 " ' Text schreiben
Wait
1 '
warte 1s
Cls ' Display löschen
Locate 1 , 1 'Cursor
home
Lcd " RFID TREIBER" ' Text schreiben
If _cfe = 1 Then ' If-Abfrage
Locate 2 , 1 ' Cursor in Zeile 2, Position 1
Lcd "ausgeschaltet" ' Text schreiben
_cfe = 0 ' _cfe auf low setzen -> Treiberstufen des U2270b abschalten
' Warteschleife für erneuten Tastendruck
Bitwait Pind.5 , Reset ' Warte bis erneut Pind.4 = low, Taste wieder gerdrückt
Waitms 30 ' Warte 30ms ( Entprellung)
Bitwait Pind.5 , Set 'Warte bis Pind.4 = high, Taste wieder losgelassen
Locate 2 , 1 ' Cursor in Zeile 2, Position 1
Lcd "eingeschaltet" ' Text schreiben
_cfe = 1 ' _cfe auf high setzen -> Treiberstufen des U2270b einschalten
Wait 1 ' Warte 1s
End If ' Ende der If-Anweisung
Return ' Sprunganweisung in die Hauptschleife
Senden: ' Unterroutine "Senden"
Cls ' Display löschen
Locate 1 , 1 ' Cursor in Zeile 1, Position 1
Lcd "an RS232 senden" ' Text schreiben
Locate 2 , 1 ' Cursor in Zeile 2, Position1
Lcd Wert ' Variable "Wert" schreiben
Print Wert ' Variable "Wert" über Uart ausgeben
Wert = "" ' Inhalt von Variable "Wert" = ""
'Waitms 500 ' warte 500ms
Return ' Rücksprung ins Hauptprogramm
' ----------------------- ISR INT1 ------------------------
Checkints: ' ISR
für INT1 "Checkints:"
Call _checkhitag '
RFID-Bibliotheksroutine aufrufen
Return ' Zurück vom IRQ
' ===============================================================
End 'Programmende