Forum: Mikrocontroller und Digitale Elektronik RFID über RS232 an Atmega


von bastelwastel2708 (Gast)


Lesenswert?

Hallo,

ich bin schon lange in diesem Forum. Bisher nur passiv.
Habe mir über die Jahre viel Hilfe hier holen können.
Ich habe nun folgendes Problem. Vielleicht kann mir jemand helfen.
Ich habe das myAVR Board USB mit einem Atmega8 und mit externem Quarz 
mit 3,6864 MHz. Die Fusebits sind dementsprechend auch gesetzt. $baud 
auf 9600.
Von Conrad habe ich das Modul "TowiTek RFID-Antenne Best. 191553"
Dieses gibt über RS232 den Tag aus, der rangehalten wird.
So wie ich das verstandenhabe jedoch negiert.
Ich habe nun mit einem MAX232 wieder richtig herum gebastelt und am 
Atmega mit RxD verbunden. Das LCD zeigt nun auch je nachdem welchen TAG 
ich vor de Atenne halte Code an. Leider stimmt dieser jedoch nicht mit 
dem aufgedruckten überein. Auch der bereits vorhandene Pollin-Bausatz 
als Referenz zeigt den richtigen Code an.
Was mache ich falsch?
Wie muss ich die 5 Bytes in Bascom einlesen?
Hier bisher mein Code:


.
.
.
Dim Tags(5) As Byte
Dim Wert As String * 10
Dim Hexwert(5) As Long
Dim Hexwertgesamt As String * 40

$baud = 9600

Do

Inputbin Tags(1)
Hexwert(1) = Hexval(tags(1))

Inputbin Tags(2)
Hexwert(2) = Hexval(tags(2))


Hexwertgesamt = Str(hexwert(1))
Hexwertgesamt = Hexwertgesamt + Str(hexwert(2))


Locate 1 , 1
Lcd Hexwertgesamt ; "               "


If Hexwertgesamt = "168507801052508" Then
   Locate 2 , 1
   Lcd "TAG 1"
End If

If Hexwertgesamt = "7373916459868" Then
   Locate 2 , 1
   Lcd "TAG 2"
End If

If Hexwertgesamt = "2109532131164" Then
   Locate 2 , 1
   Lcd "TAG 3"
End If


Waitms 300


Loop
.
.
.

Es klappt zwar mit jedem Transponder eine andere Funktion auszuführen, 
da er immer andere Werte anzeigt und diese auch reproduzierbar sind. 
Jedoch wüsste ich schon gerne warum der angezeigte Wert nicht mit 
aufgedruckten Wert übereinstimmen.
Wäre super, wenn mir da jemand auf die Sprünge helfen könnte.

Danke und Grüße aus dem Schwarzwald.
Andi

von Keychain Tag (Gast)


Lesenswert?

bastelwastel2708 schrieb:
> Wäre super, wenn mir da jemand auf die Sprünge helfen könnte.

Kannst ja mal ein paar Beispiele nennen.
Welcher Code ist aufgedruckt und welcher wird dann angezeigt
Vielleicht erkennt dann jemand, ob die Werte invertiert sind, oder LSB 
MSB vertauscht oder...

von bastelwastel2708 (Gast)


Lesenswert?

Hallo,

danke für den Tip.
Auf dem Transponder ist die Nr.: 0013546583 aufgedruckt.
Der Pollin RFID-Bausatz zeigt mir diese auch im Display an.
Mein "Wunderwerk" zeigt aber die Nummer: 2109532131164 an.
Ich habe hier im Forum und an anderer Stelle im Netz noch weitere 
Hinweise gefunden, jedoch bekomme ich die richtige Nummer nicht 
angezeigt.
Ich glaube ich bin mit dem INPUTBIN auf dem Holzweg.
Ich seh auch keinerlei Übereinstimmung der Zahlen.
Notfalls werte ich eben diese "falsche" Nummer aus.
Ich habe vor, unsere ESD-Prüfstationen mit diesem RFID-Leser 
auszustatten.
Da gehts es nur darum sich nach dem Prüfen der ESD-Schuhe nicht mehr in 
eine Lsite eintragen zu müssen, sondern sich mit einem Transponder zu 
identifizieren und mit Datum und Uhrzeit auf einer SD-Karte zu 
verewigen.
Das ganze läuft mit einem Atmega2561 mit SD-Karte.
Bis auf die RFID-Erkennung läuft alles.
Nur mit diesen verd.... Bits in Bytes über die Serielle kapier ich 
nicht.
Habs halt bisher noch nicht gebraucht.
Danke für die Hilfe.
Gruß, Andi.

