' *****************************************************************************  

' * 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