Presentation laddar. Vänta.

Presentation laddar. Vänta.

William Sandqvist Kommunikation Först några nya PIC-instruktioner.

Liknande presentationer


En presentation över ämnet: "William Sandqvist Kommunikation Först några nya PIC-instruktioner."— Presentationens avskrift:

1 William Sandqvist Kommunikation Först några nya PIC-instruktioner

2 William Sandqvist Rotation av tal PIC-processorerna har två instruktioner för att ”rotera” tal RLF och RRF. Dom här instruktionerna behöver vi i fortsättningen …

3 William Sandqvist Rotera tal = rotera stegmotor En bipolär stegmotor ansluten till ett fyrabitarsregister. Roterar man talet i registret roterar även stegmotorn. CW (ClockWise) CCW (CounterClockWise).

4 William Sandqvist Cc5x har inbyggda funktioner rl() och rr() char rl( char ); char rr( char ); C-språket har två skiftoperatorer högerskift >> och vänsterskift <<, någon egentlig "rotations"-operator finns inte. För att man trots detta ska kunna utnyttja PIC-processorernas rotations- instruktioner, har kompilatorn Cc5x lagt till två interna funktioner char rl( char ); och char rr( char );. Funktionerna genererar direkt assemblerinstruktionerna RLF och RRF. Carryflaggan når man som bitvariabeln bit Carry;

5 William Sandqvist Stegmotorprogrammet … STATE = 0b ; /* number 1100 twice in 8-bit register */ TRISB = 0b ; /* Steper motor Windings are outputs */ /* at pin RB2-RB0 and RB3-RB1 */ /* one step CW */ Carry = STATE.0; /* Bypass old Carry */ STATE = rr( STATE ); PORTB = STATE; /* one step CCW */ Carry = STATE.7; /* Bypass old Carry */ STATE = rl( STATE ); PORTB = STATE; Dom här instruktionerna behöver vi i fortsättningen …

6 William Sandqvist Kommunikation

7 William Sandqvist ASCII-tabellen Varje tecken lagras i en Byte, char. ”Hej!” A PICKit 2 UART Tool använder \r\n

8 William Sandqvist Parallell och Serie -kommunikation Seriekommunikation behöver få ledningar, men går därför långsammare än parallell kommunikation.

9 William Sandqvist Parallell kommunikation Handskakning. Två styrsignaler DAV (DataAVailable, data tillgängligt) och DAK (Data AcKnowledge, data bekräftelse) ser till att mottagaren hinner med. A presenterar en byte för B. När data är stabilt signalerar A detta till B med DAV = 1. B upptäcker detta och mottager byten. Med DAK = 1 kvitterar B till A att data mottagits. A kan nu ta bort byten och sätta DAK = 0. I sista steget upptäcker B att DAV = 0 och svarar i sin tur med att sätta DAK = 0.

10 William Sandqvist Seriekommunikation parallell-serie-parallell omvandling

11 William Sandqvist Asynkron seriekommunikation Vid seriekommunikation är det nödvändigt att sändare och mottagare opererar med samma i förväg överenskommna hastighet. Den hastighet med vilken bitarna överförs kallas för Bitrate [bit/sek]. Vanliga Bitrate´s är multiplar av 75 bit/sek som: 75, 150, 300, 600, 1200, 9600, och bit/sek.

12 William Sandqvist UART-enhet Serie/Parallell-omvandlingen på bitnivå tas ofta om hand med en specialkrets UART (Universal Asynchronous Reciever/ Transmitter), så att processorn kan leverera/mottaga hela tecken. En sådan finns inbyggd i de flesta PIC-processorer (USART/EUSART).

13 William Sandqvist Seriell handskakning Det kan finnas tillfällen då mottagaren behöver hejda dataflödet. Mottagaren behöver då ett buffertminne, och kan med två speciella tecken XON/XOFF (sändning på/ sändning av) meddela sändaren att bufferten håller på att bli full. Som tecknen XON/XOFF brukar man använda 0x11/0x13 ( DC1/DC3, Crtl-Q/Ctrl-S, / ).

14 William Sandqvist Modem För att kunna styra och kontrollera uppkopplingen av en uppringd förbindelse är modemen försedda med handskaknings-signaler. I princip ska varje åtgärd som endera sidan företar sig för att etablera förbindelsen kvitteras av den andra sidan. Modemkontakten är en ofta använd standardiserad inkörsport till olika datorutrustningar. Telenätet kan inte överföra logiknivåer ( = likspänningar ) dessa omformas till ton- signaler med hjälp av Modem ( MOdulator DEModulator ).

