Ich hab mir mal die Zutrittskontrolle SMQ-303 aus Hong-Kong für 15 Euro schicken lassen. Darin ist ein 8051-Derivat als uC, 3 LEDs, eine 3x4-Matrix als Keypad, ein Tür-Relais, die Stromversorgung (7805) und ein RFID-Leser. Das alles in einem Plastegehäuse mit einem WAF nahe 100%. Nun zur Aufgabe: Der eingebaute uC ist pinkompatibel mit dem atmega8515. Also im Idealfall nix löten, sondern nur neuen uC und programmieren. Die Belegung aller Anschlüsse inkl. Tastaturmatrix ist gut zu erkennen. Mein Problem: Der RFID-Leser ist nicht mit einem EM4095 oder U2270B o.ä. aufgebaut, sondern mit 2 CMOS-IC und einer Handvoll Hühnerfutter. Es gibt 4 Anschlüsse: +5V, Masse, den "fast"-Digital-Ausgang DR-OUT mit den RFID-Daten zum uC und einem Eingang CFE. CFE=LOW gibt den RFID-Leser frei, CFE>1V sperrt den Transponder. Im Original laüft das bis ca. 15cm Abstand 1A! Nun dachte ich mir, das sieht aus wie der U2270B. Im Prinzip macht der lt. Blockschaltbild nichts anderes. Also DR-OUT an den Pind.3 der Pollin-Platte. Da passiert aber nichts. Im Display steht weiter "Check...", Nichts wird erkannt. Der parallel angeschlossene Originalreader geht aber. Ich hab das Signal auch schon mit 2x 4093-Schmitt-Trigger etwas Steiler gemacht, invertiert usw. Auf dem Oszi sieht schon so aus wie die Pollin-Signale. 1. frage: Ist die Polarität der Manchester-Signale am DR-OUT wichtig? Eigentlich ja nicht... 2. frage: Wie manuell Dekodieren. Mit der em4095.lib im Bascom geht es ja anscheinend nicht. Mache ich nun mit dem vorhandenen ID-Modul weiter oder löt ich mir mit dem EM4095 was zusammen und nehm BASCOM? Hat schon mal wer sowas zu Fuß dekodiert? (Möglichst mit BASCOM) Uwe
>1. frage: Ist die Polarität der Manchester-Signale am DR-OUT wichtig? >Eigentlich ja nicht... Je nachdem wie die Software gestrickt ist. >Mache ich nun mit dem vorhandenen ID-Modul weiter oder löt ich mir mit >dem EM4095 was zusammen und nehm BASCOM Wieso baust du ihn denn nicht 1:1 nach? Irgendwie versteht ich noch nicht so recht um was es dir geht.
naja, nachbauen will ich eigentlich gar nichts. Der Reader wie in den 2 Zeichnungen abgebildet liegt bei mir auf dem Schreibtisch. Mein Problem ist, das das Signal aus dem ID-Modul offensichtlich nich völlig identisch mit den Signalen vom U2270/EM4095 ist. Im Prinzip kommt bei den beiden IC-Typen am Ausgang das gefilterte und "digitalisierte" RFID-Signal raus. Nichts anderes macht diese diskret aufgebaute Schaltung. Ich hatte nun die Hoffnung, dass ich mit der Bascom-Lib em4095.lib die Hitag-Funktion nutzen kann und das Signal einfach einlesen kann. Dann brauch ich hardwaretechnisch nichts zu verändern. Geht das nicht, muß ich das ID-Modul rauslöten und durch ein kleines em4095-Modul ersetzen. Die Große Spule im Gehäuse kann ich ja weiterverwenden. Schön wäre eben, wenn jemand sagt "kenn ich, hab ich schon so mal gemacht" Wenn das klappt, will ich 9 Stück davon vernetzen. Da ist Hardware-Aufwandsminimierung schon sinnvoll.
Vielleicht lässt du ja dann mal die Restriktion "muss alles mit BASCOM gehen" fallen? Beispielsweise ist hier vorletztes Jahr http://www.mikrocontroller.net/articles/RFID_T%C3%BCrmodul eine RFID-Reader-Implementierung beschrieben worden, bei der die Software komplett mit dabei liegt. Da kannst du ggf. an der Software feilen, bis sie deinen Datenstrom versteht.
> Ist die Polarität der Manchester-Signale am DR-OUT wichtig?
Eigentlich ja nicht...
Das Empfangene ist ja synchron zum Sender. Daher kann der Empfaenger die
Polaritaet einschraenken.
Kann jemand erklären wie die Schaltung oben (ID-Modul.gif) funktioniert? Also der Teil bis zur Gegentaktendstufe ist klar, aber das danach nicht mehr so ganz. Ich möchte mir einen RFID-Reader aufbauen und überlege noch ob diskret oder als fertiges IC (EM4095). Welche Version (diskret/IC) ist zuverlässiger, flexibler und Leistungsfähiger (größere "Reichweite") wenn sie ordentlich aufgebaut wurde?
Ja, ich kann die Funktion nachvollziehen, immerhin liegt das Teil bei mir auf dem Tisch und funktioniert. Die Messungen mit dem Oszi zeigen dabei auch sehr schön, an welcher Stelle in etwa was passiert. Der obere Teil ist sicherlich klar. Es werden 125kHz erzeugt und auf die Spule gegeben. Resonanzfrequenz spielt hier nur eine untergeordnete Rolle, da die 125kHz ja per Quarz feststehen. Stimmt die Resonanzfreq. nicht, sinkt nur die Reichweite. An der Spule mißt der Oszi etwa 90V (Spitze-Spitze). An der Diode D1 steht das Amplituden(de)modulierte Signal zur weiteren Verarbeitung zur Verfügung. Der 4069 beinhaltet 6 Inverter, welche sich als Analog-Verstärker missbrauchen lassen. Die ersten 4 Stufen sind Tiefpass und Bandpass. Die letzte Stufe verstärkt das Signal derart, dass auf dem Oszi Rechtecke zu erkennen sind. Damit kommt der Ursprünglch verwendete uC zurecht. Dieses Signal an einem AVR (2313 oder m8) und der Bascom-Funktion CONFIG HITAG / Readhitag() geht leider nicht. Daher meine oben gestartete Anfrage bzgl. Dekodierung. Ich hab nun einen U2270B nur als Dekoder dahintergeschaltet und dekodiere wie gehabt mit einem AVR (2313 oder m8) und der Bascom-Funktion CONFIG HITAG / Readhitag(). Warum der ganze Zirkus mit dem ID-Modul und nicht einfach der U2270 allein? Die Reichweite der U2270-Lösung ist bei mir nie weiter als 5cm, egal welche Antenne ich verwende. In dem China-Teil ist eine Antenne ca. 11x11cm gewickelt. (Innenkante gehäuse 11,5x11,5cm) Damit komme ich zuverlässig auf 15cm !!! Außerdem brauche ich mechanisch fast nichts umbauen. der SMD-U2270 ist einfach mit CuL-Draht auf den ATtiny2313 draufgepappt. fertig... Wer die Funktion der 4069-Schaltung verstehen will, sollte sich mal das Blockschaltbild des U2270 anschauen. Der untere Teil ist in Etwa das, was hier zu Fuß gemacht wird. Uwe
Vielen Dank für die Erklärung. Und warum 4069 als Verstärker und keine OPs? Weils billiger ist? Aus deiner Erläuterung schließe ich, dass die Entfernung eher vom Sender als vom Empfänger profitiert, richtig? Warum nimmst du nicht wie von Jörg vorgeschlagen den Code vom Türmodul (zumindest als Grundlage für eine Portierung in BASCOM)?
Micha schrieb: > Vielen Dank für die Erklärung. Und warum 4069 als Verstärker und keine > OPs? Weils billiger ist? > vermutlich richtig. Ich hab nur die Schaltung abgezeichnet... > Aus deiner Erläuterung schließe ich, dass die Entfernung eher vom Sender > als vom Empfänger profitiert, richtig? > so ist auch mein Eindruck... > Warum nimmst du nicht wie von Jörg vorgeschlagen den Code vom Türmodul > (zumindest als Grundlage für eine Portierung in BASCOM)? Weil ich faul bin. Ich muß/will am und im Einfamilienhaus alle relevanten Türen mit so einem Modul ausrüsten und habe dazu etwas gesucht, was mechanisch bereits fertig ist und mit wenigen Handgriffen auf meine Bedürfnisse anzupassen ist. Diese China-Teile in der iBucht für 13-15 Euro sehen ganz gut aus und haben alles dran was ich brauche. Meine Anforderungen Sind: - Tastatur und RFID als Eingabemöglichkeit (per V24 zur Zentrale) - LEDs, evtl. LCD und Beeper als Ausgabe (per V24 von Zentrale) - Relais für Türöffner (per V24 von Zentrale) Zentrale bewertet die RFID und Codeeingaben von den 9-10 Terminals im Haus und öffnet ggf. die Türen. Datenhaltung per MS-SQL-Server 2005. Ggf. werden Infos per LED und/oder LCD am Terminal ausgegeben. Uwe
Hallo ich weiß es passt zwar nicht so richtig zum Thema aber ich es vielleicht möglich das mir jemand eine Anleitung für das smq-303 schickt oder mir einen Link geben kann zum download... Da ich diese nirgens gefunden habe und deshalt das Codeschloss nicht nutzen kann... vielen Dank Hendrik
Diese RFID Antennen haben alle eine Reichweite, die dem Durchmesser der antenne entspricht.
Würde mich interessieren, was aus dem Projekt geworden ist, habe gerade auch von Conrad ein Codeschloss mit RFID (AEI DK-9206) vor mir, verbaut ist die gleiche Schaltung (HC74393 und CD4069, nur 4 Mhz Quarz) und ich kann in einer Schleife mit Bascom 0 und 1 auslesen, die RFID-Routine von Bascom geht nicht. Auf einer Huckepackplatine befindet sich ein Atmega8 und ein serielles EEprom 24C64, auf der Tastatur eine sehr eigenartige Matrix (6 Anschlüsse für 12 Tasten, dabei sind die Tasten 0, * und Raute zwischen den Spaltenanschlüssen geschaltet..) Hat es jemand geschafft, den Rohdatenstrom in Bascom zu dekodieren? Diese Codeschlösser sind superfertig mit Gehäuse und Tastatur, allerdings völlig unbrauchbar: wenn ich es aufschraube, kann ich die Relaiskontakte kurzschließen und "einbrechen" - ein Codeschloss ist nur sinnvoll mit Außen- und Innen/Decodierstation, in meinem Fall soll noch ein Logging dazukommen.
Hallo, habe seit längerem auch so ein RFID Teil und wollte es schon immer mal mit einen AtMega 162 umrüsten. Hat jemand von euch schon was erreicht oder wie weit seit Ihr??? Man könnte ja auch versuchen zusammen zum Ziel zu kommen. Wollte wenn möglich die Software mit Bascom machen. Gruß JOJO
Habe mir das RFID Teil auch von Ebay besorgt. 11€ mit Versand - nicht schlecht. Meine Frage: Kann man daran einfach eine andere Antenne dranhängen, welche vielleicht wie im Projekt "RFID Türöffner" in einen Lichtschalter (Unterputzdose) passt? Und wo bekomme ich die? Danke! Sebastian
Hat mir jemand etwas zum aneignen warum die ersten vier Stufen ein Filter sein sollen? Wie funktioniert der Filter?
Jörg Droß schrieb: > Hallo, > > habe seit längerem auch so ein RFID Teil und wollte es schon immer mal > mit einen AtMega 162 umrüsten. Hat jemand von euch schon was erreicht > oder wie weit seit Ihr??? Man könnte ja auch versuchen zusammen zum Ziel > zu kommen. > > Wollte wenn möglich die Software mit Bascom machen. > > Gruß JOJO Hallo, bei mir läuft das Teil mit Bascom auf einem Mega32. Die Reichweite ist sehr gut. gruss thomas
@tomgr Hast Du den Mega32 mit Bascom in der unveränderten Hardware des RFID-Readers laufen? D.h. alten IC raus und neuen rein, Bascom-Code rauf und fertig? Wenn ja, wie hast Du die Dekodierung des RFID-Signals in Bascom gelöst? Kannst Du was zur Nachnutzung anbieten... Gruß Uwe
Hallo Uwe, der Mega32 ist nicht Pinkompatibel, hängt im Moment extern dran. Der AtMega 162 sollte aber gehen, ist Pinkompatibel zum orginal. Ich habe meine Routine vom Pollin Board mal wieder rausgekrammt, und eigendlich nur _cfe (_cfe=0) im Code umgedreht. Der Reader liest die Tag's und ich setzte die ID's ins LCN Format um, um den Transpondercode im LCN auszuwerten, um da, die verschiedenen Aktionen auszulösen. Codeauszug :
1 | |
2 | Dim Tags(5) As Byte '"Tags" als Array mit 5 Bytes definieren |
3 | Dim Zaehler As Byte '"Zähler" als Byte definieren |
4 | ' Config Portb = Output 'Port B als Ausgang definieren |
5 | Config Hitag = 64 , Type = Em4095 , Demod = Pind.3 , Int = @int1 'konfiguriert den Timer und die Variablen für HITAG |
6 | _cfe Alias Portd.4 '_cfe wird dem Portd.2 zugewiesen |
7 | Config _cfe = Output '_cfe wird als Ausgand definiert |
8 | ' _cfe = 1 '_cfe wird high |
9 | _cfe = 0 |
10 | On Int1 Checkints Nosave 'Int1 wird als Eingang für HITAG verwendet |
11 | ' Mcucr.isc10 = 1 ' entspricht: config INT1 = changing ( der Befehl wird vom MC unterstützt, |
12 | ' Mcucr.isc11 = 0 ' beim 2313 aber nicht von Bascom) |
13 | Config Int1 = Change |
zum testen reicht auch jeder andere Mega, aus dem Schaltplan oben, müssen nur die beiden Leitungen der Antennenschaltung auf einen IRQ und einen Ausgang gelegt werden. gruss thomas - der erstmal, einige atmega162 besorgen muss.
Hallo Thomas, ich habe vor mehr als 1 Jahr mal mit dem mega8515 probiert, weil der nahezu unverändert einsetzbar ist. Allerdings wollte der die RFID-Signale nicht dekodieren. Siehe mein Beitrag vom 19.2.2010...
1 | '**************************************************************************** |
2 | ' RFID mit dem SMQ303 |
3 | ' Buzzer ansteuern: Vom PC aus und/oder bei Tastendruck (abschaltbar) |
4 | ' LCD Blinkende Zeichen |
5 | ' Sabotagekontakt / Spontanmeldung und Abfrage |
6 | '
|
7 | '**************************************************************************** |
8 | Const Sim = 1 |
9 | |
10 | #if Sim = 1
|
11 | $sim |
12 | #endif
|
13 | |
14 | $regfile = "m8515.dat" ' ATmega8515-Deklarationen |
15 | |
16 | Const Quarz = 8000000 ' Quarz: 8 MHz |
17 | $crystal = Quarz |
18 | |
19 | $hwstack = 128 |
20 | $swstack = 128 |
21 | $framesize = 128 |
22 | |
23 | $baud = 1200 ' Baudrate der UART: 1200 Baud |
24 | |
25 | On Urxc Ser_inp ' Interrupt-Routine setzen |
26 | Enable Urxc ' Interrupt URXC einschalten |
27 | |
28 | #if Sim = 0
|
29 | Config Watchdog = 2048 ' 2 Sekunden Watchdog |
30 | Start Watchdog ' Start watchdog timer |
31 | #endif
|
32 | |
33 | Const Pre = 8 |
34 | |
35 | Config Timer0 = Timer , Prescale = Pre |
36 | On Ovf0 Tim0_isr ' Define the ISR handler |
37 | Enable Timer0 |
38 | |
39 | Const Reload = Int(quarz /((256 * Pre) * 10)) |
40 | ' Teiler um mit Timer0 auf 100ms-INT zu kommen |
41 | |
42 | Config Hitag = 64 , Type = Em4095 , Demod = Pind.3 , Int = @int1 'konfiguriert den Timer und die Variablen für HITAG |
43 | Config Int1 = Change |
44 | On Int1 Checkints Nosave 'Int1 wird als Eingang für HITAG verwendet |
45 | |
46 | |
47 | Enable Interrupts ' Interrupts freigeben |
48 | |
49 | |
50 | Const Lstring = "" ' Leerstring |
51 | Const Cr = 13 ' Carrige Return |
52 | Const Lf = 10 ' LineFeed |
53 | Const Null = 0 ' Null |
54 | |
55 | Const Aus = 0 ' Wert für aus |
56 | Const Ein = 1 ' Wert für ein |
57 | |
58 | |
59 | '**************************************************************************** |
60 | 'Pins / Zuweisung der Ports |
61 | |
62 | Led_power Alias Portb.1 ' Led oben rot "POWER" |
63 | Led_ok Alias Portb.2 ' Led mitte grün "OK" |
64 | Led_mode Alias Portb.3 ' Led unten gelb "MODE" |
65 | |
66 | Relais Alias Portb.4 ' Relais H zieht an |
67 | Signal Alias Portd.4 ' L = Beep |
68 | Cfe Alias Portd.6 ' /CFE L=Transponder arbeitet |
69 | |
70 | Sabotage Alias Pind.2 ' Sabotagekontakt L=OK |
71 | |
72 | 'Tastatur PortC |
73 | |
74 | Jumper Alias Pinc.7 |
75 | |
76 | Zeile123 Alias Pinc.0 ' 4 Zeilen mit PullUP-R |
77 | Zeile456 Alias Pinc.1 |
78 | Zeile789 Alias Pinc.2 |
79 | Zeile000 Alias Pinc.3 |
80 | |
81 | Spalte147 Alias Portc.4 ' 3 Spaltenausgänge |
82 | Spalte258 Alias Portc.5 |
83 | Spalte369 Alias Portc.6 |
84 | |
85 | Beep Alias Pinb.0 ' Klingeltaste als Enter |
86 | |
87 | '**************************************************************************** |
88 | Startup: |
89 | '**************************************************************************** |
90 | |
91 | Ddra = &B0000_0000 ' EEEE_EEEE |
92 | Ddrb = &B1111_1110 ' AAAA_AAAE |
93 | Ddrc = &B0111_0000 ' EAAA_EEEE |
94 | Ddrd = &B1101_0010 ' AAEA_EEAE |
95 | Ddre = &B000 ' EEE |
96 | |
97 | Porta = &B0000_0000 ' |
98 | Portb = &B0000_1111 ' |
99 | Portc = &B1111_1111 ' |
100 | Portd = &B1111_1111 ' |
101 | Porte = &B000 ' |
102 | |
103 | |
104 | '**************************************************************************** |
105 | '
|
106 | Const Kennung = "Terminal 01" ' Startmeldung (20 Byte lang) |
107 | ' 12345678901234567890 |
108 | '**************************************************************************** |
109 | 'Variablen |
110 | Dim Bl As Byte ' Überwachung der Stringlänge im Buffer |
111 | Dim C As Byte |
112 | Dim Buffer As String * 16 ' Zeichenpuffer für serielle Eingaben |
113 | Dim Lb As Byte ' Pufferlänge |
114 | Dim Cmd As String * 5 |
115 | |
116 | Dim Scounter As Word ' zählt für 100 ms |
117 | Dim Sekunde As Byte ' Sekundenzähler |
118 | Dim Relaistimer As Byte |
119 | |
120 | Dim Tastenklicks As Bit ' Tastenklicks ein/aus |
121 | Dim Sperre As Bit ' Terminal gesperrt |
122 | Dim Waiting As Bit ' Wartebit für gelbe LED |
123 | Dim Led As Bit ' Zustand der Status-LED |
124 | Dim Takt As Bit ' Takt-LED |
125 | Dim Takt1s As Bit ' 1s-Takt |
126 | Dim Takt100ms As Bit ' 100ms-Takt |
127 | Dim Tmp_takt As Bit ' aktueller Takt für LED |
128 | |
129 | Dim Code As Byte ' Zustandscode der aktuellen LED |
130 | Dim M As Byte ' Zählvariable |
131 | Dim N As Byte |
132 | |
133 | Dim Puffer(17) As Byte ' LED-Array |
134 | |
135 | Dim Signalcounter As Byte |
136 | Dim Keycounter As Byte |
137 | Dim Keyzeile As Byte |
138 | Dim Keyspalte As Byte |
139 | Dim Keytemp As Byte |
140 | Dim Keychr As String * 5 |
141 | |
142 | Dim Tags(5) As Byte ' "Tags" als Array mit 5 Bytes definieren bytes |
143 | Dim Zaehler As Byte ' "Zähler" als Byte definieren |
144 | Dim Wert As String * 10 ' "Wert" als String mit 5 Hexwerten definieren |
145 | |
146 | '**************************************************************************** |
147 | |
148 | 'Variablen setzen---------------------------- |
149 | Cfe = 0 ' cfe wird 0 = Spule ein |
150 | Set Spalte147 |
151 | Set Spalte258 |
152 | Set Spalte369 |
153 | |
154 | Reset Sperre |
155 | Reset Waiting |
156 | Reset Relais |
157 | Set Tastenklicks |
158 | Set Signal |
159 | |
160 | Reset Led_power |
161 | Reset Led_ok |
162 | Reset Led_mode |
163 | |
164 | |
165 | Buffer = Lstring ' Buffer leer |
166 | Bl = Null ' Bufferlänge = 0 |
167 | C = Null ' ser.Puffer leer |
168 | |
169 | Scounter = Reload ' 100 ms-Zähler auf Startwert |
170 | Sekunde = 0 ' Sekundenteiler auf 0 |
171 | Keycounter = 0 |
172 | |
173 | Set Takt |
174 | |
175 | Do ' Do-Schleife |
176 | |
177 | If Sperre = 1 Then Goto Ohne_rfid |
178 | |
179 | If Readhitag(tags(1)) = 1 Then ' INT1 wird enabled |
180 | Cfe = 1 |
181 | Reset Led_power ' rote LED aus |
182 | |
183 | For Zaehler = 5 To 1 Step -1 ' For-Schleife beginnend von 5 nach 1; rückwärts zählend |
184 | Wert = Wert + Hex(tags(zaehler)) ' "Wert" = bestehender inhalt in der Variable + gerade gelesenen Tag an Position vom Zähler |
185 | Next ' Ende For-Schleife |
186 | Cfe = 0 |
187 | |
188 | Disable Int0 ' damit kein Tastendruck dazwischenrutscht |
189 | Print "rfid:"; |
190 | Print Wert |
191 | Enable Int0 |
192 | |
193 | Set Led_power ' rote LED ein |
194 | |
195 | End If ' Ende der If-Abfrage |
196 | |
197 | Ohne_rfid: |
198 | |
199 | If Sperre = 1 Then Cfe = 1 Else Cfe = 0 |
200 | Waitms 500 ' Warte 500 ms |
201 | |
202 | Loop ' Sprunganweisung zum Anfang Do-Schleife |
203 | |
204 | End
|
205 | |
206 | '**************************************************************************** |
207 | Ser_inp: |
208 | '**************************************************************************** |
209 | |
210 | C = Udr 'Byte aus der UART auslesen |
211 | ' ##### Print Chr(c); |
212 | ' auf Zeichen prüfen und ggf. verarbeiten |
213 | '-------------------------------------------------------------------------- |
214 | If C > 32 And C < 128 And Bl < 50 Then |
215 | ' wenn ASCII Zeichen und kürzer als 15 Zeichen.. |
216 | Buffer = Buffer + Chr(c) ' ...dann an Puffer anhängen |
217 | Bl = Bl + 1 ' Counter++ |
218 | Else
|
219 | If C = Cr Then Gosub Handlebuffer ' sonst auswerten |
220 | End If |
221 | '-------------------------------------------------------------------------- |
222 | Return
|
223 | |
224 | '**************************************************************************** |
225 | Handlebuffer: |
226 | '**************************************************************************** |
227 | |
228 | Lb = Len(buffer) |
229 | Cmd = Left(buffer , 2) |
230 | '............................................................................ |
231 | |
232 | Select Case Lb ' welches Kommando |
233 | Case 2 : If Cmd = "::" Then |
234 | Print Kennung ' Kennung abfragen |
235 | End If |
236 | If Cmd = ":." Then |
237 | Print "." ' Ping antworten |
238 | End If |
239 | If Cmd = ":!" Then |
240 | Print ">Reset Terminal" |
241 | Print ">Warte auf Reboot..." |
242 | Wait 1 |
243 | Disable Interrupts |
244 | End If |
245 | If Cmd = ":p" Then Reset Led_power |
246 | If Cmd = ":P" Then Set Led_power |
247 | If Cmd = ":o" Then Reset Led_ok |
248 | If Cmd = ":O" Then Set Led_ok |
249 | If Cmd = ":m" Then Reset Led_mode |
250 | If Cmd = ":M" Then Set Led_mode |
251 | If Cmd = ":w" Then Reset Waiting |
252 | If Cmd = ":W" Then Set Waiting |
253 | If Cmd = ":s" Then Reset Sperre |
254 | If Cmd = ":S" Then Set Sperre |
255 | If Cmd = ":k" Then Reset Tastenklicks |
256 | If Cmd = ":K" Then Set Tastenklicks |
257 | |
258 | Case 4 : If Lcase(cmd) = ":r" Then |
259 | Cmd = Mid(buffer , 3 , 2) |
260 | N = Val(cmd) |
261 | If N > 0 And N < 100 Then |
262 | Set Led_ok |
263 | Relaistimer = N |
264 | Set Relais |
265 | End If |
266 | End If |
267 | If Lcase(cmd) = ":b" Then |
268 | Cmd = Mid(buffer , 3 , 2) |
269 | N = Val(cmd) |
270 | If N > 0 And N < 100 Then Signalcounter = N |
271 | End If |
272 | Case Else : |
273 | End Select |
274 | '............................................................................ |
275 | |
276 | Buffer = Lstring ' Buffer leeren |
277 | Bl = Null ' Bufferlänge = 0 |
278 | |
279 | Return
|
280 | |
281 | '------------------------------------------------------------------------------- |
282 | Checkints: ' Unterroutine "Checkints:" |
283 | '------------------------------------------------------------------------------- |
284 | |
285 | Call _checkhitag ' Eine ausgelagerte Unterroutine aufrufen |
286 | |
287 | Return ' Sprunganweisung in die Hauptschleife |
288 | |
289 | '**************************************************************************** |
290 | Tim0_isr: ' Timer0-ISR |
291 | '**************************************************************************** |
292 | |
293 | If Scounter > Null Then ' Per Zählvariable eine 100ms-Funktion machen |
294 | Scounter = Scounter - 1 |
295 | Else
|
296 | Scounter = Reload ' Reloadwert für 100ms |
297 | Gosub 100ms ' Funktion 100ms |
298 | End If |
299 | |
300 | '************* Keypad ***************************************************** |
301 | ' 0 alles aus |
302 | ' 10 spalte1 ein |
303 | ' 20 zeile1-3 lesen und spalte1 aus |
304 | ' 30 spalte2 ein |
305 | ' 40 zeile1-3 lesen und spalte2 aus |
306 | ' 50 spalte3 ein |
307 | ' 60 zeile1-3 lesen und spalte3 aus |
308 | |
309 | If Keycounter < 60 Then |
310 | Keycounter = Keycounter + 1 |
311 | Else
|
312 | Keycounter = 0 |
313 | End If |
314 | |
315 | If Keycounter = 10 Then Reset Spalte147 |
316 | If Keycounter = 30 Then Reset Spalte258 |
317 | If Keycounter = 50 Then Reset Spalte369 |
318 | |
319 | If Keycounter = 20 Then |
320 | Keyzeile = 0 |
321 | Keyzeile = Pinc And &B0000_1111 |
322 | If Keyzeile > 0 Then |
323 | Keycounter = 0 |
324 | Keytemp = Keyzeile + &H10 |
325 | End If |
326 | Set Spalte147 |
327 | End If |
328 | |
329 | If Keycounter = 40 Then |
330 | Keyzeile = 0 |
331 | Keyzeile = Pinc And &B0000_1111 |
332 | If Keyzeile > 0 Then |
333 | Keycounter = 0 |
334 | Keyzeile = Keyzeile + &H20 |
335 | End If |
336 | Set Spalte258 |
337 | End If |
338 | |
339 | If Keycounter = 20 Then |
340 | Keyzeile = 0 |
341 | Keyzeile = Pinc And &B0000_1111 |
342 | If Keyzeile > 0 Then |
343 | Keycounter = 0 |
344 | Keyzeile = Keyzeile + &H30 |
345 | End If |
346 | Set Spalte369 |
347 | End If |
348 | |
349 | If Keycounter = 0 And Keytemp > 0 Then |
350 | |
351 | If Keyzeile = &H11 Then Keychr = "1" |
352 | If Keyzeile = &H21 Then Keychr = "2" |
353 | If Keyzeile = &H31 Then Keychr = "3" |
354 | If Keyzeile = &H12 Then Keychr = "4" |
355 | If Keyzeile = &H22 Then Keychr = "5" |
356 | If Keyzeile = &H32 Then Keychr = "6" |
357 | If Keyzeile = &H14 Then Keychr = "7" |
358 | If Keyzeile = &H24 Then Keychr = "8" |
359 | If Keyzeile = &H34 Then Keychr = "9" |
360 | If Keyzeile = &H18 Then Keychr = "*" |
361 | If Keyzeile = &H28 Then Keychr = "0" |
362 | If Keyzeile = &H38 Then Keychr = "#" |
363 | |
364 | Print Keychr; |
365 | |
366 | End If |
367 | |
368 | If Beep = 0 Then Print Chr(lf) ; Chr(cr) |
369 | |
370 | If Tastenklicks = 1 Then |
371 | Reset Signal |
372 | Waitms 50 |
373 | Set Signal |
374 | End If |
375 | |
376 | If Keycounter = 0 Then Keytemp = 0 |
377 | |
378 | Return
|
379 | |
380 | '**************************************************************************** |
381 | 100ms: ' 100Milli-Sekunden-Interrupt |
382 | '**************************************************************************** |
383 | |
384 | If Sperre = 1 Then Led_ok = Takt Else Reset Led_power |
385 | |
386 | Takt = Takt Xor 1 ' LED = NOT LED |
387 | Takt100ms = Takt |
388 | |
389 | If Waiting = 0 Then Reset Led_power Else Led_power = Takt |
390 | If Sperre = 1 Then Led_power = Takt |
391 | |
392 | #if Sim = 0
|
393 | Reset Watchdog |
394 | #endif
|
395 | |
396 | If Sekunde > Null Then |
397 | Sekunde = Sekunde - 1 |
398 | Else
|
399 | Gosub 1s |
400 | Sekunde = 10 |
401 | End If |
402 | |
403 | If Relaistimer > Null Then |
404 | Relaistimer = Relaistimer - 1 |
405 | Else
|
406 | Reset Relais |
407 | Reset Led_ok |
408 | End If |
409 | |
410 | If Signalcounter > Null Then |
411 | Signalcounter = Signalcounter - 1 |
412 | Reset Signal |
413 | Else
|
414 | Set Signal |
415 | End If |
416 | |
417 | Return
|
418 | |
419 | '**************************************************************************** |
420 | 1s: ' Sekundenroutine |
421 | '**************************************************************************** |
422 | |
423 | Led = Led Xor 1 |
424 | Takt1s = Led |
425 | If Waiting = 1 Then Reset Led_mode Else Led_mode = Led ' gelbe LED blinkt |
426 | ' dauerlicht, wenn auf etwas gewartet wird |
427 | Return
|
428 | |
429 | '**************************************************************************** |
Mir ist noch nicht recht klar, warum es nicht geht. Int1 ist auf Change, auch sonst habe ich alles von Pollin nachgestrickt. Ich hatte beide Varianten (Pollin mit 2313 und SMQ303 mit m8515) nebeneinander auf dem Tisch und konnte mit dem Oszi vergleichsmessungen machen. Es hätte gehen sollen... Bestimt habe ich eine Kleinigkeit in der Programmierung übersehen. Vielleicht siehst Du ja einen Fehler. Übrigens sind die Portzuweisungen Psaaend zur China-Hardware. Gruß Uwe
Hallo Uwe, ich schaue mir das mal an, und specke meinen Code mal ab, da sind einige Dinge drin, die ich nicht posten kann. gruss thomas
Hallo Uwe, hab auf die schnelle mal den Code bei mir, auf einem Mega16 mit 16 MHz Quarz getestet. Port's vom IC-Sockel abgegriffen. Die ID's zeige ich in dem Display an, es geht. Den LCN Code habe ich hier rausgeworfen.
1 | $regfile = "m16def.dat" |
2 | |
3 | $crystal = 16000000 |
4 | $hwstack = 40 |
5 | $swstack = 32 |
6 | $framesize = 128 |
7 | |
8 | $baud = 9600 |
9 | Config Com1 = Dummy , Synchrone = 0 , Parity = Even , Stopbits = 1 , Databits = 7 , Clockpol = 0 |
10 | |
11 | Config Lcdpin = Pin , Rs = Porta.1 , E = Porta.2 , Db4 = Porta.3 , Db5 = Porta.4 , Db6 = Porta.5 , Db7 = Porta.6 |
12 | Config Lcd = 16 * 2 'konfiguriert die Displaygröße |
13 | Config Lcdbus = 4 |
14 | Cursor Off |
15 | Cls |
16 | |
17 | ' LED Ports |
18 | Config Pinb.4 = Output 'LED |
19 | Config Pinb.5 = Output 'LED |
20 | P_sende_led Alias Portb.4 |
21 | P_empfang_led Alias Portb.5 |
22 | Config Pind.5 = Output 'LED |
23 | Config Pind.6 = Output 'LED |
24 | Config Pind.7 = Output 'LED |
25 | P_ok_led Alias Portd.5 |
26 | P_mode_led Alias Portd.6 |
27 | P_power_led Alias Portd.7 |
28 | Config Pinc.3 = Output 'LED |
29 | P_sound Alias Portc.3 |
30 | P_sound = 1 |
31 | |
32 | '------------------------------------------------------------------------------------------------------------------ |
33 | ' Variablen Allgemein |
34 | Dim B_sec_zaehler As Byte |
35 | Dim B_minuten_zaehler As Byte |
36 | Dim B_i As Byte |
37 | Dim B_j As Byte |
38 | |
39 | ' Var für I-Port senden |
40 | Dim B_ix_w_byte(6) As Byte ' 6 Sendebytes zum I-Port |
41 | Dim B_ix_anzahl_byte As Byte ' für for Schleife ' |
42 | Dim Bi_ix_pegel As Byte 'Bit ' letzter Pegel |
43 | Dim B_ix_bit As Byte ' für for Schleife |
44 | Dim B_ix_bit_high_low As Byte ' Ist das Bit high oder low |
45 | Dim Bi_ix_timer_flag As Byte 'Bit ' Timer Flag zum senden |
46 | Dim B_ix_var As Byte ' tvar,r1var oder r2var |
47 | Dim B_ix_segment As Byte ' Segment |
48 | Dim B_ix_ls As Byte ' als LS senden |
49 | Dim B_ix_sendet As Byte |
50 | |
51 | '------------------------------------------------------------------------------------------------------------------ |
52 | 'Timer1, Einstellungen für 8MHz |
53 | Dim B_timer As Byte |
54 | Const Timervorgabe1 = 61536 ' Timer isr 16 MHZ |
55 | Config Timer1 = Timer , Prescale = 1 ' Irq alle 250µs |
56 | On Timer1 Ix_sende_timer |
57 | Timer1 = Timervorgabe1 |
58 | Enable Timer1 |
59 | '------------------------------------------------------------------------------------------------------------------ |
60 | Dim Tags(5) As Byte '"Tags" als Array mit 5 Bytes definieren |
61 | Dim Zaehler As Byte '"Zähler" als Byte definieren |
62 | ' Config Portb = Output 'Port B als Ausgang definieren |
63 | Config Hitag = 64 , Type = Em4095 , Demod = Pind.3 , Int = @int1 'konfiguriert den Timer und die Variablen für HITAG |
64 | _cfe Alias Portd.4 '_cfe wird dem Portd.2 zugewiesen |
65 | Config _cfe = Output '_cfe wird als Ausgand definiert |
66 | ' _cfe = 1 '_cfe wird high |
67 | _cfe = 0 |
68 | On Int1 Checkints Nosave 'Int1 wird als Eingang für HITAG verwendet |
69 | ' Mcucr.isc10 = 1 ' entspricht: config INT1 = changing ( der Befehl wird vom MC unterstützt, |
70 | ' Mcucr.isc11 = 0 ' beim 2313 aber nicht von Bascom) |
71 | Config Int1 = Change |
72 | |
73 | '------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
74 | |
75 | Enable Interrupts 'Enable all interrupts |
76 | '------------------------------------------------------------------------------------------------------------------ |
77 | |
78 | Dim Wert As String * 5 '"Wert" als String mit 5 Hexwerten definieren |
79 | |
80 | Locate 1 , 1 'Cursor am Display in Zeile 1, ganz links |
81 | Lcd "RFID" ' Text schreiben |
82 | Locate 2 , 1 'Cursor am Display in Zeile 1, ganz links |
83 | Lcd "LCN-Modul" ' Text schreiben |
84 | |
85 | '------------------------------------------------------------------------------------------------------------------ |
86 | Main: ' ab hier beginnt das Hauptprogramm |
87 | Do ' Do-Schleife |
88 | If Readhitag(tags(1)) = 1 Then ' INT1 wird enabled |
89 | Set P_ok_led ' Led 1 Zustand wechseln |
90 | |
91 | _cfe = 1 |
92 | P_sound = 1 |
93 | For Zaehler = 5 To 1 Step -1 ' For-Schleife beginnend von 5 nach 1; rückwärts zählend |
94 | If Zaehler = 5 Then ' ab hier werden die Tagbytes in I-Portbytes gesetzt |
95 | B_ix_w_byte(2) = Tags(4) |
96 | Wert = Wert + Hex(tags(5)) |
97 | End If |
98 | If Zaehler = 4 Then |
99 | B_ix_w_byte(3) = Tags(3) |
100 | Wert = Wert + Hex(tags(4)) |
101 | End If |
102 | If Zaehler = 3 Then |
103 | B_ix_w_byte(4) = Tags(2) |
104 | Wert = Wert + Hex(tags(3)) |
105 | End If |
106 | If Zaehler = 2 Then |
107 | B_ix_w_byte(5) = Tags(1) |
108 | Wert = Wert + Hex(tags(2)) |
109 | End If |
110 | If Zaehler = 1 Then |
111 | B_ix_w_byte(6) = 03 'Typ 3 |
112 | Wert = Wert + + Hex(tags(1)) |
113 | End If |
114 | Next ' Ende For-Schleife |
115 | |
116 | Cls ' Display löschen |
117 | Locate 1 , 1 ' Cursor in Zeile 1, Position 1 |
118 | Lcd "send..." ' Text schreiben |
119 | Locate 2 , 1 ' Cursor in Zeile 2, Position1 |
120 | Lcd Wert ' Variable "Wert" schreiben |
121 | Wert = "" ' Inhalt von Variable "Wert" = "" |
122 | Gosub Lcn_senden ' I-Port senden |
123 | ' Waitms 200 ' Warte 500 ms |
124 | Reset P_ok_led ' Led 1 Zustand wechseln |
125 | |
126 | _cfe = 0 |
127 | P_sound = 1 |
128 | End If |
129 | Loop ' Sprunganweisung zum Anfang Do-Schleife |
130 | '----------------------------------------------------------------------------------------------------------- |
131 | '----------------------------------------------------------------------------------------------------------- |
132 | Checkints: ' Unterroutine "Checkints:" |
133 | Call _checkhitag ' Eine ausgelagerte Unterroutine aufrufen |
134 | Return ' Sprunganweisung in die Hauptschleife |
135 | |
136 | '----------------------------------------------------------------------------------------------------------- |
137 | 'ISR |
138 | Ix_sende_timer: ' Timer Sendelänge vom Signal = 250µs |
139 | Timer1 = Timervorgabe1 |
140 | Incr B_timer 'Sendeflag setzen |
141 | Return |
142 | |
143 | Lcn_senden: |
144 | Return |
145 | '------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
146 | |
147 | End 'Programmende |
gruss thomas - ich hoffe, es hilft dir weiter.
Hallo Uwe, Atmega162 ist drin, und läuft. Umbau, Reset R hängt an Masse, muss auf +5V ! Out ist an PIN15, muss an PIN13 (INT1). Dann klappt das auch. gruss tomgr
Hallo Leute, ich habe mir die Schaltung nachgebaut, jedoch gibt es keine Information welche Transistoren verwendet wurden. Könnt Ihr mir da bitte weiterhelfen? Vielen Dank schonmal! Gruß Michael
Meinst Du die Treiberstufe für die Spule? Da geht fast alles was min. 100V aushält, 1xnpn 1xpnp z.B. aus der Bastelkiste. Die Schaltung arbeitet im Schaltbetrieb, also kaum Verlustleistung bei 125kHz. Allerdings können durch den Schwingkreis erhebliche Spannungen entstehen. Uwe
Super Danke! Am Ende der Treiberstufe kommt laut Oszi ein wunderbares Signal raus. Schließe ich dann allerdings die Spule an (~ 1,6mH + 1,2nf) zieht mir die ganze Schaltung gut 500mA, was deutlich zu viel ist ... Ich habe die Schaltung 1:1 nach dem Schaltplan aufgebaut aber irgendwo ist der Wurm drin. Meine bisherigen RFID Reader mit U2270B und EM4095 laufen wunderbar mit der gleichen Spule (gekauft, nicht selbst gewickelt). Gruß Michael
Wenn die Schaltung ohne Spule sauber arbeitet (also Rechteck 125kHz mit Amplitude 0V..Betriebsspannung), dann sollte alles ok sein. Ich kann mir nur vorstellen dass der Kondensator vom Reihenschwingkreis Feinschluss hat und damit die ohmsche Last der Spule alles kurzschließt. 500mA in der Speiseleitung ist zuviel. Allerdings kann man 500mA <im> Schwingkreis im Rahmen einer Fehlmessung durchaus messen. merke: Wer viel misst, misst viel Mist... Gruß Uwe
Vielen Dank nochmal für die Hilfe! Nun scheint alles zu passen ... ca. 110V an der Spule mein AVR liest brav mit ReadHitag An was es nun lag kann ich leider nicht sagen, hauptsache es funzt :) Gruß Michael
Hallo, was macht denn der IC1D? Wird der als rectifier gebraucht? Würde das nämlich gerne nachbauen -nur mit 13.56 MHz und mit einem FUGenerator (weil ich grad einen da hab) statt Quartz. Da würd ich dann eben ICD1 und Frequenzteiler weglassen und direkt das Rechtecksignal auf die Transistor-Endstufe geben.
IC1D wird als Inverter genommen, macht 180° Phasendrehung, der Quarz samt Beschaltung macht die anderen 180°. Zusammen 360° ergeben eine Mitkopplung und fertig ist der Oszillator für die 8MHz... Wenn Du einen fertigen Taktgenerator hast, kannst Du den IC1D totlegen.
Hallo, muss den Thread nochmal ausgraben. Versuche gerade eine 13.56MHz version des obigen Readers zu basteln. Das Rechtecksignal kommt bei mir aus einem Frequenzgenerator und die Schaltung hab ich erstmal so zusammengebaut wie im Bild. Wenn ich aber nun die Versorgungsspannung für die Transen abschalte, bleibt mein Signal trotzdem an der Spule. Und egal mit oder ohne Versorgungsspannung es hat immer die Amplitude wie es der FrequGen ausspuckt. Dachte mir eigentlich, dass diese Transistor-Endstufe die Spannung erhöht? Oder ist sie nur zur Stromerhöhung? Oder hab ich da dem Hund drinn? Jedenfalls soll es natürlich nicht so sein, dass ich mit der 500mV Amplitude vom FrequGen auf die Spule gehe. Kann mir da jemand einen Tipp geben wie ich das hinbekomm, eine höhre Spannung auf die Spule zu bekommen? Bei einem Reader den ich mal ausgemessen hab, warens +-5 V.
Die abgebildete Transistorschaltung ist ein reiner Folger im Push-Pull Betrieb, also Stromverstärker. Er verliert natürlich 2 mal die Basis-Emitterspannung am Ausgang. D.h. bei 3V Eingang kommt nur noch etwa die Hälfte hinten heraus. Der nachfolgende Schwingkreis muss exakt auf die verwendete Frequenz abgestimmt sein, um die gewünschte Spannungsüberhöhung an der Spule zu erreichen.
Danke für die Erklärung. Habe das probiert, und konnte durch das Abgleichen des Schwingkreises mittels Drehkondensator die Amplitude auf +-1,5V heben. Habe auch im Elektor diese Schaltung mit DMOS Gegentakt-Verstärker gefunden. Werde die auch mal aisprobieren und erwarte mir damit die gewünschte +- 5V Amplitude. Oder seht ihr da ein Problem? Ich meine mal wo gelesen zu haben, dass Gegentaktverstärker nur mit bipolaren Transistoren funktionieren und nicht mit MOS-FETs? Und weil wir schon dabei sind? Warum wird der Ausgang des NAND-Gatters (für die ASK Modultion) nochmal ins Gatter geführt und dann erst auf die Verstärkerstufe?
Michael M. schrieb: > Ich meine mal wo gelesen zu haben, dass Gegentaktverstärker nur mit > bipolaren Transistoren funktionieren und nicht mit MOS-FETs? wieso denn das? die Art der Schaltung hat doch nichts mit den verwendeten Transistortypen zu tun. Michael M. schrieb: > Warum wird der Ausgang des NAND-Gatters > (für die ASK Modultion) nochmal ins Gatter geführt und dann erst auf die > Verstärkerstufe? weil hier Gatter C und D als MOSFET Treiber verwendet werden. Gatter A ist der Oszillator, Gatter B der Modulator, Gatter C der Treiber für den oberen MOSFET und Gatter D der Treiber für den unteren MOSFET. D.h. mit dem Modulator Gatter B lässt sich die Endstufe ein- und ausschalten oder modulieren.
Super, danke erstmal. Ein bisschen steh ich aber noch auf der Leitung. Wenn ich eine einfache Logiktabelle erstelle: Mod-Bit clk B C=D 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 0 ...dann frag ich mich wie ich mit dem Modulatios-bit die Modulation (=Signal am Ausgang von B) ein und aus schalte? Ist doch nie unabhängig von clk 0 wenn zB das Modulations-bit 0 oder 1 ist. Und wie da übehaupt jemals ein Signal bei C oder D rauskommen kann ist mir auch rätselhaft. Das sind doch NAND-Gatter oder? Wenn da am Eingang von zB Gatter C der selbe pegel anliegt ist doch dass Ergebnis immer 0, oder? Danke für jeden Tipp.
Michael M. schrieb: > Ein bisschen steh ich aber noch auf der Leitung. Nicht nur ein bisschen !!!! Schreib dir mal die Wahrheitstabelle eines AND Gatters und eines NAND Gatters auf. Dann siehst du es sofort CLK MOD AND NAND (Ausgang von Gatter B) 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 0 D.h. der Ausgang von Gatter B ist 1 wenn MOD 0 ist. Gatter C und D sind NANDs mit kurzgeschlossenen Eingängen also Inverter! damit die MOSFETS genug Gate-Ladestrom bekommen, sind beide Gatter parallel geschaltet. Durch die Invertierung liegt jetzt also eine 0 an den Gates. Legt man nun MOD auf 1, so ist am Ausgang von Gatter B der invertierte Takt zu sehen und am Ausgang der Treiber (Gatter C und D) wieder der Takt.
Hope schrieb: > Gatter C der > Treiber für den oberen MOSFET und Gatter D der Treiber für den unteren > MOSFET ohne die Brücke zwischen den Gates wäre es so. Die hatte ich da glatt übersehen. Mit der Brücke treiben eben beide Gatter gemeinsam beide MOSFETs.
Hope schrieb: > Michael M. schrieb: >> Ich meine mal wo gelesen zu haben, dass Gegentaktverstärker nur mit >> bipolaren Transistoren funktionieren und nicht mit MOS-FETs? > > wieso denn das? die Art der Schaltung hat doch nichts mit den > verwendeten Transistortypen zu tun. Falls es noch wen interessiert, hier stand das: Beitrag "MOSFET-Gegentaktendstufe" 4tes Post. Aber anscheinend geht's doch wie obige Schaltung aus dem Elektor zeigt.
Hi, Eine Frage, laut Bedienungsanleitung muss das Netzteil 1,2 A bringen. Kann das sein ?? Ich betreib das Gerät mit 800mA Netzteil, und es kommt öfters vor, dass nachdem erfolgreichen türöffnen, das Teil rumpiepst, oder sich aufhängt.
Hallo guten abend, hat jemand für mich eine Anleitung für das Codeschloss SMQ-303? Über eine Antwort würde ich mich freuen. Viele Grüße mashpeak
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.