Presentation laddar. Vänta.

Presentation laddar. Vänta.

Maskinorienterad Programmering 1 Periferikretsar, In- /Ut- matning EDA 480 – Maskinorienterad Programmering 2009/2010 CPU12 Reference Guide Stencil: ”Assemblerprogrammering.pdf”

Liknande presentationer


En presentation över ämnet: "Maskinorienterad Programmering 1 Periferikretsar, In- /Ut- matning EDA 480 – Maskinorienterad Programmering 2009/2010 CPU12 Reference Guide Stencil: ”Assemblerprogrammering.pdf”"— Presentationens avskrift:

1 Maskinorienterad Programmering 1 Periferikretsar, In- /Ut- matning EDA 480 – Maskinorienterad Programmering 2009/2010 CPU12 Reference Guide Stencil: ”Assemblerprogrammering.pdf” Ur innehållet: Parameteröverföring Positionsoberoende kod Räknarkretsar (”TIMERS”) Pulsbreddsmodulering (”PWM”) Analog-/Digital- omvandling(”AD”) Seriekommunikation (”SCI”)

2 Maskinorienterad Programmering  Via register  Via stacken  ”In Line” Parameteröverföring till/från subrutiner 2 Periferikretsar, In- /Ut- matning

3 Maskinorienterad Programmering Parameteröverföring via register 3 Periferikretsar, In- /Ut- matning Antag att vi alltid använder register D,X,Y (i denna ordning) för parametrar som skickas till en subrutin. Då kan funktionsanropet (subrutinanropet) dummyfunc(la,lb,lc); översättas till: LDDla LDXlb LDYlc BSRdummyfunc Då vi kodar subrutinen dummyfunc vet vi (på grund av våra regler) att den första parametern skickas i D, den andra i X och den tredje i Y (osv). Metoden är enkel och ger bra prestanda. Begränsat antal parametrar kan överföras.

4 Maskinorienterad Programmering Returvärden via register 4 Periferikretsar, In- /Ut- matning Register väljs, beroende på returvärdets typ (storlek), HCS12-exempel StorlekBenämningC-typRegister 8 bitarbytecharB 16 bitarwordshort intD 32 bitarlonglong intY/D En regel (konvention) bestäms och följs därefter vid kodning av samtliga subrutiner

5 Maskinorienterad Programmering ”Lokala variabler” – stacken för temporär lagring 5 Periferikretsar, In- /Ut- matning ; dummyfunc(la,lb,lc); dummyfunc: ; parametrar finns i register, ; spara på stacken STD2,-SP STX2,-SP ----här används registren för andra syften ---- ; återställ ursprungliga parametrar från stacken LDD2,SP LDX0,SP --- LEAS4,SP; återställ stackpekare RTS AdressInnehållSP före SP efter 3000 ◄ 2FFFD.lsb 2FFED.msb 2FFDX.lsb 2FFCX.msb ◄ 2FFB

6 Maskinorienterad Programmering Parameteröverföring via stacken 6 Periferikretsar, In- /Ut- matning Antag att listan av parametrar som skickas till en subrutin behandlas från höger till vänster. Då kan dummyfunc(la,lb,lc); Översättas till: LDDlc PSHD ;(alternativt STD2,-SP) LDDlb PSHD LDDla PSHD BSRdummyfunc LEAS6,SP InnehållKommentarAdressering via SP i subrutinen lc.lsb Parameter lc 6,SP lc.msb lb.lsb Parameter lb 4,SP lb.msb la.lsb Parameter la 2,SP la.msb PC.lsb Återhoppsadress, placeras här vid BSR 0,SP PC.msb dummyfunc:. LDD2,SP ; parameter la till register D. LDD4,SP ; parameter lb till register D. LDD6,SP ;parameter lc till register D

7 Maskinorienterad Programmering Parameteröverföring ”In Line” 7 Periferikretsar, In- /Ut- matning “In line” parameteröverföring, värdet 10 ska överföras till en subrutin: BSRdummyfunc FCB10... dummyfunc: LDAB[0,SP]; parameter->B LDX0,SP; återhoppsadress->X INX; modifiera.. STX0,SP;.. tillbaks till stack... RTS

