CIRCUITO DI TEST E SOFTWARE UTILIZZATI Circuito di Test Nello schema elettrico di figura A è rappresentato un circuito, realizzabile anche senza l ausilio di un circuito stampato, che consente di testare alcune delle possibilità offerte dal Microcontrollore PIC 16C54. Come si può osservare si è utilizzato un oscillatore a quarzo (XT type). I pin RTCC e MCLR sono stati disabilitati, per mezzo di una resistenza di pull-up da 4,7K. La porta A del microcontrollore viene utilizzata come input. Un dip switch a quattro posizioni consente di configurare 16 possibili combinazioni in ingresso. La porta B del microcontrollore viene utilizzata come output. Ciascun porto di uscita è collegato a un buffer costituito da un transistor il quale fornisce la corrente di pilotaggio necessaria ad accendere un diodo led. Ciò è stato fatto per non caricare le uscite del microcontrollore, poiché la massima corrente di uscita di ogni porto di I/O é dello stesso ordine di grandezza della corrente necessaria al pilotaggio di un led. La capacità C3, che costituisce un filtro di alimentazione per il microcontrollore e inibisce fenomeni di auto oscillazione. Tale capacità è efficace solo se montata nelle vicinanze dei pin di alimentazione del controllore. Il circuito descritto, anche se molto semplice, consente di testare programmi anche discretamente complessi. Di seguito si riportano i programmi che sono stati testati sul circuito realizzato. La routine delay ha un ritardo di circa 1 secondo con un quarzo da 4MHz. 0
Figura A 1
TITLE 'lampeggio di un led (LED2.ASM)' LIST P=16C54 ;device scelto SET_P_B EQU 000H SET_P_A EQU 00FH TIM0 EQU 79H ;50mS = 79H TIM1 EQU 10H ;1 SECONDO = 10H F25 EQU 19H ;RITARDO 1 SECONDO F26 EQU 1AH ;RITARDO 1 SECONDO F27 EQU 1BH ;RITARDO 1 SECONDO PORT_A EQU 5 PORT_B EQU 6 ORG 0 OPTION ;ROUTINE DI RITARDO 1 S DELAY1 MOVLW TIM1 MOVWF F25 DEL2S MOVLW TIM0 MOVWF F26 DEL2A MOVWF F27 DEL2B DECFSZ F27 GOTO DEL2B DECFSZ F26 GOTO DEL2A DECFSZ F25 GOTO DEL2S RETLW 0 MAIN MOVLW SET_P_A TRIS PORT_A MOVLW SET_P_B TRIS PORT_B MOVWF PORT_B ;PORTA A, definizione I/O ;A0..A3 IN A4..A7 OUT ;PORTA B, definizione di I/O (B = OUT) ;tutti i pin di B a zero MAIN1 BTFSC PORT_B,0 ;testa porta B bit 0, ;skippa se zero GOTO SETTA ;vai a SETTA BSF PORT_B,0 ;setta a 1 bit 0 di porta B CALL DELAY1 ;ritardo di un secondo GOTO MAIN1 ;torna a MAIN1 SETTA BCF PORT_B,0 CALL DELAY1 GOTO MAIN1 ;setta a 0 bit 0 di porta B ;torna a MAIN1 DATA "LAMPEGGIO DI UN LED" ORG 01FFh GOTO MAIN END 2
TITLE 'scansione dei led (LED3.ASM)' LIST P=16C54 ;device scelto STATUS EQU 003H ;RIDENOMINAZIONE DEL REGISTRO DI STATO SET_P_B EQU 000H TIM0 EQU 79H ;50mS = 79H TIM1 EQU 10H ;1 SECONDO = 10H F25 EQU 19H ;RITARDO 1 SECONDO F26 EQU 1AH ;RITARDO 1 SECONDO F27 EQU 1BH ;RITARDO 1 SECONDO PORT_B EQU 6 LED EQU 1 ;00000001 ORG 0 OPTION ;ROUTINE DI RITARDO 1 S DELAY1 MOVLW TIM1 MOVWF F25 DEL2S MOVLW TIM0 MOVWF F26 DEL2A MOVWF F27 DEL2B DECFSZ F27 GOTO DEL2B DECFSZ F26 GOTO DEL2A DECFSZ F25 GOTO DEL2S RETLW 0 Per le istruzioni di rotazione (RRF,RLF) il BIT C del registro di stato è caricato con l' uno o l'altro dei BIT più o meno significativi del registro sorgente. MAIN MOVLW SET_P_B ;CARICA IN W IL CONTENUTO DI SET_P_B TRIS PORT_B ;PORTA B, definita come uscita CLRW ;AZZERA W MOVWF PORT_B ;AZZERA LE USCITE DELLA PORTA B; MAIN1 MOVLW LED ;CARICA IN W IL CONTENUTO DI LED MOVWF PORT_B ;SPOSTA DA W A PORT_B CICLE RLF PORT_B,1 ;RUOTA A SINISTRA PORT_B BCF PORT_B,0 ;IL BIT 0 DELLA PORTA B E' POSTO A ZERO BTFSS PORT_B,7 ;CONTROLLA IL BIT 7 DI PORT_B GOTO CICLE ;VAI A CICLE CICLE1 RRF PORT_B,1 ;RUOTA A DESTRA PORT_B BTFSS PORT_B,0 ;CONTROLLA IL BIT 0 DI PORT_B GOTO CICLE1 ;VAI A CICLE1 GOTO CICLE ;VAI A CICLE ; ; ORG 01FFH ; ; GOTO MAIN 3
END ; In the Demo board, PORTB is connected to 8 LEDs. (TASTO.ASM) ; RA1 is connected to a switch (S3). ; This program increments the file register ;count each time S3 is pressed. ; The value of count is displayed on the LEDs conected to PORTB. ; Net result is that LEDs should increment in a binary manner every time S3 is ; pressed. list p=16c54, f=inhx8m PIC54 equ 1FFH ; Define Reset Vectors PORT_A equ 5h PORT_B equ 6h ; I/O Port Assignments COUNT equ 010H org 00h Start movlw 0FFH ; W=FFh (*) tris PORT_A ; config port A as input (*) movlw 0 tris PORT_B ; config port B as output movwf PORT_B ; port B set to zero clrf COUNT ; clear register count Loop btfss PORT_A,1 ; see if RA1 pressed goto IncCount ; yes then inc count Endloop goto Loop ; else check again IncCount incf COUNT movf COUNT,w ; placed COUNT in W movwf PORT_B ; display on port b Debounce btfss PORT_A,1 ; wait for key release goto Debounce ; not release then wait Enddebounce goto Loop ; else check key press again org PIC54 ; reset vector goto Start end ; I registri di I/O possono essere scritti e letti sotto il controllo del ; programma similmente agli altri registri per uso generale. ; Comunque le istruzioni di lettura (come MOVF PORTB,W) leggono SEMPRE i ; PIN di I/O nonostante che un PIN sia definito come INPUT o come OUTPUT. ; Dopo una condizione di RESET tutte le porte di I/O sono definite come ; in ingresso (e dunque in alta impedenza), cosi come i registri di ; controllo I/O (TRIS A, TRIS B e TRIS C) sono tutti posti a uno. ; L'esecuzione di un TRIS f con i corrispondenti 0 nel registro W é ; indispensabile per definire gli I/O in uscita. Mentre non lo è per ; definire gli I/O in ingresso (nel programma esposto sopra le linee (*) ; si possono omettere. 4