15 William Sandqvist Modem styrsignaler Förutom de seriella datasignalerna RXD och TXD, förekommer det två nivåer av handskakningssignaler. Signalparet DTR (Data Terminal Ready, UART klar) och DSR (Data Set Ready, modem klar) är den överordnade handskakningsnivån. RTS (Request To Send, sändningsbegäran från UART) och CTS (Clear To Send, datakanal klar från modemet) är en underordnad handskakningsnivå. Det är få tillämpningar, förutom modem, som behöver handskaknings- signaler i två nivåer. Signalparet RTS-CTS används till den parallella handskakningen. Signalparet DTR-DSR brukar anslutas till respektive datautrustnings matningsspänning. Man kan då upptäcka enklare fel som att man "glömt" att slå på matningsspänning eller att man "glömt" att ansluta kabeln.

16 William Sandqvist 0-modem Med ett 0-modem får man tillgång till handskakningssignalerna och kan använda dessa till flödeskontroll. Om man inte ansluter handskakningssignalerna kan flödeskontrollen ske med kommunikationssignalerna XON/XOFF, annars måste utrustningen ha så höga prestanda att man klarar man sig utan flödeskontroll. För att ansluta två utrustningar som har modemkontakter till varandra måste man tillverka ett så kallat 0-modem. Det är en kabel där signalparen RXD-TXD, DTR-DSR, och RTS-CTS korsats. (Den ena enheten är ju sändare för den andra och vice versa). Spänningsnivåerna är ”0” = +12V, ”1” = -12V. (RS232 V24)

17 William Sandqvist Bitar och extrabitar Den asynkrona överföringstekniken innebär att man för varje byte lägger till extra bitar som ska göra det möjligt att skilja ut byten från bitströmmen. Ofta lägger man dessutom till en bit för felindikering. En nackdel med detta arrangemang är att dessa extra bitar sänker den effektiva överföringshastigheten (det vill säga antalet överförda bytes/sek).

18 William Sandqvist Skicka ett tecken … Dataöverföringens startar med att datalinjen hålls låg "0" under ett tidsintervall som är en bit långt (T = 1/Bitrate). Detta är startbiten. Under 8 lika långa tidsintervall följer sedan databitarna, ettor eller nollor, med den minst signifikantabiten först och den mest signifikanta biten sist. Därefter kan följa en paritetsbit, ett hjälpmedel vid detekteringen av överföringsfel. Överföringen avslutas slutligen av att datalinjen för åtminstone ett bit- tidsintervall är hög. Det är stoppbiten.

19 William Sandqvist Mottaga ett tecken Mottagningen av data sker genom att man först inväntar startbitens negativa flank, för att därefter registrera datalinjen vid tidpunkterna 3T/2, 5T/2,... 17T/2 relativt startflanken (dessa tider är databitarnas "mittpunkter"). Mottagaren "synkroniseras om" på nytt av varje startflank. Detta medför att relativt stora avvikelser från överens- kommen bauderate kan förekomma, hos både mottagare och sändare, innan dataöverföringen misslyckas!

20 William Sandqvist Paritetsbit/9:e bit En sedan länge använd metod för feldetektering är den s.k. paritets-kontrollen. Till den byte som överförs lägger man en extra s.k. paritetsbit som är så vald att det totala antalet ettor är jämnt vid jämn paritet (J), eller udda vid udda paritet (U). Sedan det överenskommits om vilken paritet J/U som ska gälla, kan mot- tagaren upptäcka om någon av de överförda bitarna "bytt" värde till följd av en störning. Paritetsbiten härstammar från automatiseringsteknikens barndom, då data överfördes med stansade hålremsor. De mekaniska stansutrustningarna "hängde sig" ibland, men att två stanspinnar skulle kärva samtidigt var obefintlig. En alternativ användning för en nionde bit är att låta den betyda ”allmänt anrop”. De åtta vanliga bitarna tolkas då som den anropades adress.

21 William Sandqvist Bit-banging Det är mycket vanligt att man programmerar seriekommu- nikation ”bit för bit”. Valfri portpinne kan användas så om inte annat är detta ett mycket bra felsökningshjälpmedel. En lämplig Bitrate är då T = 1/9600 = 104,167  s. Om processorns klockfrekvens är 4 MHz behövs det en fördröjningsloop som tar 104 instruktioner. /* delay one bit 104 usec at 4 MHz */ /* 5+18* =104 without optimization */ i = 18; do ; while( --i > 0); nop(); Fördröjningsrutinen blir beroende av klockfrekvens och proceessortyp. Koden ovan gäller 16F690. Fler exempel finns på kurswebben.