8 Maskinorienterad Programmering Positionsoberoende kod 8 Periferikretsar, In- /Ut- matning ORG$1000 main: NOP JMPmain Genererad kod: A Den absoluta adressen till symbolen main är kodad i instruktionen. Genererad kod: A7 20 FD Adressen till main anges som en offset till programräknaren (FD=-3, PC-relativ) ORG$1000 main: NOP BRAmain POSITIONSOBEROENDE (”PIC”, Position Independent Code)

9 Maskinorienterad Programmering Relokering 9 Periferikretsar, In- /Ut- matning Antag att vi vill ”flytta” maskinkod från en startadress till en annan (Relokera kod). PIC: Bara kopiera från källadress till destination. EJ PIC: Absoluta adresser måste ”räknas om” (kräver relokeringsinformation, dvs VILKA adresser innehåller referenser till absoluta adresser, etc.)

10 Maskinorienterad Programmering CRG, Clock Reset Generator 10 Periferikretsar, In- /Ut- matning HCS12 har programmerbar arbetstakt. Kontrolleras från CRG-modul. BusClock (E) = PLLCLK/2

11 Maskinorienterad Programmering 11 Periferikretsar, In- /Ut- matning Antag 8 MHz kristall. PLLCLK får aldrig vara mindre än OSCCLK eftersom detta äventyrar stabilitetsvillkoren i oscillatorn. PLLCLK/2 får aldrig vara större än nominella arbetsfrekvensen hos kretsen. För första generationens HCS12 innebär detta att PLLCLK/2 < 25 MHz. Sätt: SYNR = 5 och REFDV = 1 EXEMPEL: Bestäm busfrekvens

12 Maskinorienterad Programmering Clock Reset Generator (CRG) Offset MnemonicNamn $0 0 R00 SYN5SYN4SYN3SYN2SYN1SYN0SYNR Synthesizer Register W $0 1 R0000 REFDV 3 REFDV 2 REFDV 1 REFDV 0 REFDV Reference Divide Register W $0 2 R CTFLG *)Test Flags Register W $0 3 R RTIFPORFLVRF LOCKI F LOCKSCMIESCMIF SCM CRGFLG Flags Register W $0 4 R RTIE 00 LOCKI E 00 SCMIE 0 CRGINT Interrupt Enable Register W $0 5 R PLLSEL PSTP SYSWA I ROAWAIPLLWAICWAIRTIWAICOPWAI CLKSEL Clock Select Register W $0 6 R CMEPLLONAUTOAOQ 0 PREPCESCMEPLLCTL PLL Control Register W $0 7 R 0 RTR6RTR5RTR4RTR3RTR2RTR1RTR0RTICTL RTI Control Register W $0 8 R WCOPRSBCK 000 CR2CR1CR0COPCTL COP Control Register W $0 9 R FORBYP *)Force and Bypass Test Register W $0 A R CTCTL *)Test Control Register W $0 B R ARMCOP COP Arm/Timer Reset W Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0 12 Periferikretsar, In- /Ut- matning Basadress = $34 $34 $35 $36 $37 $38 $39 $3A $3B $3C $3D $3E $3F Algoritm: 1. Skriv nya värden till SYNR, REFDV. 2. Vänta tills kretsen ”låser” (LOCK=1) 3. Växla till PLL (sätt PPLSEL=1)

13 Maskinorienterad Programmering..programmering.. 13 Periferikretsar, In- /Ut- matning *Generisk kod för programmerad arbetstakt... MOVB#REFDVVal,REFDV MOVB#SYNRVal,SYNR wait: BRCLRCRGFLG,#LOCK,wait; vänta tills PLL låst... BSETCLKSEL,#PLLSEL; växla systemklocka till PLL. * Adressdefinitioner för register REFDVEQU$35 SYNREQU$34 CRGFLGEQU$37 CLKSELEQU$39 * Bitdefinitioner PLLSELEQU$80 LOCKEQU8 * Registervärden REFDVVal:EQU1 SYNRVal:EQU5

