PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Conrad Rfid Reader an µController



hdtvfreak
15.03.2008, 10:41
Hallo,

gleich zu beginn, ja ich habe die Boardsuche zum Thema RFID benutzt und auch alle Quellcodes und Ratschläge ausgeführt, komme aber trotzdem nicht weiter:

Der RFID Reader sendet per TX (Baud 9600 ) den empfangenen Code. Direkt an der Schnittstelle angeschlossen klappt dies auch wunderbar nur über den µController gibt es ein paar Probleme.

Er sendet am Anfang ein Startbyte ( 002) und am Ende ein Stoppbyte (004), Dazwischen lieben die 5 Datenbytes jeweils im Hex Format.
Mein µController läuft auf 8Mhz, der Reader auf 16Mhz, dabei sind aber die Baudraten natürlich gleich eingestellt.

Habe mal mit einem einfachen Programm versucht die vom µController empfangenen Werte über Rs232 durchzzuschleifen, das Ergebnis war überraschend ( Log-Datei im Anhang)

1. Es wird das Start 002 und das Stoppbyte 004 gesendet
2. Dazwischen liegen auch immer genau 5 Datenbytes
3. Was aber überhaupt nicht sein kann, dass diese 5 Datenbytes immer variieren.

Auszug aus der Logdatei:

2
146
120
112
112
118
4
2
146
120
48
112
118
4
2
146
120
48
112
54
4
2
146
56
48
48
197
4
2
210
120
112
112
118
4
2
210
56
112
48
197
4


Hier mal wenn ich den Reader direkt an die Rs232 anschliese:
R80410241E6 R80410241E6 R80410241E6 R80410241E6 R80410241E6 R80410241E6


Hier der dazu gehörende Quelltext:
[code]
$regfile = "m32def.dat"
$crystal = 8000000
$baud = 9600

Dim A As Byte




Do

A = Inkey()

If A > 0 Then

Print A
A = 0

End If


Loop


End


Meine Vermutung:
Mit Inkey werden doch die Werte im Dezimal eingelesen, kann es deswegen zu Komplikationen kommen? Was dagegen spricht, die Start und Stoppbytes werden ja sachgemäß übertragen.

Ich verzweifle noch, hat jemand eine Idee????

Grüße

hdtvfreak

radbruch
15.03.2008, 10:51
Hallo

Versuche doch mal ein komplettes Datenpacket (bis zum Endebyte 4) zu Empfangen und erst dann die Daten auszugeben. Vielleicht wird durch das zeitgleiche Senden der Empfang gestört (oder andersrum).

Egal ob dezimal, hex, oder sonstwas, für die Schnittstelle ist es eine Folge von Bits die zu einem Byte zusammengestellt werden. Die Schreibweisen beeinflussen die Daten nicht.

Gruß

mic

hdtvfreak
15.03.2008, 13:03
So, habe es nochmal versucht, hier das Ergebnis:

Ò8x4102Ã1ÄÅ
Òx84q02ƒ1Ä
Å
Ò8
x410rÃ1„Å
’884102Ã1ÄÅ
Òx84q02
Ã1ÄÅ
Ò884102Ã1Ä…
Ò8x41p
2Ã1„Å
Ò8x
4102Ã1ÄÅ
Ò8x41p2ÃqÄÅ


Mit Folgendem Code ( Also eine Zeile entspricht einem Scan ) Rauskommen sollte eigentlich R884102C1DE,
Mir ist aufgefallen, dass z.B. bei:
Ò884102Ã1Ä…
’884102Ã1ÄÅ

Die Zahlen ja stimmen, aber was ist mit den Buchstaben, woran liegt das, die Ascii Tabelle ist ja überall gleich?

Achja der Code
[code]
$regfile = "m32def.dat"
$crystal = 8000000
$baud = 9600

Dim Flag As Byte
Dim Temp As Byte
Dim Dat As String * 20

Config Serialin = Buffered , Size = 20
Enable Interrupts
Do
Gosub Datenemphang
loop


Datenemphang:

Waitms 20
Dat = ""


Do 'Auf Echo warten
temp = Inkey()
If temp <> 0 Then Dat = Dat + Chr(temp)

Loop Until Temp = 0

If Dat <> "" Then
Print Dat
End If



Return

hdtvfreak
15.03.2008, 14:02
So habe jetzt mal ein größeres Array (100) genommen und die Intervalle betrachtet:

2
146
56
112
116
113
112
50
116
113
133
118
4
2
210
120
48
116
113
48
114
116
113
133
54
4
2
210
120
112
52
113
48
114
116
49
133
118
4
2
146
120
48
116
113
112
114
52
113
133
54
4


Was mich wunder ist, das vom Start zum Stoppbyte jetzt 11 Byte liegen, im Datenblatt steht aber 5 Byte, kann es sein, dass der Avr zu schnell einließt als der Reader sendet? Dann müssten es aber immer Paare geben ( 166,166 z.B. hintereinander)

Hm, Noch eine Idee???

Hier der Quelltext:
[code]

$regfile = "m32def.dat"
$crystal = 8000000
$baud = 9600


Dim Temp As Byte
Dim Dat(100) As Byte
Dim Count As Byte
Dim I As Byte
Count = 1

Config Serialin = Buffered , Size = 20
Enable Interrupts
Do
Gosub Datenemphang
Loop


Datenemphang:

Do 'Auf Echo warten
temp = Inkey()
If Temp <> 0 Then
Dat(count) = Temp
Incr Count
End If
Loop Until Temp = 0

If Count = 100 Then

For I = 1 To 100

Print Dat(i)
Dat(i) = 0

Next I

Print "______"
Count = 1

End If


Return

hdtvfreak
17.03.2008, 07:07
Ok, hat sich geklärt, lag an den Fusebits, ein atmega16 funktioniert optimal