22 William Sandqvist void putchar( char ) void putchar( char d_out) { char count, i; Serial_out = 0; /* set startbit */ for (count = 10; count > 0; count--) { /* delay 104 usec */ i = 18; do ; while ( --i > 0); nop(); Carry = 1; d_out = rr(d_out); Serial_out = Carry; } }

23 William Sandqvist char getchar( void ) char getchar( void ) { char d_in, count, i; while( Serial_in == 1) /* wait for startbit */; /* 1.5 bit 156 usec no optimization */ i = 28; do ; while( --i > 0); nop(); nop2(); for(count = 8; count > 0; count--) { Carry = Serial_in; d_in = rr( d_in ); /* 1 bit 104 usec no optimization */ i = 18; do ; while( --ti > 0); nop(); } return d_in; }

24 William Sandqvist Debug-verktyg debug690bb.c PICKit2 UART-tool kan användas som ett enkelt debug- verktyg. Samma ledningar som används till att programmera PIC-chippet används av UART-tool för seriekommunikation. Man behöver därför en bitbanging-rutin för seriekommu- nikation med dessa pinnar. void initserial( void ) /* init PIC16F690 serialcom */ { ANSEL.0 = 0; /* No AD on RA0 */ ANSEL.1 = 0; /* No AD on RA1 */ PORTA.0 = 1; /* marking line */ TRISA.0 = 0; /* output to PK2 UART-tool */ TRISA.1 = 1; /* input from PK2 UART-tool */ }

25 William Sandqvist debug690bb.c void main( void) { char c; initserial(); delay10(100); /* 1 sek delay */ /* 1 sek to ”turn on VDD" and click "Connect” */ while( 1) { char x = 0xAA; /* your code... */ /* What is the value of x now ? */ getchar( ); /* breakpoint, wait for charachter */ putchar( x ); /* PK2 UART-tool displays x in hex */ /* moore of your code... */ } }

26 William Sandqvist Obs! Inställning Mode: Hex Programmet kör till brytpunkten och väntar där på tecken, Send ”00”. Därefter skrivs variabeln x ut. Vem hade kunnat ana att x var 0xAA? Konvertera sedan 0xAA till önskad bas med hjälp av Windows kalkylator … PICKit 2 UART Tool

27 William Sandqvist Konvertera variabelvärdet till valfri bas Använd Windows kalkylator för att konvertera svaret till valfri bas. Debug funktionerna är bara på c:a 113 instruktioner så det finns gott om plats kvar för ditt eget program …

28 William Sandqvist PIC16F628 USART De flesta PIC-processorer innehåller en inbyggd serie- kommunikationsenhet, USART ( Universal Synchronous or Asynchronous Reciever and Transmitter ). Som namnet anger är denna enhet användbar både för synkron och asynkron seriekommunikation, men vi kommer bara utnyttja asynkron seriekommunikation. USART består av tre delar. SPBRG ( Serialunit Programable BaudRateGenerator ) är en programmerbar Baudgenerator för överföringshastigheten. USART Transmitter och USART Reciever är sändarenhet respektive mottagarenhet.

29 William Sandqvist Transmitter För att sända ett tecken räcker det med att lägga det i TXREG-registret. När sändarregistret TSR är "redo" kopieras tecknet över till detta och skiftas ut seriellt på pinnen TX/CK. Om man har ytterligare ett tecken att sända kan man nu placera detta i "väntkö" i TXREG. Så fort TSR är tomt laddas nästa tecken in från TXREG automatiskt till TSR. I blockdiagrammet visas flaggan TRMT ( TransmitterRegister eMpTy ) som anger om sändarregistret TSR är upptaget eller ej. Flaggan kan läsas av programmet ( eller generera interrupt ) så att man kan se till att tecken skickas kontinuerligt. Flaggan 0-ställs automatiskt när ett tecken hamnar i TSR.

30 William Sandqvist Transmitter settings bit 6 = 0 TX9: Ingen niobits-sändning. bit 5 = 1 TXEN: Transmit Enable bit. Måste vara på. bit 4 = 0 SYNK: Usart mode select bit. Vi väljer asynkront arbetssätt. bit 2 = 1 BRGH: High Baudrate select bit. Vi väljer höghastighetsläge. bit 1 TRMT: Flagga som är ”1” om TSR är tomt.

31 William Sandqvist Reciever Tecken inkommer från pinnen RX/DT till mottagarregistret RSR. När mottagningen av ett tecken är klart förs det över till RCREG som är en så kallad FIFO-buffert. Denna buffert rymmer två tecken som läses i samma ordning som de kom. Bufferten tillsammans med TSR medför att ett program kan låta bli att bevaka mottagarregistret under den tid det tar att mottaga tre tecken. Flaggorna OERR, FERR varnar för felaktigt mottagna tecken. Flaggan RCIF anger om det finns tecken i bufferten eller ej. Denna flagga "0"-ställs automatiskt när man läst så att bufferten blivit tom, ett /två tecken.

