Tentamen Enchipsdatorer med tillämpningar Lösningar och kommentarer Program: Elektroteknik Datum: 04-01-09 Tid: 08:00-13:00 Lokal: E103 Hjälpmedel: Linjal, miniräknare, Datablad: MC60705 och PIC16F84 (Utdelas och återlämnas.) Bilaga: Include-fil för PIC16F84 Examinator: Anders Arvidsson Telefon: 036-15 61 12, 0707-76 28 86 Examinatorn besöker tentamen (efter ca halva tentamenstiden). Uppgifterna i del A redovisas direkt i frågebladet eller på separat ark, vilka då ska numreras och hänvisas till från uppgiftsbladet. Uppgifterna i del B redovisas enbart på separat ark. Max poäng: 25 Betyg Poäng 3 10 4 15 5 20 1 (8)
Tentamensfrågor, del A Redovisa svaren direkt i frågebladet. Med PIC:en avses nedan PIC16F84 och med 705:an avses MC68705P3. Inga include-filer eller deklarationer förutsätts gjorda om inget annat anges. 1. Beskriv, i binär form, vad som ligger i adress 20 samt Working register efter att följande instruktioner exekverats i PIC:en. (1 rätt => 1 p.) (3 p) Adress 20: 11101011 W: 11101100 MOVLW.20 MOVWF.20 COMF.20,1 ;,1 => Spara på adress 20 INCF.20,0 ;,0 => Spara i W 2. Mikrodatorer baserade på von Neumann arkitektur brukar exekvera med hjälp av mikrokod. Redogör kortfattat för hur exekvering med mikrokod går till. (2 p) I processorns exekveringsenhet finns ett mikroprogramminne som innehåller mikroinstruktioner, d v s mikrokod. En assemblerinstruktion hämtas av mikrokod, och utgör sedan, efter avkodning, i princip startadressen för mikroinstruktioner i mikroprogramminnet. En assemblerintruktion exekveras sålunda genom ett flertal mikroinstruktioner tills hela instruktionen är klar. Hur många mikroinstruktioner som åtgår beror av assemblerinstruktionens komplexitet. 2 (8)
3. Redogör kortfattat för principerna för hur Brown-out detect och Watchdog fungerar, samt vilka problem de löser. (1 rätt => 1 p) (3 p) Brown out detect Resettar processorn om matningsspänningen faller under en bestämd punkt. Utan denna funktion riskerar spänningsfall, som inte leder till att den normala resetkretsen triggar, att leda till felaktig exekvering, t ex genom att data i RAM-minnet förstörs. Watchdog Resettar processorn efter en viss tid, om processorn inte resettar watchdogen först. Om programmet hänger sig, t ex hamnar i en oavsiktlig evig loop, eller spårar ur, resettar processorn inte watchdogen och kommer att startas om. Förhoppningsvis inträffar inte hängningen alltför snart igen. 4. Några instruktioner i PIC-processorn kan ta olika lång tid att exekvera beroende på resultatet. Ge ett exempel på en sådan instruktion och redogör för när den tar längre tid att exekvera. Förklara också varför processorn behöver mer tid i dessa situationer. (2 p) Ett exempel på en sådan instruktion är DECFSZ. Den tar längre tid att utföra när file blir 0 och hopp utförs. Detta beror på att den instruktion som ligger i pipeline (den direkt efter DECFSZ) nu inte kommer att utföras och en annan instruktion måste hämtas. 3 (8)
5. Nedan visas två subrutiner skrivna för PIC:en respektive 705:an. Analysera rutinerna och fyll i tabellen nedan. Flaggornas status och arbetsregistrens innehåll ska anges efter att återhopp utförts. Arbetsregistrens innehåll anges decimalt. (Fyra korrekta svar ger 3 p / processor). (6 p) Rutin för PIC:en ORG.10 PICSub movlw.250 addlw.10 btfsc.3,0 addlw.1 addlw 0x0F xorlw 0x55 return Rutin för 705:an MCSub: LDA #253 ADD #2 INC A BCC MC2 SUB #20 MC2: CLI NOP RTS Efterfrågad uppgift PIC:en 705:an Programminne som åtgår 7 Word 12 Byte Exekveringstid 8 Cykler 22 Cykler Arbetsregistrets innehåll W = 65 ACC = 0 Flaggors status Z = 0 DC = 1 C = 0 H = 0 I = 0 N = 0 Z = 1 C = 0 4 (8)
Del B Redovisa svaren på separat papper. Programmen ska delas in i block och förses med beskrivande kommentarer. Rörig (svårläst) struktur ger poängavdrag. Påbörja ny uppgift på nytt ark. 6. Nedan visas en deklaration av en variabel (array) i 705:an. (Var i minnet den ligger är okänt.) ARR DS 25 Skriv en subrutin som nollställer variabeln (dvs hela arrayen). Subrutinen får max ta 20 rader. Ange i subrutinens huvud vilka variabler som behöver deklareras (vid behov). (3 p) Clr_RAM: LDX #ARR ;X pekar p ARR Clr_L: CLR,X ;Nollställ RAM CPX #ARR+24 ;Jämför med sista RAM BEQ Clr_End ;Avsluta om sista adressen INC X ;Peka på nästa RAM BRA Clr_L ;Clr_Loop Clr_End: RTS 5 (8)
7. Skriv ett fullständigt (= exekverbart) program för 705:an som vid negativ flank på INTpinnen hoppar till en avbrottsrutin. Denna rutin ska öka port B (utgång) med 1. I övrigt består programmet endast av initiering och därefter evig loop. MOR ska konfigureras för kristall. Inga deklarationer får förutsättas vara gjorda. (3 p) Lösningsförslag: ;***Program som adderar 1 till port B när INT går låg ;***Deklarationer av register PORTB EQU 1 DDRB EQU 5 ;*** Program ;* Initiering ORG $80 ;Här börjar programminnet INIT: LDA #255 STA DDRB ;Port B utg ng CLI ;* Huvudprogram MAIN: BRA MAIN ;Evig loop ;Clear Interrupt Mask Bit ;=> till t avbrott ;* Interruptrutin ISR_INT: INC PORTB ;PORTB = PORTB + 1 RTI ;Return from Interrupt ;*** MOR ;*** INT ORG 1924 DB 0 ;Konfigurera MOR för kristall ORG 2042 DW ISR_INT ;Hoppa till adressen ISR_INT vid ;INT-avbrott ;*** Resetvektor ORG 2046 DW INIT ;Hoppa till adressen INIT vid reset END 6 (8)
8. Skriv ett fullständigt program för PIC16F84, klockad med 4 MHz, så den kan hålla någorlunda konstant varvtal på en motor med metoden beskriven nedan. Motorn effektregleras i 10 steg med en PWM-signal med frekvensen 1000 Hz. En etta läggs på Port A, pinne 0, under 1/10 10/10 av tiden. Motorn har inbyggd hastighetsgivare med elektronik som signalerar till PICens Port A, bit 2 och 3 (ingångar), enligt nedan. Hastigheten är lagom: RA2 = 0 RA3 = 0 Hastigheten är för låg: RA2 = 1 RA3 = 0 Hastigheten är för hög: RA2 = 0 RA3 = 1 Om hastigheten är för låg ska effekten justeras upp 1/10 och är den för hög ska hastigheten justeras ner 1/10, dock ska den hållas inom 1/10 10/10 oavsett fel. För att reglerloopen ska bli lagom snabb ska hastigheten justeras var 10:e millisekund. Toleransen för PWM-signalens frekvens är 10%. PWM-pulsens bredd får aldrig variera mer än 10 µs mellan två cykler med samma avsedda pulsbredd, men om t ex 3/10 blir något mer, t ex 3,3/10 (varje gång) spelar inte så stor roll eftersom reglering med återkoppling sker. Skriv gärna subrutiner på olika ark så blir det mindre att skriva om när du hittar en bugg. Det kan underlätta att börja med att rita en skiss där tider mm anges. P16F84.INC (se bilaga) kan inkluderas. (3 p) Då få var anmälda till tentan, och ännu färre brukar försöka lösa sista uppgiften på tredje tentan, lämnas ingen lösning. Istället kommenteras inlämnade uppgifter lite extra. Hur PWM kan genereras med interrupt framgår dock av HT-tentan för systemkonstruktion 2003/2004. Se www.hj.se/~kmetoder. Hur interrupt skrivs i assembler framgår av ordinarie tentamen i Enchipsdatorer 2002, uppgift 10. 7 (8)
Bilaga, include-fil till PIC P16F84.INC W EQU H'0000' F EQU H'0001' ;----- Register Files ----- INDF EQU H'0000' TMR0 EQU H'0001' PCL EQU H'0002' STATUS EQU H'0003' FSR EQU H'0004' PORTA EQU H'0005' PORTB EQU H'0006' EEDATA EQU H'0008' EEADR EQU H'0009' PCLATH EQU H'000A' INTCON EQU H'000B' OPTION_REG EQU H'0081' TRISA EQU H'0085' TRISB EQU H'0086' EECON1 EQU H'0088' EECON2 EQU H'0089' ;----- STATUS Bits ----- IRP EQU H'0007' RP1 EQU H'0006' RP0 EQU H'0005' NOT_TO EQU H'0004' NOT_PD EQU H'0003' Z EQU H'0002' DC EQU H'0001' C EQU H'0000' ;----- INTCON Bits ----- GIE EQU H'0007' EEIE EQU H'0006' T0IE EQU H'0005' INTE EQU H'0004' RBIE EQU H'0003' T0IF EQU H'0002' INTF EQU H'0001' RBIF EQU H'0000' ;----- OPTION Bits ----- NOT_RBPU EQU H'0007' INTEDG EQU H'0006' T0CS EQU H'0005' T0SE EQU H'0004' PSA EQU H'0003' PS2 EQU H'0002' PS1 EQU H'0001' PS0 EQU H'0000' 8 (8)