Odense Tekniske Gymnasium Seriel kommunikation Skribenter Mathias Bejlegaard Madsen, 3.H Udførelsesdato 4. januar til Vejleder Afleveringsdato
Indholdsfortegnelse 1 Introduktion 2 2 Bedstemor diagram 2 3 Blokdiagrammer over kode 2 4 ICO & register oversigt 7 4.1 Input, controller, output diagram........................... 7 4.2 Register oversigt.................................... 7 5 Elevvejledning 8 6 Bilag 10 6.1 Blokdiagrammer.................................... 10 6.2 Bedstemor diagram................................... 10 6.2.1 Seriel kommunikation............................. 10 6.2.2 Transmitter................................... 11 6.2.3 Receiver..................................... 13 6.2.4 Delay...................................... 14 6.3 Kode........................................... 15 Side 1 af 15
1 Introduktion Dette projekt omhandler seriel kommunikation mellem to PIC-kits, altså afsendelse og modtagelse af data fra en enhed til en anden enhed. Ved at programmere igennem specifikke registre (Se register oversigt), skal den ene enhed programmeres til at være transmitteren og den anden enhed til at være receiveren. 2 Bedstemor diagram Seriel kommunikation handler om afsendelse og modtagelse af 8 bit data imellem to OTGkits. Brugeren bestemmer selv hvilket 8 bit data der skal sendes afsted. Modtageren modtager derefter disse 8 bits, ét bit af gangen, hvorefter den anvender dette data til eksempelvis at tænde for specifikke LED er. Dette er vist herunder som et diagram. Større udgave af diagrammet kan findes i bilag. 3 Blokdiagrammer over kode Til udarbejdelsen af seriel kommunikation, har jeg illustreret kodens opbygning ved hjælp af flowdiagrammer. Koden er delt op i tre filer: Seriel kommunikation, transmitter og receiver. Hovedfilen er seriel kommunikation filen. Flowdiagramemt for denne fil er vist herunder. Større udgave af diagrammet kan findes i bilag. Side 2 af 15
Her starter programmet med en initialisering af controlleren, hvor den gør PORTC på controlleren til den transmitterende udgang eller reciperende indgang. Derefter rydder vi PO- RTB, for at sørge for at alle lysdioder er slukket. Derefter skal brugeren afgøre, om den tilsluttede controller enten skal være transmitteren eller receiveren. Hvis den skal være transmitter, så skal receiversetup og mainreceiver udkommenteres. Dette gør, at programmet kun kalder koden: transmittersetup og derefter går til koden: maintransmitter. Hvis den istedet skal være receiver, så skal det modsatte blot gøres. Hvad koden gør når programmet kalder: transmittesetup eller receiversetup vender jeg tilbage til senere. Maintransmitter starter med at sætte W til et givet data som brugeren bestemmer. W er den data som skal transmitteres til receiveren. Derefter kalder programmet transmitter og delay hvorefter det samme gøres igen, for at transmittere yderligere data, hvoraf W blot er ændret for at transmittere andet data. Til sidst laver programmet en gå til maintransmitter for at koden kører i et loop, som vil få controlleren til konstant at transmittere data til receiveren. Maintransmitter kalder delay for at skabe et delay imellem transmitteringen af dataen på 250 millisekunder. Dette hindrer eventuelle komplikationer og fejl med hensyn til transmitteringen og reciperingen af dataen. Nedenstående diagram viser dette. Større udgave af diagrammet kan findes i bilag. Side 3 af 15
Maintransmitter kalder koden transmitter som starter for transmissionen af data til receiveren. Dette gør den ved at den flytter dataen fra W til sender registret: TXREG. Dernæst rydder den dataen i W, så nyt data kan blive lageret i W. Til sidst returnerer koden, til der hvor den var nået til. Nedenstående diagram viser dette. Større udgave af diagrammet kan findes i bilag. Side 4 af 15
Mainreciever starter med at kalde receiver og derefter flytter det modtagede data i resultat fra receiverkørslen til W. Herfra flytter programmet dataen fra W til PORTB, som efter hensigten vil få de lysdioder angivet af transmitteren til at tænde. Til sidst laver programmet en gå til mainreceiver for at koden kører i et loop, som vil få controlleren til at tjekke efter nyt data hele tiden. Dette er illustreret i det første diagram. Mainreceiver kalder koden receiver som starter for reciperingen af data fra transmitteren. Dette gør den ved at den flytter dataen fra modtager registret: RCREG til W, hvorefter den flytter dataen i W til resultat registret. Til sidst rydder den dataen i W og returnerer til der hvor programmet var nået til. Nedenstående diagram viser dette. Større udgave af diagrammet Side 5 af 15
kan findes i bilag. For at vende tilbage til, hvad koden gør når programmet kalder Transmittersetup og Receiversetup, så sætter den controlleren op til enten at være transmitter eller receiver. Dette gør den ved at at sætte forskellige bits, som er associeret med asynchronous transmission for Side 6 af 15
en transmitter eller receiver. Hvilke bits der enten er sat eller ryddet i forskellige registre kan ses i registeroversigten og en beskrivelse kan findes i selve koden. Dernæst sætter den et interruptflag op som fortæller programmet, hvornår et byte er modtaget. Til sidst sætter programmet boud rate generatoren til 64, for at få en error% på 0.16, rydder W og returnerer til der hvor programmet var nået til. Dette er illustreret i diagrammet ovenover. 4 ICO & register oversigt 4.1 Input, controller, output diagram Nedenstående diagram viser, hvilke inputs og outputs controllerne har, hvoraf flowdiagrammerne viser, hvordan controllererne skal agere med inputsene og outputsene. 4.2 Register oversigt I nedenstående tabel kan der ses en oversigt over, hvilke registre jeg har brugt og til hvilken anvendelse. Side 7 af 15
Register PORTB PORTC 0x20 0xFF, 0xFE, 0xFD TXSTA TXREG RCSTA RCREG INTCON PIE1 PIR1 Anvendelse LED række Seriel ledning Resultat Delay Transmitter Transmitter Receiver Receiver Transmitter & receiver Transmitter & receiver Transmitter & receiver 5 Elevvejledning Det ene PIC-kit skal programmeres til at være transmitter (afsender), hvor det andet PIC-kit skal programmeres til at være receiver (modtager). Når transmitteren er klar til at sende data, bliver den givne data flyttet fra arbejdsregistret, W, til TXREG registret, som sender dataen. Når receiveren er klar og har modtaget data, bliver den modtagede data flyttet fra RCREG registret, som er modtager registret, til arbejdsregistret, W, og fra arbejdsregistret til PORTB. PORTB er den port, hvor LED-rækken er tilsluttet. Den modtagede data sætter dermed de bits, som tænder de forskellige LED er. For at få programmet til at køre skal du anvende: 1. To OTG-kits 2. Én PICKIT 2 med en usb til mini-usb ledning 3. Én seriel ledning 4. Én LED-række For at få programmet til at køre skal du følge følgende fremgangsprocedure: 1. Vi starter med at programmere receiveren (modtageren) 2. Tilslut dit ene OTG-kit til PICKIT 2 Side 8 af 15
3. Åben filen: SerielKommunikation.asm 4. Udkommentér TRANSMITTERSETUP og MAINTRANSMITTER 5. Sørg for, at RECEIVERSETUP og MAINRECEIVER ikke er udkommenteret! 6. Kør koden igennem og programmér OTG-kit et 7. Tilfør den serielle ledning imellem de to OTG-kits i PORTC 8. Tilfør LED-rækken til receiveren i PORTB 9. Dernæst programmerer vi transmitteren (Afsenderen) 10. Tilslut det andet OTG-kit til PICKIT 2 11. Udkommentér RECEIVERSETUP og MAINRECEIVER 12. Sørg for, at TRANSMITTERSETUP og MAINTRANSMITTER ikke er udkommenteret! 13. Kør koden igennem og programmér OTG-kit et 14. Seriel kommunikation er nu igang! Procedure for at ændre den transmitterede data: 1. Åben filen: SerielKommunikation.asm 2. Find MAINTRANSMITTER i koden 3. For at ændre dataen, skal du blot ændre den data du flytter ind i W (MOVLW *dit data*) 4. Dernæst, kald TRANSMITTER og derefter DELAY 5. Du har nu transmitteret dit data For mere dybdegående information, se databladet for PIC16F87XA side 113 til 118. Side 9 af 15
6 Bilag 6.1 Blokdiagrammer 6.2 Bedstemor diagram 6.2.1 Seriel kommunikation Side 10 af 15
6.2.2 Transmitter Side 11 af 15
Side 12 af 15
6.2.3 Receiver Side 13 af 15
6.2.4 Delay Side 14 af 15
6.3 Kode Se vedlagte filer: SerielKommunikation.asm, Transmitter.inc, Receiver.inc og Delay.lib Side 15 af 15