14 Maskinorienterad Programmering Räknarkrets (”timer”), principiell funktion 14 Periferikretsar, In- /Ut- matning Nedräknare Clk IRQ =0 “Reload” Pulser/ intervall “Pre- scaler” IRQ Enable Läsbart register Används för att dela ned klockfrekvensen Räknar värde 0 IRQ t Periodiska avbrott Kan användas för att skapa en “REALTIDSKLOCKA”

15 Maskinorienterad Programmering Realtidsklocka i HCS12 15 Periferikretsar, In- /Ut- matning Tre olika register används för realtidsklockan

16 Maskinorienterad Programmering 16 Periferikretsar, In- /Ut- matning Clock Reset Generator (CRG) Offset MnemonicNamn $0 0 R00 SYN5SYN4SYN3SYN2SYN1SYN0SYNR Synthesizer Register W $0 1 R0000 REFDV 3 REFDV 2 REFDV 1 REFDV 0 REFDV Reference Divide Register W $0 2 R CTFLG *)Test Flags Register W $0 3 R RTIFPORFLVRF LOCKI F LOCKSCMIESCMIF SCM CRGFLG Flags Register W $0 4 R RTIE 00 LOCKI E 00 SCMIE 0 CRGINT Interrupt Enable Register W $0 5 R PLLSEL PSTP SYSWA I ROAWAIPLLWAICWAIRTIWAICOPWAI CLKSEL Clock Select Register W $0 6 R CMEPLLONAUTOAOQ 0 PREPCESCMEPLLCTL PLL Control Register W $0 7 R 0 RTR6RTR5RTR4RTR3RTR2RTR1RTR0RTICTL RTI Control Register W $0 8 R WCOPRSBCK 000 CR2CR1CR0COPCTL COP Control Register W $0 9 R FORBYP *)Force and Bypass Test Register W $0 A R CTCTL *)Test Control Register W $0 B R ARMCOP COP Arm/Timer Reset W Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0 $34 $35 $36 $37 $38 $39 $3A $3B $3C $3D $3E $3F Algoritm, initiering 2. Aktivera avbrott från kretsen 1. Skriv tidbas för avbrottsintervall till RTICTL Realtidsklocka i HCS12, initiering

17 Maskinorienterad Programmering RTR [3:0] RTR[6:4] 000 (OFF) OFF OFF2x2 10 2x2 11 2x2 12 2x2 13 2x2 14 2x2 15 2x OFF3x2 10 3x2 11 3x2 12 3x2 13 3x2 14 3x2 15 3x OFF4x2 10 4x2 11 4x2 12 4x2 13 4x2 14 4x2 15 4x OFF5x2 10 5x2 11 5x2 12 5x2 13 5x2 14 5x2 15 5x OFF6x2 10 6x2 11 6x2 12 6x2 13 6x2 14 6x2 15 6x OFF7x2 10 7x2 11 7x2 12 7x2 13 7x2 14 7x2 15 7x OFF8x2 10 8x2 11 8x2 12 8x2 13 8x2 14 8x2 15 8x OFF9x2 10 9x2 11 9x2 12 9x2 13 9x2 14 9x2 15 9x OFF10x x x x x x x OFF11x x x x x x x OFF12x x x x x x x OFF13x x x x x x x OFF14x x x x x x x OFF15x x x x x x x OFF16x x x x x x x2 16 ”Prescaler” för räknarkretsen 17 Periferikretsar, In- /Ut- matning

18 Maskinorienterad Programmering Beräkning av tidbas 18 Periferikretsar, In- /Ut- matning (Se även exempel i ”Stencil 2”) Den bästa approximationen har vi för RTR = = $49, som medför: 10x2 13 = Eftersom detta värde är något större än det exakta, kommer vi att få en något längre periodtid, nämligen: avbrottsfrekvens = 8×10 6 / = Hz vilket ger periodtiden: s = 10,24 ms. Klockan kommer alltså att "gå för sakta" som en följd av detta systematiska fel.

