Maskinorienterad Programmering 21/211 CPU12 eference Guide Stencil: Assemblerprogrammering.pdf Ur innehållet: Parameteröverföring Positionsoberoende kod äknarkretsar ( IMES ) Pulsbreddsmodulering le ( PM ) Analog-/Digital- omvandling ( AD ) Seriekommunikation ( SCI ) Parameteröverföring till/från subrutiner Via register Via stacken In Line 1 2 Parameteröverföring via register eturvärden via register 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: LDD la LDX lb LDY lc BS dummyfunc 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). väljs, beroende på returvärdets typ (storlek), HCS12-exempel Storlek Benämning C-typ 8 bitar byte char B 1 bitar word short int D 32 bitar long long int Y/D En regel (konvention) bestäms och följs därefter vid kodning av samtliga subrutiner Metoden är enkel och ger bra prestanda. Begränsat antal parametrar kan överföras. 3 4
Lokala variabler stacken för temporär lagring Parameteröverföring via stacken Adress Innehåll SP före SP efter ; dummyfunc(la,lb,lc); 3 2FFF D.lsb dummyfunc: 2FFE D.msb ; parametrar finns i register, 2FFD X.lsb ; spara på stacken 2FFC X.msb SD 2,-SP SX 2,-SP 2FFB ---- här används registren för andra syften ---- ; återställ täll ursprungliga parametrar från stacken LDD 2,SP LDX,SP --- --- LEAS 4,SP ; återställ stackpekare S Antag att listan av parametrar som skickas till en subrutin behandlas från höger till vänster. Då kan dummyfunc(la,lb,lc); lb l Översättas till: LDD lc PSHD ;(alternativt SD 2,-SP) LDD lb PSHD LDD la PSHD BS dummyfunc LEAS,SP Innehåll Kommentar Adressering via SP i subrutinen lc.lsb Parameter lc lc.msb,sp lb.lsblsb Parameter lb lb.msb 4,SP la.lsb Parameter la la.msb 2,SP PC.lsb Återhoppsadress, PC.msb placeras här vid BS,SP dummyfunc:.. LDD 2,SP ; parameter la till register D.. LDD 4,SP ; parameter lb till register D.. LDD,SP ;parameter lc till register D 5 Parameteröverföring In Line Positionsoberoende kod In line parameteröverföring, värdet 1 ska överföras till en subrutin: BS dummyfunc u FCB 1... main: OG $1 NOP JMP main Genererad kod: A7 1 Den absoluta adressen till symbolen main ärkodad i instruktionen. dummyfunc: LDAB [,SP] ; parameter->b LDX,SP ; återhoppsadress->x INX ; modifiera.. SX,SP ;.. tillbaks till stack......... S main: OG $1 Genererad kod: A7 2 FD NOP Adressen till main anges som en offset till BA main programräknaren (FD=-3, PC-relativ) POSIIONSOBEOENDE ( PIC, Position Independent Code) 7 8
elokering Antag att vi vill flytta maskinkod från en startadress till en annan (elokera kod). CG, Clock eset Generator HCS12 har programmerbar arbetstakt t. Kontrolleras från CG-modul. 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.) BusClock (E) = PLLCLK/2 9 1 EXEMPEL: Bestäm busfrekvens 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. ( SYN 1) 5MHz 2 8MHz ( EFDV 1) Sätt: SYN = 5 och EFDV = 1 (5 1) 2 8MHz 2 8 3MHz 48MHz (1 1) Algoritm: 1. Skriv nya värden till SYN, EFDV. 2. Vänta tills kretsen låser (LOCK=1) 3. Växla till PLL (sätt PPLSEL=1) Basadress = $34 $34 $35 $3 $37 $38 $39 $3A $3B $3C $3D Clock eset Generator (CG) Offset 7 5 4 3 2 1 Mnemonic Namn $ Synthesizer SYN5 SYN4 SYN3 SYN2 SYN1 SYN SYN $1 EFDV EFDV EFDV EFDV eference Divide EFDV 3 2 1 $2 *)est Flags CFLG $3 IF POF LVF LOCKIF LOCK SCMIE SCMIF SCM Flags CGFLG $4 Interrupt Enable IE LOCKIE SCMIE CGIN $5 Clock Select PLLSEL PSP SYSAI OAAI PLLAI CAI IAI COPAI CLKSEL $ PLL Control CME PLLON AUO AOQ PE PCE SCME PLLCL $7 I Control 5 4 3 2 1 ICL $8 COP Control COP SBCK C2 C1 C COPCL *)Force and Bypass $9 FOBYP est $3E $A CCL $3F $B Bit7 Bit Bit5 Bit4 Bit3 Bit2 Bit1 Bit AMCOP *)est Control COP Arm/imer eset 11 12
..programmering.. äknarkrets k ( timer ), ) principiell i i funktion * Generisk kod för programmerad arbetstakt... MOVB #EFDVVal,EFDV MOVB #SYNVal,SYN wait: BCL CGFLG,#LOCK,wait ; vänta tills PLL låst... BSE CLKSEL,#PLLSEL ; växla systemklocka till PLL. Pulser/ intervall eload äknar värde IQ IQ IQ t * Adressdefinitioner för register EFDV EQU $35 SYN EQU $34 CGFLG EQU $37 CLKSEL EQU $39 * Bitdefinitioner PLLSEL EQU $8 LOCK EQU 8 * värden EFDVVal: EQU 1 SYNVal: EQU 5 Clk Prescaler Används för att dela ned klockfrekvensenkf k Nedräknare Läsbart register = IQ Enable IQ Periodiska avbrott Kan användas för att skapa en EALIDSKLOCKA 13 14 ealtidsklocka k i HCS12 ealtidsklocka k i HCS12, initieringiti i re olika register används för realtidsklockan Algoritm, initiering 2. Aktivera avbrott från kretsen 1. Skriv tidbas för avbrottsintervall till ICL $34 $35 $3 $37 $38 $39 $3A $3B $3C $3D Clock eset Generator (CG) Offset 7 5 4 3 2 1 Mnemonic Namn $ Synthesizer SYN5 SYN4 SYN3 SYN2 SYN1 SYN SYN $1 EFDV EFDV EFDV EFDV eference Divide EFDV 3 2 1 $2 *)est Flags CFLG $3 IF POF LVF LOCKIF LOCK SCMIE SCMIF SCM Flags CGFLG $4 Interrupt Enable IE LOCKIE SCMIE CGIN $5 Clock Select PLLSEL PSP SYSAI OAAI PLLAI CAI IAI COPAI CLKSEL $ PLL Control CME PLLON AUO AOQ PE PCE SCME PLLCL $7 I Control 5 4 3 2 1 ICL $8 COP Control COP SBCK C2 C1 C COPCL *)Force and Bypass $9 FOBYP est $3E $3F $A CCL $B Bit7 Bit Bit5 Bit4 Bit3 Bit2 Bit1 Bit AMCOP *)est Control COP Arm/imer eset 15 1
Prescaler för räknarkretsen k [3:] (OFF) [:4] OSCCLK 1 1 11 1 11 11 111 Ifreq Beräkning av tidbas OSCCLK 8 1 1 y 4 Ifreq x 2 8 1 2 1 OFF 2 1 2 11 2 12 2 13 2 14 2 15 2 1 1 OFF 2x2 1 2x2 11 2x2 12 2x2 13 2x2 14 2x2 15 2x2 1 1 OFF 3x2 1 3x2 11 3x2 12 3x2 13 3x2 14 3x2 15 3x2 1 11 OFF 42 4x2 1 42 4x2 11 42 4x2 12 42 4x2 13 42 4x2 14 42 4x2 15 42 4x2 1 1 OFF 5x2 1 5x2 11 5x2 12 5x2 13 5x2 14 5x2 15 5x2 1 11 OFF x2 1 x2 11 x2 12 x2 13 x2 14 x2 15 x2 1 11 OFF 7x2 1 7x2 11 7x2 12 7x2 13 7x2 14 7x2 15 7x2 1 111 OFF 8x2 1 8x2 11 8x2 12 8x2 13 8x2 14 8x2 15 8x2 1 1 OFF 9x2 1 9x2 11 9x2 12 9x2 13 9x2 14 9x2 15 9x2 1 11 OFF 1x2 1 1x2 11 1x2 12 1x2 13 1x2 14 1x2 15 1x2 1 11 OFF 11x2 1 11x2 11 11x2 12 11x2 13 11x2 14 11x2 15 11x2 1 111 OFF 12x2 1 12x2 11 12x2 12 12x2 13 12x2 14 12x2 15 12x2 1 11 OFF 13x2 1 13x2 11 13x2 12 13x2 13 13x2 14 13x2 15 13x2 1 111 OFF 14x2 1 14x2 11 14x2 12 14x2 13 14x2 14 14x2 15 14x2 1 111 OFF 15x2 1 15x2 11 15x2 12 15x2 13 15x2 14 15x2 15 15x2 1 1111 OFF 1x2 1 1x2 11 1x2 12 1x2 13 1x2 14 1x2 15 1x2 1 (Se även exempel i Stencil 2 ) Den bästa approximationen har vi för = 1 11 = $49, som medför: 1x2 13 = 8192 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 1 / 8192 = 97.5 Hz vilket ger periodtiden:.124 s = 1,24 ms. Klockan kommer alltså att "gå för sakta" som en följd av detta systematiska fel. 17 18.. Program för initiering.. iti i ealtidsklocka k i HCS12, vid avbrott ; Adressdefinitioner CGIN EQU $38 ICL EQU $3B timer_init: ; Initiera C avbrottsfrekvens ; Skriv tidbas för avbrottsintervall till ICL MOVB #$49,ICL ; Aktivera avbrott från CG-modul MOVB #$8,CGIN S 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 ICL MOVB #$1,ICL ; För simulator Algoritm, kvittera avbrott 1. IF = 1 $34 $35 $3 $37 $38 $39 $3A $3B $3C $3D Clock eset Generator (CG) Offset 7 5 4 3 2 1 Mnemonic Namn $ Synthesizer SYN5 SYN4 SYN3 SYN2 SYN1 SYN SYN $1 EFDV EFDV EFDV EFDV eference Divide EFDV 3 2 1 $2 *)est Flags CFLG $3 IF POF LVF LOCKIF LOCK SCMIE SCMIF SCM Flags CGFLG $4 Interrupt Enable IE LOCKIE SCMIE CGIN $5 Clock Select PLLSEL PSP SYSAI OAAI PLLAI CAI IAI COPAI CLKSEL $ PLL Control CME PLLON AUO AOQ PE PCE SCME PLLCL $7 I Control 5 4 3 2 1 ICL $8 COP Control COP SBCK C2 C1 C COPCL *)Force and Bypass $9 FOBYP est $3E $3F $A CCL $B Bit7 Bit Bit5 Bit4 Bit3 Bit2 Bit1 Bit AMCOP *)est Control COP Arm/imer eset 19 2
ealtidsklocka k i HCS12, avbrottshantering t ealtidsklocka k med hög upplösning ; Adressdefinition CGFLG EQU $37 timer_interrupt: ; Kvittera avbrott från C BSE CGFLG,#$8 I ; Avbrottsvektor på plats OG $FFF FDB timer_interrupt Adress (hex) Funktion FFF eal ime Interrupt FFEE Enhanced Capture imer channel FFEC Enhanced Capture imer channel 1 FFEA Enhanced Capture imer channel 2...... FF8E Port P Interrupt FF8C PM Emergency Shutdown FF8A- eserverade FF8 Enhanced Capture imer (EC) En maskincykels noggrannhet EXEMPEL: Arbetstakt= 24 MHz PEIOD = 24 Intervall = 1 ms Noggrannhet = 1/24 sek. 41,7 1-9 sec. 21 22 Programexempel Pulsbreddsmodulering d l (PM) IOS EQU $4 CN EQU $44 IE EQU $4C FLG1 EQU $4E OC_ EQU $5 PEIOD EQU 24 Init: MOVB #1,IOS ; ch är OC MOVB #1,IE ; tillåt IQ LDD CN ; aktuell cykel ADDD #PEIOD ; addera period SD OC_ ; nästa avbrott S OG FDB $FFEE OCirq OCirq : MOVB #1,FLG1 ; kvittera LDD CN ; ny period ADDD #PEIOD SD OC_ I Adress (hex) Funktion FFF eal ime Interrupt FFEE Enhanced Capture imer channel FFEC Enhanced Capture imer channel 1 FFEA Enhanced Capture imer channel 2...... FF8E Port P Interrupt FF8C PM Emergency Shutdown FF8A- eserverade FF8 U U U period dutycycle 1 U out U 2 3 U out U 4 1 U out U 4 dutycycle U out U period Period och duty- cycle är programmerbart 23 24
PM-styrning Control bus Data bus period dutycycle Högtalare, glödlampa element, etc... 8 * 8 bitars eller 4 * 1 bitars räknare period duty cycle PM Continous signal out Power Amplifier 25 2 Programexempel ; PM initiering PME EQU $A PPOL EQU $A1 PMPCLK EQU $A3 PMPE EQU $B4 PMDY EQU $BC ; låg nivå startar period CL PMPOL ; c:a 4 ms periodtid MOVB #$77,PMPCLK ; pwm kanal MOVB #$FF,PMPE ; börja med 8% duty cycle.. MOVB #$D,PMDY ; aktivera kanal MOVB #1,PME Analog-/Digital- it l omvandling 27 28
Programexempel ; AD initiering ; Högerjustera resultat, unipolärt ; kontinuerlig mode (scan), AD kanal MOVB ; upplösning MOVB #$A,ADCL5 #$E5,ADCL4 ; en konverteringssekvens MOVB #$4,ADCL3 Multiplex 8 kanaler. ; normal mode MOVB #$C,ADCL2 ; Vänta tills omvandling klar wad: BCL ADSA,#$8,wAD ; När resultat färdigt, läs LDAB ADDL... 29 3 Seriekommunikation, ik SCI Central Processing Unit Serial to parallel conversion eceive Data: xd Sändare Data buss Mottagare Data buss Parallel to serial conversion ransmit Data: xd Central Serial to parallel ransceiver ransceiver Processing Unit conversion eceive ransmit eceive ransmit Parallel to serial conversion Clock Control CS Data OE Shift Serial data out xd Serial data in xd Clock Control OE Data E Shift Serial transmission i Sändare och mottagares klockor går i samma takt 31 32
S232 överföring av tecknet t z tecknet z representeras av bitmönstret 111 11 (ASCII-tecken). +1 volt volt - 1 volt S A B I idle 1 1 1 1 1 1 idle z minst signifikanta bit först P A I Y B I S O P B I Initiering, i busy-wait Basadress = $C8 Serial Communication Interface (SCI) Algoritm: Offset 7 5 4 3 2 1 Mnemonic Namn Baud ate 1. Initiera $ SB12 SB11 SB1 SB9 SB8 SCIBDH High BAUDAE Baud ate $1 SB7 SB SB5 SB4 SB3 SB2 SB1 SB SCIBDL Low $2 LOOPS SCISAI SC M AKE IL PE P SCIC1 Control 1 2. Aktivera $3 IE CIE IE ILIE E E U SBK SCIC2 ransmitter Control 2 eceiver DE C DF IDLE O NF FE PF $4 SCIS1 Status 1 AF $5 BK13 XDI SCIS2 Status 2 8 Data $ 8 SCIDH High 7 5 4 3 2 1 $7 SCIDL Data Low 7 5 4 3 2 1 SCIBD: EQU $C8 ; SCI baudrate-register t (1 bit). SCIC2: EQU $CB ; SCI styr-register 2. ; Bitdefinitioner, styrregister E: EQU $8 ; ransmitter enable. E: EQU $4 ; eceiver enable. 33 34 Skriv tecken via SCI Läs tecken från SCI Serial Communication Interface (SCI) Offset 7 5 4 3 2 1 Mnemonic Namn Baud ate $ SB12 SB11 SB1 SB9 SB8 SCIBDH High Baud ate $1 SB7 SB SB5 SB4 SB3 SB2 SB1 SB SCIBDL Algoritm: Low DE = $2 LOOPS SCISAI SC M AKE IL PE P SCIC1 Control 1 (ransmit Data $3 IE CIE IE ILIE E E U SBK SCIC2 Control 2 DE C DF IDLE O NF FE PF Empty) $4 SCIS1 Status 1 AF $5 BK13 XDI SCIS2 Status 2 1. Om DE=1 8 SCIDL=tecken Data $ 8 SCIDH High 7 5 4 3 2 1 $7 SCIDL Data Low 7 5 4 3 2 1 Algoritm: DF = (eceive Data Full) 1. Om DF =1 tecken=scidl Serial Communication Interface (SCI) Offset 7 5 4 3 2 1 Mnemonic Namn $ Baud ate SB12 SB11 SB1 SB9 SB8 SCIBDH High $1 Baud ate SB7 SB SB5 SB4 SB3 SB2 SB1 SB SCIBDL Low $2 LOOPS SCISAI SC M AKE IL PE P SCIC1 Control 1 $3 IE CIE IE ILIE E E U SBK SCIC2 Control 2 $4 DE C DF IDLE O NF FE PF SCIS1 Status 1 $5 AF BK13 XDI SCIS2 Status 2 $ 8 Data 8 SCIDH High $7 7 5 4 3 2 1 7 5 4 3 2 1 SCIDL Data Low SCIS1: EQU $CC ; SCI status-register t t 1. SCIDL: EQU $CF ; SCI data-register låg byte. ; Bitdefinitioner, statusregister DE: EQU $8 ; ransmit data register empty status bit. SCIS1: EQU $CC ; SCI status-register t t 1. SCIDL: EQU $CF ; SCI data-register låg byte. ; Bitdefinitioner, statusregister DF: equ $2 ; eceive data register full status bit. 35 3
Bestämma Baudrate-värde äd 9 57 25 PLLCLK B 1 baudrate 48 1 312,5 1 9 48 1 52,8333 1 57 PLLCLK baudrate 1 B 48 1 915 1 312 48 1 5792 1 52 48 1 48 1 11,71875 25 1 25 1 12 Eclock: EQU 8 ; 8 MHz ; Baudate register värden, baserad på PLL-klocka Baud9: EQU (Eclock/(1*9)), 48 1 9585 1 313 Programmet... ; enkelt testprogram OG $1 JS serial_init Loop: JS in ; "eka" tecken JS out BA loop ; OU tecken rutin ; Skriv tecken till SCI ; Inparameter, register B: tecken. out: BCL SCIS1,#DE,out ; vänta till DF=1 SAB SCIDL ; skicka k tecken... S ; IN tecken rutin ; Läs tecken från SCI ; eturnera i register B in: BCL SCIS1,#DF,in ; vänta till DF=1 LDAB SCIDL ; läs tecken S 37 38