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 Joerg - 24.12.2010 7:41)
Als Antwort auf Re: TowiTek RFID Antenne von Franz-Peter - 23.12.2010 12:23
Ich nutze:
C-Control Pro Mega128
> > > > 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
>

Hallo Franz-Peter,

vielen Dank für Deine ausführliche Erklärung.

Da du sehr viel in Assembler schreibst und sehr zeitkritisch bist, stellt sich für mich die Frage,
warum du ein C-Control benutzt und nicht den AVR C Compiler?

Kann man das mit den 6 Schnitstellen nicht einfach über ein 'oder' machen, wenn man davon
ausgehen kann, das immer nur eine Antenne gleichzeitig verwendet wird?

Ich habe da noch mal eine Frage: Benutzt Du eine Antenne im AuÃ?enbereich?
Die Antennen sind ja nur bis 0 Grad spezifiziert und ich wollte eine an der
Eingangstür verwenden.

Mit der syncronisation hatte ich mir das wie folgt vorgestellt:
(Mü�te eigentlich ähnlich deinem Timer sein)

In einem Thread alle 50ms das erste Zeichen abfragen.

Wenn Zeichen empfangen dann ein Thread_Delay von 50ms

Wenn empfangen Daten falsch (egal ob asynchron oder nicht registrierter Chip)  ==> Seriell_Init


Grü�e Joerg





    Antwort schreiben


Antworten:

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)