19 Maskinorienterad Programmering.. Program för initiering.. 19 Periferikretsar, In- /Ut- matning ; Adressdefinitioner CRGINTEQU$38 RTICTLEQU$3B timer_init: ; Initiera RTC avbrottsfrekvens ; Skriv tidbas för avbrottsintervall till RTICTL MOVB#$49,RTICTL ; Aktivera avbrott från CRG-modul MOVB#$80,CRGINT RTS Anmärkning: Det är olämpligt att använda detta värde då programmet testas i simulator, använd då i stället det kortast tänkbara avbrottsintervallet enligt; ; Skriv tidbas för avbrottsintervall till RTICTL MOVB#$10,RTICTL; För simulator

20 Maskinorienterad Programmering 20 Periferikretsar, In- /Ut- matning Clock Reset Generator (CRG) Offset MnemonicNamn $0 0 R00 SYN5SYN4SYN3SYN2SYN1SYN0SYNR Synthesizer Register W $0 1 R0000 REFDV 3 REFDV 2 REFDV 1 REFDV 0 REFDV Reference Divide Register W $0 2 R CTFLG *)Test Flags Register W $0 3 R RTIFPORFLVRF LOCKI F LOCKSCMIESCMIF SCM CRGFLG Flags Register W $0 4 R RTIE 00 LOCKI E 00 SCMIE 0 CRGINT Interrupt Enable Register W $0 5 R PLLSEL PSTP SYSWA I ROAWAIPLLWAICWAIRTIWAICOPWAI CLKSEL Clock Select Register W $0 6 R CMEPLLONAUTOAOQ 0 PREPCESCMEPLLCTL PLL Control Register W $0 7 R 0 RTR6RTR5RTR4RTR3RTR2RTR1RTR0RTICTL RTI Control Register W $0 8 R WCOPRSBCK 000 CR2CR1CR0COPCTL COP Control Register W $0 9 R FORBYP *)Force and Bypass Test Register W $0 A R CTCTL *)Test Control Register W $0 B R ARMCOP COP Arm/Timer Reset W Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0 $34 $35 $36 $37 $38 $39 $3A $3B $3C $3D $3E $3F Algoritm, kvittera avbrott 1. RTIF = 1 Realtidsklocka i HCS12, vid avbrott

21 Maskinorienterad Programmering Realtidsklocka i HCS12, avbrottshantering 21 Periferikretsar, In- /Ut- matning ; Adressdefinition CRGFLGEQU$37 timer_interrupt: ; Kvittera avbrott från RTC BSETCRGFLG,#$80 RTI ; Avbrottsvektor på plats… ORG$FFF0 FDBtimer_interrupt Adress (hex)Funktion FFF0Real Time Interrupt FFEEEnhanced Capture Timer channel FFECEnhanced Capture Timer channel 1 FFEAEnhanced Capture Timer channel FF8EPort P Interrupt FF8CPWM Emergency Shutdown FF8A- FF80 Reserverade

22 Maskinorienterad Programmering Realtidsklocka med hög upplösning 22 Periferikretsar, In- /Ut- matning ”Enhanced Capture Timer” (ECT) En maskincykels noggrannhet EXEMPEL: Arbetstakt= 24 MHz PERIOD = Intervall = 1 ms Noggrannhet = 1/ sek. ≈ 41,7 × sec.

23 Maskinorienterad Programmering Programexempel 23 Periferikretsar, In- /Ut- matning TIOSEQU $40 TCNTEQU $44 TIEEQU$4C TFLG1EQU $4E TOC_0EQU $50 PERIODEQU24000 Init:MOVB#1,TIOS; ch 0 är OC MOVB#1,TIE; tillåt IRQ LDDTCNT; aktuell cykel ADDD#PERIOD; addera period STDTOC_0; nästa avbrott RTS ORG$FFEE FDBTOCirq TOCirq :MOVB#1,TFLG1; kvittera LDDTCNT; ny period ADDD#PERIOD STDTOC_0 RTI Adress (hex)Funktion FFF0Real Time Interrupt FFEEEnhanced Capture Timer channel 0 FFECEnhanced Capture Timer channel 1 FFEAEnhanced Capture Timer channel FF8EPort P Interrupt FF8CPWM Emergency Shutdown FF8A- FF80 Reserverade

24 Maskinorienterad Programmering Pulsbreddsmodulering (PWM) 24 Periferikretsar, In- /Ut- matning U period duty- cycle Period och ”duty- cycle” är programmerbart U U

