' ***************************************************************************** ' * 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 ' Gosub Main ' Sprunganweisung zum Anfang der Hauptschleife 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