Hallo:)
Wie der Betreff schon sagt, benötige ich Hilfe bei der Übersetzung eines
C Programms in ein Bascom Programm.
Letztes Jahr habe ich den Grundaufbau und die Funktionen von C gelernt,
aber dieses Programm ist mir nicht ganz verständlich.
Dan fang ich mal von vorne an, also dieses Programm gehört zu dem RFID
lese Modul RDM630 ->
http://www.komputer.de/zen/index.php?main_page=product_info&products_id=93
Dieses Modul gibt es als UART und als Wiegand Version. Ich habe leider
nur die Wiegand Version gefunden.
Das folgende Programm ist ein C Programm für dieses Modul.
Ich möchte diesesn Leser als Zutrittskontrolle einsetzten und ein Atmega
8 soll das ganze Auswerten und via RS485 an einen Server schicken. Das
Programm für das Senden und Empfangen vom Server kann ich selbst
schreiben, aber ich weiß nicht wie ich dieses Modul einlesen kann.
Hier das C Programm ->
http://iteadstudio.com/store/images/produce/RFID/125KReader_W/RFID_630_WG.pde
Ich hoffe, dass ihr mir helfen könnt und bedanke mich dafür im voraus.
@Gast:
Ich suche Hilfe, keine fertige Lösung! Und was das mit dem 'faulen
Schüler' soll weiß ich auch nicht, erstens sind Ferien und zweitens
lerne ich soetwas gar nicht in der Schule.
Ich habe die Grundkenntnis zu C mir in der Abendschule angeeignet, aber
da ich immer Bascom benutzt habe, habe ich dies wieder verlernt bzw
soweit hab ich es gar nicht gelernt, dass ich soetwas schreiben könnte.
Okay, dann stell ich mal konkrete fragen.:)
Also das erste ist mir schon etwas peinlich zu fragen, aber ich weiß
nicht genau was ich wo anschließen muss
1
#ifndef RFID
2
#define RFID
3
//==============================
4
#define DATA0 0x01 //Data pin 0 from RFID module
5
#define DATA1 0x02 //Data pin 1 from RFID module
6
#define D_PORT PORTB
7
#define D_DIR DDRB
8
#define D_IN PINB
9
//==============================
10
#endif
Also wo genau muss ich nun DATA0 und DATA1 anschließen?
und wofür stehen die anderen drei defines?
Und diese Zuweisung versteh ich nicht:
*chrischan.x3 schrieb:> Und diese Zuweisung versteh ich nicht:
Da hast du wohl die erste Stunde in der Abendschule geschwänzt?
Variablen werden in C definiert. (in BASIC nimmt man sie einfach)
Also 'Bekanntmachung' und hier mit Zuweisung eines Startwertes.
*chrischan.x3 schrieb:> Also wo genau muss ich nun DATA0 und DATA1 anschließen?
Anschließen?
*chrischan.x3 schrieb:> und wofür stehen die anderen drei defines?
#defines sind einfach nur Textersetzungen, die irgendwo im Quelltext
wieder verwendet werden.
Beispiel:
#define WERT 3
...
for (uint8_t i=0; i < WERT; i++)
{
...
}
Braucht man jetzt irgendwoanders genau diese 3 nochmal, setzt man dafür
WERT ein. Denn: vielleicht soll dieser Wert mal irgendwann auf 5
geändert werden, dann ändert mann das nur in #define und zack, alles ist
auf dem neuesten Stand.
*chrischan.x3 schrieb:> Also wo genau muss ich nun DATA0 und DATA1 anschließen?
Na an Bit 0 und Bit 1 des verwendeten Ports.
> und wofür stehen die anderen drei defines?*chrischan.x3 schrieb:> und wofür stehen die anderen drei defines?
Na für den verwendeten Port, der aus drei I/O-Registern besteht (siehe
Datenblatt!!), also dem Portregister, dem Datenrichtungsregister und dem
Port-Eingangsregister.
Es handelt sich übrigens um Konstanten, mit Variablen hat das nix zu
tun. Die müssen in Bascom auch deklariert werden (Dim).
...
Danke fuer die Hilfe!
Ralf G. schrieb:> *chrischan.x3 schrieb:>> Und diese Zuweisung versteh ich nicht:> Da hast du wohl die erste Stunde in der Abendschule geschwänzt?> Variablen werden in C definiert. (in BASIC nimmt man sie einfach)> Also 'Bekanntmachung' und hier mit Zuweisung eines Startwertes.
Also beginnt bei
1
for(;;){......}
die Schleife und data0 und data1 werden immer wieder auf 0 gesetzt.
Ich hab meinen Fehler gefunden, es gibt DATA0 und DATA1 udn es gibt
data0 und data1 ich bin einfach davon ausgegangen, dass es das gleiche
ist, aber dem ist nicht so.
Ralf G. schrieb:> *chrischan.x3 schrieb:>> Also wo genau muss ich nun DATA0 und DATA1 anschließen?> Anschließen?
DATA0 und DATA1 sínd die beiden Leitungen die von dem RFID Modul zum
Microcontroller kommen. Dafür ist sicher diese Zusweisung zuständig:
1
D_DIR&=~(DATA0+DATA1);
Ich glaube, dass ich unbedingt meine C 'Fähigkeiten' erneuern muss.
Also mal kurz zusammengefasst:
Mit den ganzen #define Anweisung wird nur festgelegt, dass Du auf Pin0
von PortB als DATA0, bzw. auf Pin1 von PortB als DATA1 zugreifen kannst.
Die Anweisung "unsigned char data0=0,data1=0;" bedeutet ganz einfach
dass zwei variablen vom Typ unsigned char (also 8 bit ohne Vorzeichen)
mit den Namen data0 und data1 angelegt und mit dem Wert 0 initialisiert
werden.
Den Rest verstehst Du so einigermaßen sagst Du............
Aber ich habe dann ja echt meine Zweifel! Wenn Du mit
"unsigned char data0=0,data1=0;" nix anfangen kannst, wie kannst Du dann
mit
"Serial.begin(115200);" oder "card_num[2]|=(1<<(25-recieve_count));" was
anfangen ?
Okay, danke:)
Ich kenne diese Zuweisungen ja, nur bis gerade eben bin ich noch davon
ausgegangen, dass DATA0 udn DATA1 das gleiche wie data0 udn data1 ist
und dann hätte es keinen Sinn ergeben.
Ich bin einfach mal davon ausgegangen, dass ich diese Anweisungen
verstanden hab
1
Serial.begin(115200);
bedeutet soetwas wie die serielle Schnittstelle mit 115200Baud zu
initialisieren
und
1
card_num[2]|=(1<<(25-recieve_count));
card_num[2] ist der dritte Block der 4 Blöcke der Informationen des
Chips.
Und bei dieser Anweisung wird der vierte Block reingeschoben und die
schon bestehenden Ziffern werden weiter nach vorne geschoben, lieg ich
da richtig?
ist recht einfach ... unsigned char
ist nix anderes als 'dim xyz as byte'
das #define ist in bascom einfach 'const'
recieve_count++ gibt in bascom 'incr recieve_count'
delayMicroseconds gibt in bascom 'waitus'
weinbauer schrieb:> komisch im Datenblatt steht was von 9600bps,N,8,1, nicht 115200
Wenn ich das mal so sagen darf, das Datenblatt ist Sch****, ich hab
genau das gleiche gedacht wie du, nämlich, dass das Modul über UART
sendet, aber dem ist nicht so.
Dieses Datenblatt ist für zwei verschiedene Module die aber den gleichen
namen haben, irgendwo steht da etwas von 'Interface' da steht dann UART
oder Wiegand, dies suggeriert -zumindest sehe ich das so- dass man
dieses Modul umstellen kann.
Also ich habe das Modul als Wiegand Modul, von diesem Format habe ich
vorher noch nie etwas gehört. Aber es gibt ja diesen C code und ich
hätte es lieber in Bascom, weil ich damit schon mein ganzes Hausbus
System programmiert hab und ich mittlerweile mit dem UART sehr gut
umgehen kann.
Ich habe 5 von diesen Modulen bestellt, und daraus möchte ich eine
Zugangskontrolle bauen. Das ganze ist so gedacht, dass jedes Modul einen
Microcontroller bekommt, der dann die ausgelesenen Daten via RS485 an
einen Server Sendet, welcher dann entscheidet ob die Karte berechtigt
ist oder nicht. Der Microcontroller schaltet dann ein Relais oder eben
nicht.
Und am Pc kann man dann eben einstellen, wer wann wo rein darf.
ui ui ui ... umtausch auf RS232 ist auch nicht drin, der Shop
führt das Ding nicht ....
wie ich das sehe kommst Du bei dem Format nicht um eine
Eigenkonstruktion von Soft-UART herum um die 26 Bit hintereinander
weg empfangen zu können.
Laut Google hat das noch keiner gemacht ...
Jap, genau das ist ja mein problem.
Aber das muss ja irgendwie gehen, schließlich kann man Wiegand to RS232
Konverter fertig kaufen. Ich hab schon 4 Tage Google hinter mir, ich hab
schon so viel gelesen.
Aber es wär ja sinnlos für so einen Konvertrer über 30Euro auszugeben,
wenn das Modul selbst nur 10Euro kostet. Ich habe einen bei einem
anderen Shop angefragt, dieser hat das Modul in seinem Sortiment aber
zur Zeit nicht lieferbar, aber sie bekommen diese Woche das neue Modul.
Notfalls kann ich die Module ja auch zurückschicken, aber das ist nur
die Notfall Lösung.
Ich hab bei der Entwicklung meiner Haussteuerung auch schon öfters
gedacht jetzt hörst du auf und baust den ganzen Kram wieder ab, aber
dann hab ich es irgendwann doch irgendwie hinbekommen.
weinbauer schrieb:> ui ui ui ... umtausch auf RS232 ist auch nicht drin, der Shop> führt das Ding nicht ....>> wie ich das sehe kommst Du bei dem Format nicht um eine> Eigenkonstruktion von Soft-UART herum um die 26 Bit hintereinander> weg empfangen zu können.>> Laut Google hat das noch keiner gemacht ...
Doch.
Genau der verlinkte Code macht das.
Im verlinkten COde wird die UART nicht dazu benutzt, die Daten vom RFID
Leser auszulesen sondern die gelesenen Daten per UART weiterzugeben.
Ich denke, ihr habt den Code gelesen? So schwer ist das doch gar nicht
zu verstehen.
Aus Wikipedia
When no data is being sent both DATA0 and DATA1 are at the high voltage.
When a 0 is sent the Data Low wire (also called DATA0) is at a low
voltage while the Data High wire stays at a high voltage. When a 1 is
sent Data High is at the low voltage while Data Low stays at the high
voltage.
Und genau das macht der Code:
Er holt sich den Zustand der beiden Pins die Variablen data0 und data1.
Wenn die unterschiedlich sind, dann liegt ein Bit vor. Und der Zustand
von data0 gibt eine Aussage darüber, ob das Bit jetzt 0 oder 1 sein
soll. Man Vergleiche mit der Beschreibung in Wikipedia und stelle fest:
stimmt auffallend, wenn auch in anderen Worten, damit überein.
Der Rest ist nur noch Bitschieberei um die erkannten Bits wieder in 8-er
Gruppen zu 4 Bytes zusammenzusetzen bzw. im else Zweig des
'Sind-die-Bits-unterschiedlich-Falles' das Ausgeben der 4 gelesenen
Bytes per, tata, USART.
Hallo,
anbei mal eine schnelle Übersetzung. Ist ungetestet. Mich würde
interessieren ob das so geht. Trag e mich auch mit dem Gedanken mir ein
paar davon zuzulegen.
Gruß rene
1
Data0 Alias Pinb.1 '//Data pin 0 from RFID module
2
Data1 Alias Pinb.2 '//Data pin 1 from RFID module
3
4
$crystal = 12000000 ' used crystal frequency
5
$baud = 115200
6
7
Config Portb.1 = Input
8
Config Portb.2 = Input
9
10
Dim Recieve_count As Byte
11
Dim Card_num(4) As Byte
12
Dim Temp As Byte
13
14
Do
15
Dim Data_0 As Byte
16
Data_0 = 0
17
Dim Data_1 As Byte
18
Data_0 = 0
19
If Data0 <> 0 Then '//DATA0 incoming signal
20
Data_0 = 1
21
End If
22
If Data1 <> 0 Then '//DATA1 incoming signal
23
Data_1 = 1
24
End If
25
If Data_0 <> Data_1 Then '// card detected
26
Incr Recieve_count
27
If Recieve_count = 1 Then '//drop even bit
28
29
Elseif Recieve_count < 10 Then '// card data group 1
30
If Data_1 = 0 Then
31
Temp = 9 - Recieve_count
32
Temp = 2 ^ Temp
33
Card_num(1) = Card_num(1) Or Temp
34
End If
35
Elseif Recieve_count < 18 Then '// card data group 2
@Karl Heinz Buchegger
Das die serielle Schnittstelle nur dazu da ist die Daten an einen Pc zu
senden weiß ich. Und ein wenig von dem Wiegand Protokoll hab ich auch
verstanden, aber damit umzugehen weiß ich nicht.
@Rene Zimmermann
Vielen Dank für die Übersetzung, vieles davon hab ich auch schon selbst
geschafft, aber genau das mit dem schieben hab ich falsch interpretiert
udn somit auch übersetzt. Ich werde diesen Code sofort ausprobieren,
wenn ich die Module da habe.
Ich habe den Shop Betreiber kontaktiert, dieser war sehr nett. Ich habe
angefragt, ob dieser auch die UART Version beschaffen kann. Und siehe
da, ende nächster Woche sind die Module da. Ich gehe davon aus, dass
diese Module um einiges einfacher auszulesen sind, da die serielle
Schnittstelle bei fast jedem Microcontroller standard ist.
Ich möchte mich auch nocheinmal ganz herzlich für die rege Beteiligung
udn Hilfe bedanken.