Styrprogram till PICprocessorer för fjärrmanövrerad relämatris i distanslaboratorier Eric Eskilsson
Examensarbete BEE08:05 Styrprogram till PICprocessorer för fjärrmanövrerad relämatris i distanslaboratorier Eric Eskilsson This thesis is presented as part of Degree of Bachelor of Science in Electrical Engineering Blekinge Institute of Technology Augusti 2008 Blekinge Institute of Technology School of Engineering Department of Applied Signal Processing Supervisor: Anders Johansson Examiner: Anders Johansson
Abstract The aims with this report are to document the upgrade and development of new software for the distance laboratory at Blekinge Tekniska Högskola. The work has been focused on implementing the identification number in a microcontroller, to read its data from a so called look-up table and to be able to control digital components through a serial bus (SPI). The look-up table is a list of data from which the software reads data for the different types of printed circuit boards in the hardware component of the distance laboratory is in focus. The results of the report are an implemented, upgraded version of the software and all three aims has been accomplished. Sammanfattning Syftet med detta arbete har varit att utveckla och uppgradera en ny mjukvara till distanslaboaratoriet på Blekinge Tekniska Högskola, genom att implementera adressen till en microcontroller, att läsa dess data från en så kallad look-up table, samt att kunna styra digitala komponenter med en seriell buss (SPI). Fokus i programmeringen har legat på look-up table, vilket är en datalista som mjukvaran läser funktionsdata från för de olika korttyperna i matrisen. Resultatet är en implementerad, uppgraderad version av mjukvaran och alla tre målen har gått att genomföra.
Innehållsförteckning 1. Inledning 1 1.1 Bakgrund....1 1.2 Syfte...2 1.3 Metod..........2 2. Funktionsbeskrivning 3 2.1 Kommunikationsprotokoll...6 2.2 Den primära styrenheten...8 2.3 Den sekundära styrenheten...9 2.4 Digital potentiometer...10 3. Programmet till PIC16F767 11 4. Slutsats/Diskussion 12 Källförteckning...13 Bilaga 1...14 Bilaga 2...15 Bilaga 3...16 Bilaga 4...17 Tabell...25
1 Inledning 1.1 Bakgrund Laborationer ingår vanligtvis i elektronikkurser på högskolor och universitet. Laborationerna utförs i övningslaboratorier utrustade med instrument och nödvändig utrustning. Med en utveckling av ett allt snabbare Internet ges nya möjligheter att fjärrstyra experiment och dessa beprövade undervisningsmetoder kan implementeras på nytt sätt i så kallade distanslaboratorier. Lärosäten utan tillgång till övningslaboratorier kan via ett distanslaboratorium erbjuda utbildningar, där laborationer ingår. Erbjudandet kan också riktas till studenter som vill experimentera utanför kontorstid eller personer som har svårt att ta sig till önskat lärosäte. Vid Blekinge Tekniska Högskola, BTH finns ett distanslaboratorium. I laboratoriet ingår bland annat en kopplingsmatris, se figur 1 (s 1). Denna rapport beskriver en ny version av programvaran i matrisen. Användaren ser en bild på ett kopplingsdeck på sin dator och kan bygga upp olika kopplingar på detta. Informationen om kopplingen lagras i en databas, som i sin tur sänder vidare informationen till en mät- och utrustningserver, där de mätinstrument, komponenter och signalkällor som angetts av användaren kopplas in. Figur 1. En övergripande bild av distanslaboratoriet. 1
1. 2 Syfte Syftet med arbetet är att utveckla en ny mjukvara till de PIC-kretsar som styr den relämatris vilken sköter inkoppling av olika komponenter och instrument i distanslaboratoriet på Blekinge Tekniska Högskola i Ronneby. Den nya programvaran kommer även att kunna styra nya digitala komponenter med SPI, såsom en digital potentiometer för mätning av operationsförstärkare och en AD/DA-omvandlare. SPI är ett sätt att seriellt skicka data för att styra digitala komponenter. Detta gör att laboratoriet i framtiden kommer att ha möjlighet att kunna utvidga sitt utbud av olika typer av laborationer. I denna nya version, version 4.1, ska mjukvaran läsa data från en datalista, en så kallad look-up table (se bilaga 1, s 14). Datalistans data beskriver de funktioner varje korttyp i matrisen har. I systemet finns två olika typer av processorer. För att skilja på de båda typerna kallas här den processor som fungerar som master den primära styrenheten och övriga som är slavar de sekundära styrenheterna (se Figur 6, s 8). I en tidigare version av programvaran bestämdes identiteten för slavarna med en dip-switch, men i den nya versionen kommer identiteten implementeras i chipet vid programmeringen. En 7-bitars adresskod bestämmer vilken identitet varje processor har. 1. 3 Metod Den metod som här används är att utgå från tidigare version av mjukvaran till matrisen och sedan med hjälp av lämpliga datablad, för bland annat processorkretsarna, Internet och diskussioner med handledare ta fram vilka funktioner de olika PIC-processorerna i matrisen ska ha och implementera dem. Därefter testas funktionerna, modifieras och testas på nytt tills önskvärt resultat nås. 2
2 Funktionsbeskrivning Matrisens uppgift, i distanslaboratoriet, är att utföra de kopplingar som görs manuellt på en kopplingsplatta i ett elektriskt laboratorium under en laboration, som att göra uppkopplingar med komponenter, till exempel resistorer och utföra mätningar med digitalmultimeter eller oscilloskop när en spänningskälla och signalgenerator har kopplats in i kretsen. För inkopplingen av dessa komponenter och instrument i matrisen används reläer. För att dela upp de olika funktionerna i matrisen, innehåller den tre olika korttyper, (figur 2, s 3). Första korttypen heter huvudkort (Control Board) och sköter inkopplingen av en funktionsgenerator. Följande korrtyp kallas instrumentkort (Connection Board) och kopplar in antingen en digitalmultimeter eller ett oscilloskop, för att få båda funktionerna behövs alltså två instrumentkort. Den tredje korttypen heter komponentkort (Component Board) och ansluter de elektriska komponenter, som man bygger upp kretsar med för att mäta på. Komponentkortet kan ha upp till 10 stycken inkopplingsbara komponenter per kort. Matrisen är skalbar, det vill säga att den kan byggas ut genom att sätta dit ytterligare komponentkort. Alla korten har varsin egen identitet som definieras av en adressbyte (7 bitar). Maximalt 127 kort kan anslutas till matriskopplingen, eftersom 7 digitala bitar används till adressen och adress 000 inte används(2 7-1). Kommunikationen mellan korten sker via I 2 C (se bilaga 4, s17). Figur 2. Matrisen med de tre olika typerna av kort i matrisen. 3
Det finns bara ett huvudkort i hela matrisen. Huvudkortet får information från servern via en USB-port och skickar informationen vidare till de övriga korten i matrisen. På huvudkortet sitter den så kallade primära styrenheten, som är en PIC-processor med modellbeteckning PIC18F4550 (se 2.2, s 8). Dess uppgift är att omvandla USB-information till I 2 C i matriskopplingen. På varje kort sitter en sekundär styrenhet, med modellbeteckning PIC16F767, som styr matrisreläer eller styrbara IC-kretsar, till exempel digitala potentiometrar eller AD/DA-omvandlare, vilka kopplas in för de olika mätningarna. På huvudkortet sköter den sekundära styrenheten inkoppling av funktionsgeneratorn och andra spänningskällor. Instrumentkorten finns det två av i denna version, men de kan utökas till flera, då på bekostnad av det maximala antalet komponentkort som kan anslutas. Totalt är det maximalt, som ovan nämnts 127 kort, varav ett är huvudkort och övriga kan antingen vara instrumentkort eller komponentkort. Detta är teoretiska beräkningar för att påvisa möjligheterna. Med många kort i matrisen krävs dock både förstärkning och avstörning för att enheten ska fungera driftsäkert. Instrumentkortens sekundära styrenhet kopplar in ett oscilloskop och en digitalmultimeter (här med BNC-ingångar). Komponentkortet kopplar in komponenter för att kunna mäta och göra olika uppkopplingar. Både komponentkorten och instrumentkorten saknar den primära styrenheten men har den sekundära. På komponentkorten väljer den sekundära styrenheten vilket styrobjekt som ska styras. För det mesta är styrobjekten reläer som ska slå till eller från, men i vissa fall kan det också röra sig om att styra vissa digitala kretsar som exempelvis en digital potentiometer eller en AD/DA-omvandlare. Figur 3. Blockschema för signalvägarna i matrisen. 4
Figur 3 (s 4) visar ett blockschema över alla signalvägar. Den primära styrenheten får en digital sträng av bytes från servern i USB-format. Dessa omvandlas i den primära styrenheten till I 2 C och skickas ut till de sekundära styrenheterna som i sin tur styr sina objekt. I detta fallet är det I 2 C-utgången på den primära styrenheten som är ihopkopplad med I 2 C-ingångarna på alla processorer i den sekundära styrenheten. För att välja vilken processor informationen gäller har varje processor en egen adress. 5
2.1 Kommunikationsprotokoll Informationen som kommer via USB från servern är uppdelad i bytes och sänds med en adressbyte på 7 bitar. Den 8:e biten är alltid låg eftersom kommunikationen bara går från mastern till slavarna (se bilaga 2, s 15). Efter adressbyten följer datainformationen i två eller tre bytes. Instrumentkorten behöver 3x7 databitar för att styra sina 21 reläer. Tre databytes behöver även de komponentkort, som har digitala komponenter och då skickar SPI-värdet i sista byten. Adressen gäller för det kort där styrobjektet sitter. Varje kort har en specifik identitet, processorns adress i I 2 C-bussen, mellan 0000 0001 och 0111 1111 (01h 7Fh). Figur 4. Mastern sänder till slavarna. I tabellen nedan visas de tre olika korttyperna, huvud-, instrument- och komponentkort och hur många databyte korttypen behöver. Tabellen (Figur 5, s 7) visar också vilka reläer som är knutna till fälten. 6
Huvudkort Byte no. Notes 0 I2C adress 0 1 0 7 6 5 4 3 2 1 Relänummer, satt bit 2 0 14 13 12 11 10 9 8 betyder slutet relä 3 0 0 0 0 0 0 0 0 Används ej Bit 07 Bit 06 Bit 05 Bit 04 Bit 03 Bit 02 Bit 01 Bit 00 Instrumentkort Byte no. Notes 0 I2C adress 0 1 0 7 6 5 4 3 2 1 Relänummer, satt bit 2 0 14 13 12 11 10 9 8 betyder slutet relä 3 0 21 20 19 18 17 16 15 Används ej Bit 07 Bit 06 Bit 05 Bit 04 Bit 03 Bit 02 Bit 01 Bit 00 Komponentkort Byte no. Notes 0 I2C adress 0 1 0 7 6 5 4 3 2 1 Relänummer, satt bit 2 0 14 13 12 11 10 9 8 betyder slutet relä 3 1 Potentiometervärde Används ej Bit 07 Bit 06 Bit 05 Bit 04 Figur 5. Tabell för vilka reläer som aktiveras på de tre olika korten. Bit 03 Bit 02 Bit 01 Bit 00 7
2.2 Den primära styrenheten Den primära styrenheten består av en processor med typbeteckning PIC18F4550. Det är en ganska stor processor med 40 ben. Den kan samtidigt hantera både USB och I 2 C (ben 23, 24 respektive 34,35 se figur 6 s 8), eftersom detta finns implementerat i hårdvaran inuti processorn. Full-speed USB (12 Mbs, mega bit per sekund) tas emot på USB-ingången och utgångarna SCL och SDA sänder vidare informationen i I 2 C-bussen. I denna nya version har den primära styrenheten uppdaterats så att alla utgångar hos den sekundära styrenheten (se 2.3, s 9) nu kan styras, vissa utgångar användes inte tidigare. Kommunikationen mellan USB och I 2 C, som i tidigare version har varit korskopplad, är numera rakkopplad. Figur 6 Den primära styrenheten och två processorer från den sekundära styrenheten. Den övre visar alla möjliga utgångar och den nedre hur SPI ansluts. 8
2.3 Den sekundära styrenheten Den sekundära styrenheten består av en processor av typen PIC16F767. Det är en 28-bens processor med 24 in- eller utgångar. Två av dessa är anslutna till I 2 C-bussen (ben 14,15 i figur 6 s 8). De övriga används som utgångar och är kopplade till varsitt relä. Utgång RA4 används ej. Olika många utgångar används beroende på vilka kort reläerna sitter på (huvud-, komponent- eller instrumentkort) och vad kortet gör. Varje PIC16F767 har egen identitet lagrad i processorn, dess egna adress. Är identiteten i första byten rätt läses följande tre bytes in, de två första har värde 0-127 och den sista 0-255. Den sista byten används till att styra de sju sista reläerna på instrumentkorten (0-127) eller för att lagra ett SPI-värde (se bilaga 3, s16) för en digital komponent (128-255). Bit 7 styr bytens funktion. Byte 4 kan också vara utan värde på komponentkort utan digital potentiometer och på huvudkortet. De båda första bytens värden jämförs med en Look-up table (se bilaga 1, s 14), en lista som är individuell för de tre olika korten. Vissa komponentkort har en digital potentiometer som används vid speciella kopplingar. Denna potentiometer styrs med SPI-kommunikation. PIC16 har både I 2 C-kommunikation och SPI-kommunikation implementerat i hårdvaran inuti kretsen (se bilaga 3, s16). Tyvärr sker denna kommunikation på samma ben och man får därför välja att antingen använda I 2 C eller SPI. Eftersom I 2 C-kommunikationen är mer omfattande används den på de nämnda benen på PIC-kretsen (ben 14 och 15 se figur 6, s 8). SPI-kommunikationen emuleras istället i mjukvara. Ben 26, 27 och 28 på den sekundära styrenheten används för SPI-kommunikation. CS-signalen tas ut på ben 28 (RB7). Den är låg då potentiometern ställs in och hög annars. Ben 27 (RB6) är CLK på potentiometern, SPI ns klocka. På ben 26 kommer det nya digitala värdet som ska ställas in, till ingång SDI på den digitala potentiometern (se 2.4, s 10). 9
2.4 Digital potentiometer Den digitala potentiometern har typbeteckningen AD7376. Det är en digital potentiometer med dubbla matningar ( 15V). Det innebär att man kan mata in 30 volt mellan potentiometerns ytterändar (anslutning A och B, figur 7, s 10) och ta ut 0-30 V på mittbenet (W). Figur 7. Den digitala potentiometern. AD7376 finns i fyra olika utföranden, beroende på vilken maxresistans man vill ha. Resistanserna är 10 kohm, 50 kohm, 100 kohm (se tabell s 25) (eller 1 Mohm). Resistansen ställs sedan in med 128 steg med formeln: Figur 8. Formel för uträkning av potentiometerns värden. D är det inställda bitvärdet (0-127) och RAB totalresistansen för potentiometern (10 kohm, 50 kohm, 100 kohm eller 1Mohm). RW är en inre resistans som är ungefär 120 ohm (se tabell, s 25). Potentiometern styrs via ett 3-tråds SPI-gränssnitt (se Bilaga 3, s 16). Ett dataord till potentiometern består av 7 bitar. Datan skickas seriellt med den mest signifikanta biten (MSB) först. När alla nya bitar har laddats in antar potentiometern det nya värdet. 10
3. Programmet till PIC16F767 Programmet till den sekundära styrenheten är uppdelat i följande delar: Initialisering Huvudprogrammet Interrupt Läsa buffert Koda av och sätta utgångar Look-up table SPI Flödesschemat nedan (figur 9, s 11) visar att programmet börjar med att initialisera. I initialiseringen bestäms vilka utgångar som ska användas. I detta programmet används alla. Här ställs också in vilken typ av avbrottsrutin som ska användas, vilken klockfrekvens processorn ska jobba med samt övrig data som behövs för att processorn ska fungera riktigt. I initialiseringen finns också den specifika adress som PIC16F767 svarar på i I 2 C-bussen implementerad. Start Start Initialisering Spara i BUF A-C Stop Ny data i J Koda av data i BUF A-C? look-up table N Sätt utgång Figur 9. Flödesschema över programmet för PIC16F767 Huvudprogrammet går i en oändlig loop så länge ingen data kommer i I 2 C-bussen, det vill säga nej i alternativrutan i flödesschemat. Kommer det data känner avbrottsrutinen av det och sparar, om adressen stämmer, första databyten i BUFA, andra i BUFB och tredje sparas i BUFC. Denna data kodas av med hjälp av en look-up table, en datalista (se bilaga 1, s 14) och utgångarna RA-RC bestäms. SPI-data läses bit för bit från BUFC och skickas seriellt med mest signifikanta bit först (se 2.3, s 9). 11
4. Slutsats/Diskussion Syftet med arbetet har varit att utveckla och uppgradera en ny mjukvara genom att implementera identiteten i processorerna som finns i matrisen. Man ska också kunna läsa dess data från en så kallad look-up table, ett register varifrån data kan hämtas, samt kunna styra digitala komponenter med SPI, ett sätt att styra och ändra värde på digitala komponenter, med den. Man kan lätt byta till en ny look-up table för att ge en processor nya funktioner. SPIfunktionen har testats på en digital potentiometer (AD7376), där den fungerade mycket bra. Skillnaden gentemot andra SPI-styrda komponenter ligger inte i själva styrningen utan vad de i övrigt används till. Att implementera identitet i mjukvara har fördelen att det inte behövs några extra ingångar för att sätta en ny identitet, som i tidigare version. Benen för dessa ingångar blir nu lediga att kunna användas som utgångar istället. Det behövs också färre kringkomponenter. Nackdelen kan vara att det inte syns på kretsen vilken identitet den har. Eftersom det handlar om en uppgradering av mjukvaran, visste jag att den i grundutförande skulle fungera. Look-up table var den punkt jag från början trodde skulle vara svårast att genomföra, eftersom jag aldrig tidigare hade jobbat med en sådan och därför inte visste hur jag läste data från den. Därför är det den av punkterna som har ägnats mest tid. Naturligtvis kommer det hela tiden ny teknik och nya lösningar, men idagsläget tycker jag att matrisen är fullt utvecklad. 12
Källförteckning Internetlänkar: Bilder till framsidan och collage av författaren samt från http://distanslabserver.its.bth.se/ (5/3-08, 10.00) Datablad från Microchip för PIC18F4550 USB Microcontrollers ww1.microchip.com/downloads/en/devicedoc/39632b.pdf (18/4-08, 14.00) Datablad från Microchip för PIC16F767 8-Bit CMOS Flash Microcontrollers ww1.microchip.com/downloads/en/devicedoc/30498c.pdf (18/4-08, 14.00) Datablad från Analog Devices för AD7373 8-Bit digital potentiometer www.analog.com/uploadedfiles/data_sheets/ad7376.pdf (18/4-08, 14.00) Bild från http://www.esacademy.com/faq/i2c/general/i2cproto.htm (7/5-08, 18.00) 13
Bilaga 1 Look-up table En så kallad look-up table är ett register eller tabell med data där man kan hämta information. En sådan tabell kan ses i vänster nederkant på Figur 10, nedan. Bitarna i varje byte motsvarar reläer, bit 0 i byte 1 är relä 1, bit1 är relä 2 och så vidare (se övre delen på bilden). I exemplet på bilden är bit 0, 2 och 5 ettor i byte 1, vilket betyder att relä 1, 3 och 6 ska slutas. På platserna 0, 2 och 5 i tabellen läses först de två värdena A och 3, för position 0 (relä1) och sedan A1 och A7. Det betyder att utgång A3, A1 och A7 ska vara höga. Till höger på bilden ser man att det motsvarar utgångarna för relä1, relä3 och relä6, vilka enligt exemplet var ämnade till att dras. Figur 10. Look-up table, en bit detekteras och ett relä dras. Listan komponeras speciellt till den korttyp den används till. Det är lätt att ändra funktioner för PIC16F767 genom att bara justeras värdena i listan. Listan är alltid lika lång. De platser som inte nyttjas markeras med NULL, så ignoreras den. För mjukvaran är det denna lista som skiljer de olika kortens funktioner åt och där deklareras vilka utgångar som ska aktiveras. På instrumentkorten används sista byten i denna Look-up table för att styra SPI-porten. 14
Bilaga 2 I 2 C-Protokoll Inter-Integrated Circuit (I 2 C) är ett sätt att kommunicera med två aktiva trådar, SCL (serial clock line) och SDA (serial data line), i en buss mellan en master, den ic-krets som styr kommunikationen, och en eller flera slavar, övriga kretsar som är parallellkopplade till bussen se bild nedan. Kommunikationen kan ske både i riktning från master till slav och tvärtom. I denna applikation sänder endast mastern. Figur 11. SPI-buss med en master längst till höger och övriga slavar. Sändningen börjar med en startbit, SDA går låg och SCL är hög. Därefter sänds 7 adressbitar för att specificera vilken slav informationen är ämnad för. Om sista biten i adressen är 0 sänder mastern och är den 1 tar mastern emot från slavarna. Sedan följer databytes. I vårt fall 2 eller 3 stycken, men allmänt tills en stoppbit sänds. Stoppbiten avslutar sändningen och detekteras av att SDA går hög och SCL är hög, se bild. Figur 12. Start- och stopp-pulser för SPI. Både adressbyte och databyte sänds med mest signifikanta biten först (MSB). 15
Bilaga 3 SPI-Protokoll Serial Peripheral Interface (SPI) är en defactostandard för att styra digitala komponenter. För att styra komponenterna krävs tre trådar, CLK (clock), CS (chip select) och SDI (serial data in). Informationen skickas seriellt i en grupp om 7 bitar. Under sändningen är CS låg och datan skickas med den mest signifikanta biten (MSB) först in på SDI och läses av på CLK s positiva flank. Det innebär att klockan styr avläsningen av data och gör kommunikationen okännslig för osynkroniserad klockning. När de 7 bitarna har sänts går CS hög igen och komponenten intar det nya värdet. Figur 12 Figur 13. Klockpuls(CLK), Data(SPI) och manöver(cs). För att styra flera komponenter med SPI kan man koppla ihop dem i en så kallad daisy chain. Då är CLK och CS parallellt kopplade till varje komponent och utgången (SDO) från första komponenten är kopplad till ingången (SDI) på nästa komponent och så vidare. Datasträngen kommer då att addereas med 7 bitar för varje extra komponent. Styr man till exempel 3 stycken digitala reistorer så blir datasträngen 21 bitar lång. De 7 första bitarna gäller den komponent som är längst bort i kedjan och de 7 sista för den närmast. 16
Bilaga 4 Detaljerad programvarubeskrivning 2.1 IOINIT 2.1.1 Funktioner Reset av registerna PORTA, PORTB, PORTC, TRISA, TRISB och FLAGS. PORTA, PORTB och PORTC är portanslutningar till processorn. TRISA och TRISB gör alla ben i PORTA och PORTB till utgångar. FLAGS är en markör för vilka byte som kommit in från I 2 C-bussen och vilka som har lästs. PORTA = 0 PORTB = 0 PORTC = 0 TRISA = 0 TRISB = 0 FLAGS = 0 PORTA PORTB PORTC TRISA TRISB FLAGS 2.1.2 Funktioner Alla anslutningar till PORTA och PORTB sätts här till digitala in- och utgångar (bit 0-3). Det finns 16 valmöjlighet (0-F) att välja antal analoga ingångar istället för digitala I/O. Bit 4-7 (här 0000) säger att de 6 minst signifikanta bitarna i ADRESL läses som 0, A/D Clock divideras inte med 2, VREF- är anluten till VSS och VREF+ till VDD. ADCON1 = 0Fh ADCON1 2.1.3 Funktioner Komparatormodulen i processorn används inte och är avstängd. 17
CMCON = 07h CMCON 2.1.4 Funktioner Anslutningarna till PORTC är alla utgångar utom de 2 ingångarna till I 2 C (ben 14, 15). TRISC = 18h TRISC 2.1.5 Funktioner Anslutning RE3 är ingång. Register TRISE är i övrigt satt i defaultläge. TRISE = 08h TRISE 2.1.6 Funktioner MatrixLevel bestämmer processoradressen. Processorns verkliga adress är 2x(Matrixlevel + 32), vilket ger jämna adresser mellan 64 och 126 (40h-7Eh), 32 möjliga adresser. MatrixLevel = 00h 1Fh MatrixLevel 2.1.7 Funktioner Bit 6-4 (här 7) visar att sändningshastigheten är max 8MHz. Systemet drivs inte från den primära systemklockan utan från oscillator TIMER1 eller INTRC som en sekundär systemklocka. Frekvensen är stabiliserad. Oscillator mode definieras av FOSV<2:0>. OSCCON = 74h OSCCON 18
2.1.8 Funktioner Stödjer; Synchronous Serial Port Interrupt (SSP). Stödjer ej; Parallell Slave Port Interrupt (PSP) read/write interrupt, A/D Converter interrupt, AUSART receive interrupt, CCP1 interrupt, TMR2 to PR2 interrupt, TMR1 overflow interrupt. PIE1 = 08h PIE1 2.1.9 Funktioner Inget skydd för collision och overflow. Serieporten är konfigurerad för I 2 C och klockas från mastern. Processorn är en slav med 7-bitars adress. SSPCON = 36h SSPCON 2.1.10 Funktioner Global Interrupt och Peripfheral Interrupt används. INTCON = C0h INTCON 2.1.11 Funktioner I2CADD är den valda adressen (Matrixlevel) + 32 (20h). Multipliceras med 2 för att bli processorns adress (SSPADD). I2CADD = Matrixlevel + 20h I2CADD Matrixlevel 2.1.12 Funktioner 19
Processorns adress SSPADD = 2* I2CADD SSPADD I2CADD 2.2 I2CMGR 2.2.1 Funktioner I2CMGR och MAIN är den default-slinga som programmet normalt går i när det inte är avbrott eller programmet exikverar volka utgångar som ska sättas. Då avbrott skett känner I2CMGR av om något mer är på gång i I 2 C-bussen och fäller annars den satta flaggan FLAG,7. Om SSPSTAT, P = 1 FLAGS,7 = 0 SSPSTAT, P FLAGS,7 2.3 T1 2.3.1 Funktioner Första databyten DPA läses av bit för bit och avkodas. Sätter en etta i registrer BUFA, BUFB eller BUFC, enligt Lookup_Table[n] (0 <= n <= 6) i positionerna Lookup_Table[n+15] (Lookup_Table[n+21] för instrumentkortet). Övriga positioner i BUFA, BUFB och BUFC är noll. Bit 4 i register FLAGS nollställs som indikering att byten har lästs och ny data kan sparas i register DPA. Om FLAGS,4 =1 0 <= n <= 6 Lookup_Table[n], Lookup_Table[n+15] (Gäller Source & Component) Lookup_Table[n], Lookup_Table[n+21] (Gäller Instrument) FLAGS,4 = 0 20
Lookup_Table[n] FLAGS,4 n 2.4 T2 2.4.1 Funktioner Andra databyten DPB läses av bit för bit och avkodas. Sätter en etta i registrer BUFA, BUFB eller BUFC, enligt Lookup_Table[n] (0 <= n <= 6) i positionerna Lookup_Table[n+15] (Lookup_Table[n+21] för instrumentkortet). Övriga positioner i BUFA, BUFB och BUFC är noll. Bit 5 i register FLAGS nollställs som indikering att byten har lästs och ny data kan sparas i register DPB. Om FLAGS,5 =1 7 <= n <= 13 Lookup_Table[n], Lookup_Table[n+15] (Gäller Source & Component) Lookup_Table[n], Lookup_Table[n+21] (Gäller Instrument) FLAGS,5 = 0 Lookup_Table[n] FLAGS,5 n 2.5 T3 2.5.1 Funktioner Tredje databyten DPC läses av bit 7. Är bit 7 en etta läses övriga 7 bitar (6-0)som SPIdata (se 2.6 SPI). Är bit 7 nolla läses övriga 7 bitar bit för bit och avkodas. Sätter en etta i registrer BUFA, BUFB eller BUFC, enligt Lookup_Table[n] (0 <= n <= 6) i positionerna Lookup_Table[n+15] (Lookup_Table[n+21] för instrumentkortet). Övriga positioner i BUFA, BUFB och BUFC är noll. Bit 6 i register FLAGS nollställs som indikering att byten har lästs och ny data kan sparas i register DPC. Om FLAGS,6 =1 14 <= n <= 20 21
Lookup_Table[n], Lookup_Table[n+21] (Om DPC,7 = 0) Se 2.6 SPI (Om DPC,7 = 1) FLAGS,6 = 0 PORTA = BUFA PORTB = BUFB PORTC = BUFC Lookup_Table[n] FLAGS,6 n PORTA PORTB PORTC BUFA BUFB BUFC 2.6 SPI 2.6.1 Funktioner Utgångarna 5, 6 och 7 i PORTB sätts till noll (reset för SPI-utgångarna). Bitarna i register DPC (tredje databyten från I 2 C-bussen) skickas, med mest signifikanta biten först (bit 6), seriellt på utgång 5 i PORTB (SDI dataingång) och klockas med utgång 6 i PORTB (CLK). Under hela sändningen av byten är utgång 7 (CS) nolla. Då hela byten har sänts går utgång 7 i PORTB hög igen och först då antar den digitala komponenten sitt nya värde. PORTB = PORTB && 1Fh 0 <= n <= 6 Om DPC,(6-n) = 0 PORTB = PORTB 5Fh PORTB = PORTB && 3Fh Om DPC,(6-n) = 1 PORTB = PORTB 3Fh PORTB = PORTB 7Fh PORTB = PORTB && 3Fh PORTB = PORTB 9Fh (När n=6) 22
DPC PORTB 2.7 ISR 2.7.1 Funktioner När interrupt (avbrott) sker lagras datan som finns i arbetsregistret W i register WSAVE tills avbrottsrutinen är klar och arbetsregistret hämtar tillbaka datan i WSAVE och programmet fortsätter där det var innan avbrottet. INTCON,GIE sätts till noll för att blockera fler avbrott från Global Interrupt och SSP Interrupt. Flaggan FLAGS,7 sätts när adressbiten från I 2 C- bussen har lästs. Därefter sätts flagga bit 0 och 4 i register FLAGS då första databyten har lästs och FLAGS,1 och FLAGS,5 för andra databyten. Efter tredje databyten nollställs FLAGS,0 och FLAGS,1 och bit 6 i FLAGS sätts. Avbrottsrutinen är klar nu. WSAVE = W STATSAV.swapf. STATUS INTCON,GIE = 0 PIR1,3 = 0 Om FLAGS,7 = 0 FLAGS,7 = 1 SSPCON,6 = 0 Om FLAGS,7 = 1 BUF = SSPBUF SSPCON,6 = 0 FLAGS,0 = 1 (Om FLAGS,0 = 0) FLAGS,4 = 1 (Om FLAGS,0 = 0) DPA = BUF (Om FLAGS,0 = 0) FLAGS,1 = 1 (Om FLAGS,1 = 0) FLAGS,5 = 1 (Om FLAGS,1 = 0) DPB = BUF (Om FLAGS,1 = 0) FLAGS,0 = 0 (Om FLAGS,1 = 1) FLAGS,1 = 0 (Om FLAGS,1 = 1) FLAGS,6 = 1 (Om FLAGS,1 = 1) DPA = BUF (Om FLAGS,1 = 1) 23
STATUS.swapf. STATSAV INTCON,GIE = 1 WSAVE W STATSAV STATUS INTCON,GIE PIR1,3 SSPCON,6 BUF SSPBUF DPA SSPSTAT, P FLAGS,0 FLAGS,4 FLAGS,7 24
Tabell Värde RAB=10 kohm, RW=120 ohm, D=0-127. Digitalt Analogt Digitalt Analogt Digitalt Analogt 0 120 50 4026,25 100 7932,5 1 198,125 51 4104,375 101 8010,625 2 276,25 52 4182,5 102 8088,75 3 354,375 53 4260,625 103 8166,875 4 432,5 54 4338,75 104 8245 5 510,625 55 4416,875 105 8323,125 6 588,75 56 4495 106 8401,25 7 666,875 57 4573,125 107 8479,375 8 745 58 4651,25 108 8557,5 9 823,125 59 4729,375 109 8635,625 10 901,25 60 4807,5 110 8713,75 11 979,375 61 4885,625 111 8791,875 12 1057,5 62 4963,75 112 8870 13 1135,625 63 5041,875 113 8948,125 14 1213,75 64 5120 114 9026,25 15 1291,875 65 5198,125 115 9104,375 16 1370 66 5276,25 116 9182,5 17 1448,125 67 5354,375 117 9260,625 18 1526,25 68 5432,5 118 9338,75 19 1604,375 69 5510,625 119 9416,875 20 1682,5 70 5588,75 120 9495 21 1760,625 71 5666,875 121 9573,125 22 1838,75 72 5745 122 9651,25 23 1916,875 73 5823,125 123 9729,375 24 1995 74 5901,25 124 9807,5 25 2073,125 75 5979,375 125 9885,625 26 2151,25 76 6057,5 126 9963,75 27 2229,375 77 6135,625 127 10041,87 28 2307,5 78 6213,75 29 2385,625 79 6291,875 30 2463,75 80 6370 31 2541,875 81 6448,125 32 2620 82 6526,25 33 2698,125 83 6604,375 34 2776,25 84 6682,5 35 2854,375 85 6760,625 36 2932,5 86 6838,75 37 3010,625 87 6916,875 38 3088,75 88 6995 39 3166,875 89 7073,125 40 3245 90 7151,25 41 3323,125 91 7229,375 42 3401,25 92 7307,5 43 3479,375 93 7385,625 44 3557,5 94 7463,75 45 3635,625 95 7541,875 46 3713,75 96 7620 47 3791,875 97 7698,125 48 3870 98 7776,25 49 3948,125 99 7854,375 25