25 Maskinorienterad Programmering PWM-styrning 25 Periferikretsar, In- /Ut- matning period Register PWM Data bus Continous signal out Power Amplifier Högtalare, glödlampa element, etc... dutycycle Register Control bus

26 Maskinorienterad Programmering 26 Periferikretsar, In- /Ut- matning 8 * 8 bitars eller 4 * 16 bitars räknare period ”duty cycle”

27 Maskinorienterad Programmering Programexempel 27 Periferikretsar, In- /Ut- matning ; PWM initiering PWMEEQU$A0 PWPOLEQU$A1 PWMPRCLKEQU$A3 PWMPER0EQU$B4 PWMDTY0EQU$BC ; låg nivå startar period CLRPWMPOL ; c:a 4 ms periodtid MOVB#$77,PWMPRCLK ; pwm kanal 0 MOVB#$FF,PWMPER0 ; börja med 80% duty cycle.. MOVB#$D0,PWMDTY0 ; aktivera kanal 0 MOVB#1,PWME

28 Maskinorienterad Programmering Analog-/Digital- omvandling 28 Periferikretsar, In- /Ut- matning

29 Maskinorienterad Programmering 29 Periferikretsar, In- /Ut- matning Multiplex 8 kanaler.

30 Maskinorienterad Programmering Programexempel 30 Periferikretsar, In- /Ut- matning ; AD initiering ; Högerjustera resultat, unipolärt ; kontinuerlig mode (scan), AD kanal 6 MOVB#$A6,ATDCTL5 ; upplösning MOVB#$E5,ATDCTL4 ; en konverteringssekvens MOVB#$40,ATDCTL3 ; normal mode MOVB#$C0,ATDCTL2 ; Vänta tills omvandling klar wAD: BRCLRATD0STAT0,#$80,wAD ; När resultat färdigt, läs LDABATD0DR0L...

31 Maskinorienterad Programmering Seriekommunikation, SCI 31 Periferikretsar, In- /Ut- matning Central Processing Unit Parallel to serial conversion Serial to parallel conversion Receive Data: RxD Transmit Data: TxD Central Processing Unit Parallel to serial conversion Transceiver Receive Transmit Serial transmission Transceiver Receive Transmit Serial to parallel conversion

32 Maskinorienterad Programmering 32 Periferikretsar, In- /Ut- matning Clock Control Data Register Shift Register Data buss OE CS TxD Serial data out Clock Data Register Shift Register Data buss OE Control E Serial data in RxD Sändare Mottagare Sändare och mottagares klockor går i samma takt

33 Maskinorienterad Programmering RS232 – överföring av tecknet ’z’ 33 Periferikretsar, In- /Ut- matning tecknet ”z” representeras av bitmönstret ” ” (ASCII-tecken) volt 0 volt - 10 volt STARTBITSTARTBIT PARITYBITPARITYBIT STOPBITSTOPBIT idle ’z’ – minst signifikanta bit först

34 Maskinorienterad Programmering Serial Communication Interface (SCI) Offset MnemonicNamn $00 R000 SBR12SBR11SBR10SBR9SBR8SCIBDH Baud Rate Register High W $01 R SBR7SBR6SBR5SBR4SBR3SBR2SBR1SBR0SCIBDL Baud Rate Register Low W $02 R LOOPSSCISWAIRSRCMWAKEILTPEPTSCICR1 Control Register 1 W $03 R TIETCIERIEILIETERERWUSBKSCICR2 Control Register 2 W $04 RTDRETCRDRFIDLEORNFFEPF SCISR1 Status Register 1 W $05 R00000 BRK13TXDIR RAF SCISR2 Status Register 2 W $06 RR8 T SCIDRH Data Register High W $07 RR7R6R5R4R3R2R1R0 SCIDRL Data Register Low WT7T6T5T4T3T2T1T0 Initiering, ”busy-wait” 34 Periferikretsar, In- /Ut- matning Algoritm: 1. Initiera BAUDRATE 2. Aktivera Transmitter Receiver Basadress = $C8 SCI0BD:EQU$C8; SCI 0 baudrate-register (16 bit). SCI0CR2:EQU$CB; SCI 0 styr-register 2. ; Bitdefinitioner, styrregister TE:EQU$08; Transmitter enable. RE:EQU$04; Receiver enable.