von werner a. (werner31)


Lesenswert?

Ich benutze auch den Towitek-leser an einem MyAvr-Board.
Lies dir nochmal genau die Beschreibung durch.
Der Leser hat eine serielle TTL-Schnittstelle ,keine RS232.
Ein Max232 hat dort nichts zu suchen. INPUTBIN kannst du nur
bedingt einsetzen.Es liest zwar eine angegebene Anzahl von Byte,
erkennt aber nicht den Anfang vom Datensatz.
Ich habe das so gelöst:
Jedes empfangene Byte löst einen Interrupt aus. In der Isr wird
jedesmal ein Timer neu gestartet (Länge ca 2fache Bytelänge).
Erst wenn der Timer auslöst und genau 5 Byte emfangen wurden,
wird der Datensatz als gültig markiert und ausgewertet.

von Timmo H. (masterfx)


Angehängte Dateien:

Lesenswert?

Bevor du einfach alle Bytes als Long interpretierst, würde ich erstmal 
beginnen mir jedes Byte als Hex/Dezimal ausgeben zu lassen.
Ich habe mal so ein 6€ Ding aus China gekauft (siehe Bild), und der gibt 
jedes Digit des Codes des RFID-Tags folgendermaßen aus: 0x1E-0x26 (30-38 
dez) entspricht 1..9 und 0x27 (39 dez) entspricht "0". Dazu kommt noch 
ein Start-Byte (0xBD) gefolgt von einen "Count".
Aus einen RFID-Tag mit der Nummer 0006292190 kommt also der Datenstrom
1
0xBD 0x05 0x27 0x27 0x27  0x23  0x1F 0x03 0xBD 0x06  0x26  0x1F  0x1E 0x26 0x27 0x28 0x03
2
^^Start                               |     |
3
     ^^Count                          |     |
4
            0    0    0     6     2  ^^STOP |
5
                                           ^^START 
6
                                                ^^Count
7
                                                       9     2     1    9    0   ^^ENDE RFID-Tag
8
                                                                                      ^^STOP
Wird bei dir vermutlich anders aussehen, aber so wäre jetzt erstmal 
meine Herangehensweise.

Bei deinem Ding scheint es aber tatsächlich so zu sein, dass nur die 5 
Nutzbytes ausgegeben werden.

Oder du schaust dir den Datenstrom erstmal mit HTerm an, bevor du mit 
dem µC drauf losgehst.

EDIT: Ich glaube du verwendest inputbin auch irgendwie falsch. Schau dir 
nochmal die Doku an

: Bearbeitet durch User
von bastelwastel2708 (Gast)


Lesenswert?

Hallo,

danke für den Tipp. Das mit HTerm werde ich heute mal ausprobieren.
Wenn die Erkennung so wie sie jetzt ist sicher ist, wäre ich auch 
zufrieden. Ich weiß nur nicht, ob das Ding morgen einen anderen Wert des 
TAGs anzeigt als heute. Wäre nicht so toll. Auch sollte jeder Tag an 
jeder Prüfstation den gleichen Wert anzeigen.

von Dirk (Gast)


Lesenswert?

Hi bastelwastel2708,
ich habe mir mal das Datenblättchen angesehen.
Dein Max brauchst du nur wenn du mit dem PC kommunzieren willst.
Der Anschluss an den µC erfolgt direkt.
Das mit dem invertieren, ist im Datenblättchen bescheuert ausgedrückt.
Nimm den Max mal raus, dann solltest du passende Ergebnisse haben.
Die Idee "werner alt" zum Erkennen des Endes des Strings ist super!

von bastelwastel2708 (Gast)


Lesenswert?

Hi,

das ohne Max werde ich gleich mal testen.
Hab zwar diret angeschlossen auch Daten erhalten, jedoch so glaubte ich 
jedenfalls auch nicht die Erwarteten. Hab da aber dann wohl nicht 
intensiv genug danach gesucht, weil ich mich dann gleich auf invertiert 
eingeschossen habe.
Werde nach dem Auslesen und Erkennen des Datenstroms mal ohne Max 
weitermachen.
Die Idee von "werner alt" muss ich mir mal in einer ruhigen Minute zur 
Gemüte führen.

von bastelwastel2708 (Gast)


Lesenswert?

Hi,

