Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: TowiTek RFID Antenne Kategorie: Sonstige Hardware (von Franz-Peter - 23.12.2010 12:23)
Als Antwort auf Re: TowiTek RFID Antenne von Joerg - 23.12.2010 11:34
Ich nutze:
C-Control Pro Mega128, CC-Pro 128 Application Board, Pro-Bot128
> > > Hallo,
> > > ich versuche gerade mit meine Projectboard PRO128 die
> > > TowiTek RFID Antenne mit dem entsprechenden Beispiel
> > > (siehe unten) in Betrieb zu nehmen.
> > > Ich habe aber noch einige Probleme.
> > >
> > > Da meine Serielle Schnittstelle 0 bereits belegt ist, benutze ich Seriell 1.
> > >
> > >
> > > In dem Beispiel steht
> > >
> > >  // 5 byte Empfangspuffer - 0 byte Sendepuffer
> > >  Serial_Init_IRQ(0,buffer,0,5,SR_8BIT|SR_1STOP|SR_NO_PAR,SR_BD9600);
> > >
> > > Sind die 0 und 5 für die Buffer nicht verdreht????
> > >
> > > in der Doku steht
> > >
> > > void Serial_Init_IRQ(byte serport,byte ramaddr[],byte recvlen,byte sendlen,byte par,
> > >
> > > Dann wird folgender Vergleich durchgeführt:
> > >
> > > if (felder[i]==0x100)break;                      
> > >
> > > felder ist doch ein Byte und kann niemals 0x100 werden oder????
> > >
> > >
> > > Für Hilfe währe ich sehr dankbar....
> > >
> > >
> > > Grü�e Joerg
> > >
> > >
> > >
> > >
> > > /*' Auslesen der RFID - Antenne für C-Control #191553
> > > ' In diesem Programm werden bis zu 10 Karten ausgelesen und überprüft
> > > ' wird eine gültige Karte erkannt wird LED1 geschalten
> > > ' Ausgang des Lesers wird direkt an Port D.0 (Mega32) oder
> > > ' Port E.0 (Mega 128)angeschlossen
> > > ' erforderliche Library: IntFunc_Lib.cc
> > > ' passende Transponder z.B. #191214,#191201,#191034,#191518,#130245,#130274
> > > ' by hiaslsoft 2010
> > > */
> > >
> > >
> > > // 5 byte Sende + Empfungspuffer + 6 byte interne FIFO Verwaltung
> > > byte buffer[11];                                // Array für 232 deklariert
> > > byte felder[10];                                // Array für Daten aus der Schnittstelle
> > > byte count;
> > > byte user[10][5]=                               //10 User + 5 Byte Daten
> > > {125,1,2,0,3,            //User1
> > > 125,1,2,232,90,          //User2
> > > 1,197,171,26,48,         //User3
> > > 125,1,2,0,3,             //User4
> > > 129,1,2,0,3,             //User5
> > > 1,127,188,47,128,        //User6
> > > 125,1,2,0,3,             //User7
> > > 125,1,2,0,3,             //User8
> > > 125,1,2,0,3,             //User9
> > > 129,113,0,232,90         //User10
> > > };
> > >
> > > //------------------------------------------------------------------------------
> > > // Hauptprogramm
> > > //
> > > void main(void)
> > > {
> > >
> > >     count=1;
> > >         //Init RS232: 9600 bps, 8 Bit, 1 Stop, NP
> > >     // 5 byte Empfangspuffer - 0 byte Sendepuffer
> > >     Serial_Init_IRQ(0,buffer,0,5,SR_8BIT|SR_1STOP|SR_NO_PAR,SR_BD9600);
> > >     Port_DataDirBit(PORT_LED1,PORT_OUT);
> > >     Port_WriteBit(PORT_LED1,PORT_OFF);
> > >
> > >
> > > while(true)
> > >
> > > {   byte i;
> > >     i=0;
> > >     AbsDelay(500);                             // 500m Sek. Wartezeit bis zur GröÃ?e des
> > >                                                 // Empfangspuffers werden die seriellen
> > >                                                 // Eingaben aufgezeichnet
> > >
> > >
> > >     while (i<=4)
> > >     {
> > >         felder[i]=Serial_ReadExt(0);
> > >
> > >             if (felder[i]==0x100)break;                      // bei 0x100 ist der Puffer leer
> > >             else ++i;                                       //solange Einlesen , bis 5Byte ausgelesen
> > >     }
> > >         if (felder[0]!=0)                                   // Abfrage ob das Array gefüllt wurde
> > >
> > >         {
> > >         display();                                     //Code anzeigen
> > >         vergleich();                                   //Code überprüfen
> > >         AbsDelay(500);
> > >         }
> > >
> > > }
> > > }
> > > void display(void)
> > > {
> > > int i;
> > > for(i=0;i<=4;i++)
> > > {
> > > Msg_WriteInt(felder[i]);                                 //Ausgeben der 5 Codebytes
> > > Msg_WriteText("|");
> > > }
> > > Msg_WriteText("r Leseversuch: ");                       //Anzahl der Leseversuche
> > > Msg_WriteWord(count);
> > > Msg_WriteText("r r");
> > > ++count;
> > > }
> > > void vergleich(void)
> > > {
> > >     int x,usr;
> > >     byte open;
> > >     open=false;
> > >     usr=0;
> > >         while(usr<=9)
> > >             {
> > >             x=0;
> > >             while(x<=4)
> > >                 {
> > >                 if (felder[x]==user[usr][x])          // Vergleich des eingelesenen Codes und den Usern
> > >                     {
> > >                     open=true;                        //flag wird gesetzt , wenn die einzelnen bytes
> > >                     ++x;                             // übereinstimmen
> > >                     }
> > >                 else
> > >                     {
> > >                     open=false;                       // wird ein falsches byte endeckt wird der nächste
> > >                     break;                            // usercode überprüft
> > >                     }
> > >
> > >                 }
> > >             if (open==true)break;                       //sobald ein gültiger Code registriert wird
> > >                                                       //wird die Schleife verlassen
> > >             ++usr;                                     //nächster  User wird überprüft
> > >             }
> > >       if (open==true)
> > >         {                                             //bei einem gültigen Code wird LED1 eingeschalten
> > >         Port_WriteBit(PORT_LED1,PORT_ON);             //LED1 einschalten
> > >         AbsDelay(1500);                               //variable Verzögerung (Türöffner)
> > >         Port_WriteBit(PORT_LED1,PORT_OFF);            //LED1 ausschalten
> > >         Serial_Init_IRQ(0,buffer,0,5,SR_8BIT|SR_1STOP|SR_NO_PAR,SR_BD9600); //serielle Schnittstelle leeren
> > >         }
> > > }
> > Hallo Joerg,
> > das würde ich auch so sehen - so kann das Beispiel nicht wirklich funktionieren.
> > Das mit der Bytevariable beim Empfang mit Serial_ReadExt ist mir auch schonmal passiert. In der
> > Variable steht dann 0 wenn kein Zeichen empfangen wurde. Das ist auch solange ok, wie ein NULL-Zeichen
> > nie empfangen werden kann. Da die Towitek Antenne die Bytes des Transponders aber nicht Hex-Codiert,
> > sondern direkt binär ausgibt, kann das sehr wohl passieren.
> > Ich habe die Antenne auch im Einsatz ( an meiner Anlage sind 4 Antennen angeschlossen) und bisher
> > auch recht gute Erfahrung damit gemacht.
> > Es gibt aber noch ein Problem auf das Du achten musst: Bleibt der Transponder im Empfangsbereich, so
> > wird die ID alle 200ms erneut gesendet. Leider sendet die Antenne keine Anfangs- oder Endekennung.
> > Wenn der Empfang sich also nur 1mal irgendwie 'verschluckt' und 1 Zeichen verlorengeht kommt eine einfache
> > Empfangsroutine aus dem Takt und Du bekommst verschobene TransponderID's.
> > Da es keine Anfangs- und Endekennungne gibt, kann man das meiner Meinung nach nur über eine
> > Zeitüberwachung erkennen: Die 5 Zeichen eines Transponders müssen innerhalb eines bestimmten
> > Zeitfensters ankommen, sonst ist die Synchronisation verloren gegangen und das oder die letzten
> > Zeichen gehören schon zur nächsten �bertragung.
> > GruÃ?
> > Franz-Peter
>
> Hallo Franz-Peter,
>
> vielen Dank für Deine Antwort.
> Hättest Du mal ein Beispiel, wie du den Empfang durchführst...
>
> Zur Syncronisation:
>
> Wenn man nach einem fehlerhaften Empfang oder zyklich ein Serial_Init_IRQ aufrufen würde,
> mü�te man sich nicht auch dann wieder syncronisieren?
>
> Da die Unit ja nur 2 serielle Schnitstellen hat, wie hast du denn die 4 Antennen angeschlossen?
> Ã?ber welche Entfernung gehst Du? Mit oder ohne Pegelwandler?
>
> GrueÃ?e Joerg
Hallo Joerg,
Das Problem beim Synchronisieren ist, dass Du aufgrund fehlender Anfangs- und Endekennung einen
fehlerhaften Empfang gar nicht erkennen kannst. Es sind ja alle Zeichen gültig.
Und ein unbekannter Transponder ist in diesem Sinne auch nur dann ein Fehler wenn Du ganz sicher
bist, dass nur die hinterlegten Transponder an deine Antenne kommen.
Ein zyklisches Serial_Init kann den Fehler sogar erst provozieren: Wenn das Init gerade
stattfindet, wenn die Antenne eine ID sendet, gehen vielleicht genau die ersten 1 oder 2 Zeichen
verloren und Du beginnst mitten in der �bertragung das Zählen deiner 5 Byte.
Zumindest wenn Du keinerlei EinfluÃ? darauf hast, wann ein Transponder an die Antenne kommt,
geht es nur mit einer Zeitüberwachung.
Ich starte einen 50ms Timer , wenn ich das (evtl vermeintliche) 1. Zeichen empfange.
Mit dem Empfang des 5. Zeichens wird der Timer wieder gestoppt. Läuft er vorher ab, wird der Empfang
abgebrochen und startet wieder beim 1. Zeichen.
Den Timer realisiere ich als Bytevariable, die im 10ms Interrupt heruntergezählt wird.
Das habe ich soeben im Thread von Christian beschrieben:
(Beta 2.12.06 Timer Probleme  http://ccpro.cc2net.de/forum/lesen.php?eintrag=5922 ).
Ich realisiere alle meine Timer so.

Das mit den 4 Schnittstellen ist in der Tat ein Problem gewesen, dass micht etwas Aufwand gekostet
hat: Ich habe an eine Mega32 3 SCC Bausteine Z8530 angeschlossen ( ich weis nicht, ob es den noch
neu gibt, aber ich hatte noch einige in der Schublade). Jeder enthält 2 serielle Schnittstellen und
wird über einen 8-Bit Datenbus angesprochen.
Da der Mega32 keinen externen Datenbus hat, habe ich das per Assemblerprogramm über die Ports
emuliert. Die Interruptverarbeitung für die Bausteine habe ich auch in Assembler geschrieben, da
der Interpreter für die Verwaltung von 6 seriellen Schnittstellen zu langsam ist.
Der Mega32 arbeitet nun als Konzentrator für die 4 Antennen und setzt die empfangenen ID's in eine
interne 1 Byte-Transpondernummer um. Ã?ber eine der Schnittstellen ist die Mega32 mit der Steuerung
(Mega128) verbunden, die nun abfragen kann, welcher Transponder wo erkannt wurde.
GruÃ?
Franz-Peter
P.S. ich beutze keine Pegelwandler, und die maximale Entfernung ist ca. 3m



    Antwort schreiben


Antworten:

Re: TowiTek RFID Antenne (von Joerg - 24.12.2010 7:41)
    Re: TowiTek RFID Antenne (von Franz-Peter - 24.12.2010 15:19)
    Re: TowiTek RFID Antenne (von Franz-Peter - 24.12.2010 10:49)
        Re: TowiTek RFID Antenne (von PeterS - 24.12.2010 11:25)
            Re: TowiTek RFID Antenne (von Franz-Peter - 24.12.2010 13:13)
                Re: TowiTek RFID Antenne (von PeterS - 25.12.2010 23:23)