35 Maskinorienterad Programmering Skriv tecken via SCI 35 Periferikretsar, In- /Ut- matning Serial Communication Interface (SCI) Offset MnemonicNamn $00 R000 SBR12SBR11SBR10SBR9SBR8SCIBDH Baud Rate Register High W $01 R SBR7SBR6SBR5SBR4SBR3SBR2SBR1SBR0SCIBDL Baud Rate Register Low W $02 R LOOPSSCISWAIRSRCMWAKEILTPEPTSCICR1 Control Register 1 W $03 R TIETCIERIEILIETERERWUSBKSCICR2 Control Register 2 W $04 RTDRETCRDRFIDLEORNFFEPF SCISR1 Status Register 1 W $05 R00000 BRK13TXDIR RAF SCISR2 Status Register 2 W $06 RR8 T SCIDRH Data Register High W $07 RR7R6R5R4R3R2R1R0 SCIDRL Data Register Low WT7T6T5T4T3T2T1T0 Algoritm: TDRE = (Transmit Data Register Empty) 1. Om TDRE=1 SCIDRL=tecken SCI0SR1:EQU$CC; SCI 0 status-register 1. SCI0DRL:EQU$CF; SCI 0 data-register låg byte. ; Bitdefinitioner, statusregister TDRE:EQU$80; Transmit data register empty status bit.

36 Maskinorienterad Programmering Läs tecken från SCI 36 Periferikretsar, In- /Ut- matning Serial Communication Interface (SCI) Offset MnemonicNamn $00 R000 SBR12SBR11SBR10SBR9SBR8SCIBDH Baud Rate Register High W $01 R SBR7SBR6SBR5SBR4SBR3SBR2SBR1SBR0SCIBDL Baud Rate Register Low W $02 R LOOPSSCISWAIRSRCMWAKEILTPEPTSCICR1 Control Register 1 W $03 R TIETCIERIEILIETERERWUSBKSCICR2 Control Register 2 W $04 RTDRETCRDRFIDLEORNFFEPF SCISR1 Status Register 1 W $05 R00000 BRK13TXDIR RAF SCISR2 Status Register 2 W $06 RR8 T SCIDRH Data Register High W $07 RR7R6R5R4R3R2R1R0 SCIDRL Data Register Low WT7T6T5T4T3T2T1T0 Algoritm: RDRF = (Receive Data Register Full) 1. Om RDRF =1 tecken=SCIDRL SCI0SR1:EQU$CC; SCI 0 status-register 1. SCI0DRL:EQU$CF; SCI 0 data-register låg byte. ; Bitdefinitioner, statusregister RDRF:equ$20; Receive data register full status bit.

37 Maskinorienterad Programmering Bestämma Baudrate-värde 37 Periferikretsar, In- /Ut- matning 9 600, Eclock:EQU ; 8 MHz ; BaudRate register värden, baserad på PLL-klocka Baud9600:EQU(Eclock/(16*9600))

38 Maskinorienterad Programmering Programmet Periferikretsar, In- /Ut- matning ; enkelt testprogram ORG$1000 JSRserial_init Loop:JSRin; "eka" tecken JSRout BRAloop ;OUT tecken rutin ;Skriv tecken till SCI0 ;Inparameter, register B: tecken. out:BRCLRSCI0SR1,#TDRE,out; vänta till TDRF=1 STABSCI0DRL; skicka tecken... RTS ;IN tecken rutin ;Läs tecken från SCI0 ;Returnera i register B in:BRCLRSCI0SR1,#RDRF,in; vänta till RDRF=1 LDABSCI0DRL; läs tecken RTS


Ladda ner ppt "Maskinorienterad Programmering 1 Periferikretsar, In- /Ut- matning EDA 480 – Maskinorienterad Programmering 2009/2010 CPU12 Reference Guide Stencil: ”Assemblerprogrammering.pdf”"

Liknande presentationer


Google-annonser