Forum: Mikrocontroller und Digitale Elektronik Benötige Hilfe bei der 'Übersetzung' von C auf Bascom für einen RFID Leser


von *chrischan.x3 (Gast)


Lesenswert?

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.

von lalala (Gast)


Lesenswert?


von *chrischan.x3 (Gast)


Lesenswert?

@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.

von Stephan (Gast)


Lesenswert?

das läßt sich ja fast 1:1 in Bascom übersetzen.
Nur Schleifen und IF Abfragen.
Gerade mal 2 Zeilen müsste ein C´ler übersetzen oder erklären.

von *chrischan.x3 (Gast)


Lesenswert?

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:
1
unsigned char data0=0,data1=0;

Das andere versteh ich so einigermaßen:)

von Ralf G. (ralg)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

*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).

...

von *chrischan.x3 (Gast)


Lesenswert?

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.

von Karlheinz D. (karlheinz_d)


Lesenswert?

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 ?

von *chrischan.x3 (Gast)


Lesenswert?

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?

von weinbauer (Gast)


Lesenswert?

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'

von weinbauer (Gast)


Lesenswert?

achso ... #define kann auch als 'alias' in bascom übersetzt werden

von Ralf G. (ralg)


Lesenswert?

weinbauer schrieb:
> das #define ist in bascom einfach 'const'
kann ich mir nicht so richtig vorstellen. (?)

von *chrischan.x3 (Gast)


Lesenswert?

Ich bin gerade dabei das umzusetzten, ich hab recieve_count als Byte 
genommen, also: 'Dim recieve_count as Byte'
Aber wie übersetze ich:
1
if(D_IN&DATA1)  //DATA1 incoming signal
2
    {
3
      data1=1;
4
    }

Und ist
1
if(!data1)
das gleiche wie data1 = 0?

von weinbauer (Gast)


Lesenswert?

komisch im Datenblatt steht was von 9600bps,N,8,1, nicht 115200

von *chrischan.x3 (Gast)


Lesenswert?

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.

von weinbauer (Gast)


Lesenswert?

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 ...

von *chrischan.x3 (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Rene Z. (renezimmermann)


Lesenswert?

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
36
         If Data_1 = 0 Then
37
            Temp = 17 - Recieve_count
38
            Temp = 2 ^ Temp
39
            Card_num(2) = Card_num(2) Or Temp
40
         End If
41
      End If
42
      If Data_1 = 0 Then                                    '// card data group 3
43
         Temp = 25 - Recieve_count
44
         Temp = 2 ^ Temp
45
         Card_num(3) = Card_num(3) Or Temp
46
      End If
47
      Waitus 80                                             '//Data impulse width delay 80us
48
   Else                                                     '// no card incoming or finish reading card
49
      Dim I As Byte
50
      I = 0
51
      If Recieve_count >= 25 Then                           '//output card number
52
         Recieve_count = 0                                  '//reset flag
53
         For I = 1 To 3
54
            Printbin Card_num(i) ; 1
55
            Card_num(i) = 0                                 '//reset card_number array
56
         Next I
57
      End If
58
      Print                                                 '// new line
59
   End If
60
Loop

von Chris S. (chrischanx3)


Lesenswert?

@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.

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.