habe heute mit HTerm die Daten der TAGs ausgelesen.
Über den MAX232 erhalte ich für den Transponder "0013547888" die 
Hexadezimalzahl "3800CEB970" was zufälligerweise haargenau mit der 
Transpondernummer übereinstimmt.
Der TAG sendet ständig die 5 Bytes wie im Protokoll angegeben.
Da jedoch gestern Abend "jemand" meinen Atmega8 auf dem Board verfust 
hat, kann ich das auf dem Atmega nun leider nicht ausprobieren. Herr 
Pollin hat mir aber versprochen morgen erhalte ich Ersatz.
Jetzt muss ich dann nur noch die 5 Bytes hintereinander in den Atmega 
bekommen und den Wert von hexadezimal in dezimal umwandeln.
Ist je easy ;-)
Danke für den Tip mit HTerm.

von bastelwastel2708 (Gast)


Lesenswert?

Ach ja,
"Ist ja easy" war eher sarkastisch gemeint.
Und was ich gerade noch bemerkt habe die letzten 3 Bytes reichen zu 
Identifizierung der Transpondernummer.
"CEB970" ergibt dann die 13547888.

von bastelwastel2708 (Gast)


Lesenswert?

Hallo,
Neuen Atmega8 ins Board eingesteckt und weiter experimentiert.
Es funktioniert also tatsächlich ohne Invertierung des Signals. Die 
Antenne direkt angeschlossen, erhalte ich die korrekten Daten.
Hier kurz das Einlesen:

*********************************
Inputbin Tag_byte(1)

' wandelt in Hexadezimal
Tag_byte_hex(5) = Hex(tag_byte(5))
Tag_byte_hex(1) = Hex(tag_byte(1))
Tag_byte_hex(2) = Hex(tag_byte(2))
Tag_byte_hex(3) = Hex(tag_byte(3))

' fügt jedes Byte hinterinander in einen String
Tag_byte_hex_gesamt = Tag_byte_hex(5) + Tag_byte_hex(1) + 
Tag_byte_hex(2) + Tag_byte_hex(3)


' wandelt Hex-String in Dezimalzahl um
Tag_nummer = Hexval(tag_byte_hex_gesamt)


Locate 1 , 1
Lcd Tag_nummer ; "     "
*********************************


Bitte nicht wundern, ich schreibe den Code immer so kompliziert. Ich mus 
das schrittweise machen, damit ich das auch in einem Jahr noch kapiere.

Wie "werner alt" das beschrieben hat, muss ich jetzt nur noch die 5 
Bytes "extrahieren". So wie das Programm jetzt geschireben ist, läuft es 
zwar fehlerfrei, wenn ich jedoch noch Code hinzufüge, sprich die 
Laufzeit des Programms länger wird, erhalte ich wirre Zeichen.
Ich nehme auch an, dass das Ganze dann auf meinem Atmega2561 mit 16MHz 
kompletten Schrott anzeigt.
Ich bin aber froh, das ich das mit Eurer Hilfe bis hierhin hinbekommen 
habe.
Jetzt gehts an die Interrupts, ISR und Timer.
Ohje und Gruß

von bastelwastel2708 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

war heute wieder an meinem Projekt tätig.
Das Erkennen der TAGs funktioniert jedoch sehr unsicher. Je nachdem wo 
ich beim Lesen in die 5 Bytes "hineinspringe", bekomme ich Wirrwarr.
Ich erwische nicht jedes Mal den Anfang der 5 Bytes.
Ich habe nun folgendes probiert und bin bis jetzt sehr zufrieden damit:

ich nehme einen Atmega8 mit Minimalbeschaltung und 3,6864 MHz Quarz auf 
einer kleinen Lochrasterplatine. Das Miniprogramm liest ständig die an 
RxD angeschlossene RFID-Antenne und auf TxD geht der erkannte Code 
wieder raus auf den Atmega 2561.
Der Vorteil: was da ankommt hat dann gleich 2 Extrabytes "oD" und "0A", 
die ich dann gleich zum Erkennen des Anfanges des Pakets hernehmen kann.
Und das Programm auf dem Atmega8 ist so klein gehalten, dass dieser 
immer den Anfang der 5 Nutzbytes erwischt.
Ist zwar ein bisschen naja....
Aber die 1,90 für den Atmega und ein paar Cent für den Quarz.
Und das kleine Teil passt auch noch gut ins Gehäuse.
Hätte zwar auch gleich den vorhandenen Pollinbausatz nehmen können, der 
ist mir aber um einiges zu groß für den Einbau. Und so wie ich das sehe, 
ist der auch nicht mehr lieferbar.

Im Anhang ein JPG von meinem letzten Projekt. Eine Heizungssteuerung, 
die auch über einen Webserver (von myAVR) Ein- und Ausgeschaltet werden 
kann.
So in etwa sieht dann die ESD-Prüfstation aus, nur in einem Pultgehäuse 
und mit RFID-Antenne.

Gruß

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.