32 William Sandqvist Reciever settings bit 7 = 1 SPEN: Enablar serieporten. bit 6 = 0 TX9: Ingen niobitsmottagning. bit 4 = 1 CREN: Continuous Receive Enable bit. Mottag tecken i följd. bit 2 och bit 1 FERR OERR Flaggor som anger om mottagningen blivit fel. Det är biten RCIF som anger om det finns tecken att hämta.

33 William Sandqvist Baud Rate Generator BRG En bit BRGH bestämmer låghastighets eller höghastighets läge. Ett register SPBRG innehåller Bauderategeneratorns neddelningstal. BRGH = 0; BaudRate = f osc /(64  (SPBRG+1)) BRGH = 1; BaudRate = f osc /(16  (SPBRG+1)) BRGH=1; SPBRG = 26-1; /* MHz */

34 William Sandqvist Initiering av serieporten void initserial( void ) /* initialise serialcom port 16F628 */ { SPEN = 1; BRGH = 1; /* Async high speed */ TXEN = 1; /* transmit enable */ SPBRG = 26-1; /* MHz */ CREN = 1; /* Continuous receive */ RX9 = 0; /* 8 bit reception */ TRISB.2 = 0; /* TX is output */ TRISB.1 = 1; /* RX is input */ }

35 William Sandqvist Seriecom-funktioner char getchar( void ) /* recieves one char */ { char d_in; while ( RCIF == 0 ) ; /* wait for char */ d_in = RCREG; return d_in; } void putchar( char d_out ) /* sends one char */ { /* wait until previus character transmitted */ while (!TXIF) ; TXREG = d_out; } Blockerande funktion! Här blir man sittande tills ett tecken inkommer!

36 William Sandqvist Varning! Recievern kan låsa sig! Programmet måste läsa mottagarenheten innan den hunnit mottaga tre tecken - annars låser den sig! När man ansluter seriekontakten kanske man "darrar" på handen på sådant sätt att "kontaktstudsarna" blir till många mottagna tecken. Om mottagarenheten då "låser sig" är detta naturligtvis ett mycket svårt/omöjligt "programfel" att hitta! Lösningen är en upplåsningsrutin att kunna ta till vid behov. Man anropar upplåsningsfunktionen direkt innan man förväntar sig inmatning via serieporten.

37 William Sandqvist OverrunRecover() void OverrunRecover( void ) { char trash; trash = RCREG; trash = RCREG; CREN = 0; CREN = 1; } Upplåsningsrutinen.

38 William Sandqvist Seriekommunikation Hårdvara Bygla PIC-processorns serieport till programmerings- ledningarna (Or, Red). 1) PICKIT 2 UART Tool 2) PC med serieport Invertera signalerna till/från PIC- processorns serieport innan den ansluts till PC:ns serieport.

39 William Sandqvist Seriekommunikation USB-serial-TTL 3) FTDI TTL232R ansluts direkt till processorpinnarna. De flesta PC saknar nuförtiden serieport, en drivrutin kan installera en virtuell USB-serieport. Installations program för drivrutin från FTDI.

40 William Sandqvist Terminalprogram Hyperterminalen (ingår i Windows XP) MTTTY (Ingår i vårt installationsprogram)

41 William Sandqvist Terminalprogram till Vista PuTTY Om Du använder USB-virtuell serieport – tag reda på COM-portens nummer först (med Enhetshanteraren/Device Manager) … PuTTY

42 William Sandqvist Testprogram: echo()/crypto() void main( void) { char c; TRISB.6 = 1; /* not to disturb UART-Tool */ TRISB.7 = 1; /* not to disturb UART-Tool */ initserial(); delay10(100); /* 1 sek delay */ /* 1 sek to turn on VDD and Connect UART-Tool */ while( 1) { c = getchar( ); /* input 1 character */ if( c == '\r'||c == '\n') putchar(c); else putchar(c); /* echo the character */ /* putchar(c+1) => Crypto! */ } } Om PIC-processorn ”ekar” de skrivna tecknen så fungerar kommunikationen. Variant: krypto ! A  B

43 William Sandqvist Testprogram: fyrkantvåg 9600 Baud, bit/sek. Om man sänder kontinuerligt 8 bitar med startbit och stoppbit bokstaven ’U’ ( ) får man en fyrkatvåg med f = 4800 Hz. Detta test är bra att känna till. while(1) putchar(’U’);

44


Ladda ner ppt "William Sandqvist Kommunikation Först några nya PIC-instruktioner."

Liknande presentationer


Google-annonser