Ladda ner presentationen
Presentation laddar. Vänta.
1
Kommunikation Först några nya PIC-instruktioner
William Sandqvist
2
William Sandqvist william@kth.se
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 … William Sandqvist
3
Rotera tal = rotera stegmotor
En bipolär stegmotor ansluten till ett fyrabitarsregister. Roterar man talet i registret roterar även stegmotorn. CW (ClockWise) CCW (CounterClockWise). William Sandqvist
4
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; William Sandqvist
5
Stegmotorprogrammet …
STATE = 0b ; /* number 1100 twice in 8-bit register */ TRISB = 0b ; /* Steper motor Windings are outputs */ /* at pin RB2-RB0 and RB3-RB */ /* 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 … William Sandqvist
6
William Sandqvist william@kth.se
Kommunikation William Sandqvist
7
William Sandqvist william@kth.se
ASCII-tabellen Varje tecken lagras i en Byte, char. ”Hej!” A PICKit 2 UART Tool använder \r\n William Sandqvist
8
Parallell och Serie -kommunikation
Seriekommunikation behöver få ledningar, men går därför långsammare än parallell kommunikation. William Sandqvist
9
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. William Sandqvist
10
Seriekommunikation parallell-serie-parallell omvandling
William Sandqvist
11
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. William Sandqvist
12
William Sandqvist william@kth.se
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). William Sandqvist
13
William Sandqvist william@kth.se
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, / ). William Sandqvist
14
William Sandqvist william@kth.se
Modem Telenätet kan inte överföra logiknivåer ( = likspänningar ) dessa omformas till ton-signaler med hjälp av Modem ( MOdulator DEModulator ). 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. William Sandqvist
15
William Sandqvist william@kth.se
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. William Sandqvist
16
William Sandqvist william@kth.se
0-modem 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). 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. Spänningsnivåerna är ”0” = +12V, ”1” = -12V. (RS232 V24) William Sandqvist
17
William Sandqvist william@kth.se
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). William Sandqvist
18
William Sandqvist william@kth.se
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. William Sandqvist
19
William Sandqvist william@kth.se
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, T/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! William Sandqvist
20
William Sandqvist william@kth.se
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. William Sandqvist
21
William Sandqvist william@kth.se
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. William Sandqvist
22
William Sandqvist william@kth.se
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; } } William Sandqvist
23
William Sandqvist william@kth.se
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; } William Sandqvist
24
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 */ } William Sandqvist
25
William Sandqvist william@kth.se
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 */ } } William Sandqvist
26
William Sandqvist william@kth.se
PICKit 2 UART Tool 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 … William Sandqvist
27
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 … William Sandqvist
28
William Sandqvist william@kth.se
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. William Sandqvist
29
William Sandqvist william@kth.se
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. William Sandqvist
30
William Sandqvist william@kth.se
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. William Sandqvist
31
William Sandqvist william@kth.se
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. Flaggorna OERR, FERR varnar för felaktigt mottagna tecken. 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. 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. William Sandqvist
32
William Sandqvist william@kth.se
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. William Sandqvist
33
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 = fosc/(64(SPBRG+1)) BRGH = 1; BaudRate = fosc/(16(SPBRG+1)) BRGH=1; SPBRG = 26-1; /* MHz */ William Sandqvist
34
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 */ } William Sandqvist
35
William Sandqvist william@kth.se
Seriecom-funktioner char getchar( void ) /* recieves one char */ { char d_in; while ( RCIF == 0 ) ; /* wait for char */ d_in = RCREG; return d_in; } Blockerande funktion! Här blir man sittande tills ett tecken inkommer! void putchar( char d_out ) /* sends one char */ { /* wait until previus character transmitted */ while (!TXIF) ; TXREG = d_out; } William Sandqvist
36
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. William Sandqvist
37
William Sandqvist william@kth.se
OverrunRecover() void OverrunRecover( void ) { char trash; trash = RCREG; trash = RCREG; CREN = 0; CREN = 1; } Upplåsningsrutinen. William Sandqvist
38
Seriekommunikation Hårdvara
1) PICKIT 2 UART Tool 2) PC med serieport Bygla PIC-processorns serieport till programmerings-ledningarna (Or, Red). Invertera signalerna till/från PIC-processorns serieport innan den ansluts till PC:ns serieport. William Sandqvist
39
Seriekommunikation USB-serial-TTL
De flesta PC saknar nuförtiden serieport, en drivrutin kan installera en virtuell USB-serieport. Installationsprogram för drivrutin från FTDI. 3) FTDI TTL232R ansluts direkt till processorpinnarna. William Sandqvist
40
William Sandqvist william@kth.se
Terminalprogram Hyperterminalen (ingår i Windows XP) MTTTY (Ingår i vårt installationsprogram) William Sandqvist
41
Terminalprogram till Vista
Om Du använder USB-virtuell serieport – tag reda på COM-portens nummer först (med Enhetshanteraren/Device Manager) … PuTTY PuTTY William Sandqvist
42
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 ! AB William Sandqvist
43
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’); William Sandqvist
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.