Corso di programmazione per microcontrollori ST626X. Sesta puntata 3/3

Corso di programmazione per microcontrollori ST626X.

Bene, abbiamo terminato anche la descrizione del secondo timer. Proseguiamo il Corso con un semplice esempio sul funzionamento del timer AR. Realizzeremo un programma in grado di generare un segnale squadrato in uscita dal piedino ARTIMout col quale pilotare un piccolo buzzer. Il micro avrà come ingressi due pulsanti per modificare a piacere il periodo del segnale in uscita e di conseguenza il suono del buzzer che diventerà più acuto o, al contrario, più grave.

Procediamo, come al solito, tracciando dapprima una rappresentazione a blocchi del programma e successivamente digitando tutte le istruzioni necessarie all’interno di un file ASCII. Un esempio di listato di programma adatto a questa applicazione (MF40.ASM) è riportato nell’articolo. Come si può notare, per prima cosa vengono definiti i vari registri e le celle RAM mediante delle sigle di facile memorizzazione. Allo scopo utilizziamo la direttiva “.DEF”.

diagramma_flusso_programma_mf40

Successivamente, occorre scrivere nelle locazioni dei vettori le istruzioni che la CPU dovrà eseguire durante le interruzioni. Nel nostro listato l’unica interrupt utilizzata è quella di “reset”, cioè quella causata dal pin Reset o dalla logica POR (Power On Reset) all’atto della prima accensione. La CPU in questa fase esegue un salto incondizionato (JP RESET) alla label “RESET” dove trova la prima istruzione della memoria programma. Tale istruzione deve essere ovviamente memorizzata nella prima cella di memoria programma (nel nostro caso la 80 hex) e per fare ciò occorre utilizzare la direttiva “.ORG”.

A questo punto, con l’istruzione “RETI” indichiamo alla CPU che l’interruzione causata dal reset è terminata. Procediamo ora all’inizializzazione delle porte di ingresso e uscita: nella nostra applicazione vengono usate solo tre linee di I/O. Per la precisione, la linea PB7 che risulta collegata al buzzer e le linee PA5 e PA6 che sono collegate rispettivamente al pulsante “+” e al pulsante “-”. Il PB7 viene inizializzato come uscita di tipo push-pull mentre le altre due linee funzionano come ingressi dotati di resistore di pull-up.

Inizializziamo di seguito anche il timer auto-ricaricabile mediante la subroutine denominata “INIB”. Selezioniamo un fattore di prescaler uguale a 32, disabilitiamo l’ingresso di clock sul piedino ARTIMin e abilitiamo, invece, un clock del timer AR uguale al clock interno del micro diviso per tre. Allo scopo, agiamo sul registro ARSC1 in cui trasferiamo il numero binario 10100001 con l’istruzione: “LDI (Load Immediate)”. Inizializziamo ora il registro ARCP “Compare” al cui interno scriviamo il numero F0 hex e il registro ARRC “Reload-Capture” in cui trasferiamo il numero tre. Il modo di funzionamento del timer AR deve essere, nel nostro caso, auto-ricaricabile. Azzeriamo perciò i bit ARMC0 e ARMC1 e abilitiamo l’uscita PWM sul piedino ARTIMout settando il bit PWMOE.

Carichiamo il contatore con il contenuto di ARRC e diamo il via al conteggio portando a uno il bit TEN. Tutte queste inizializzazioni possono essere eseguite con le istruzioni di “SET” e “RES” dei bit in oggetto oppure, molto più semplicemente e come appare nel listato, con un trasferimento immediato di un numero all’interno del registro con l’istruzione: “LDI ARMC,#11100000B”. Terminata questa fase, occorre scrivere il programma principale che come si può notare è di estrema semplicità. La CPU deve solo testare in loop, ovvero ciclicamente, lo stato dei due pulsanti: “+” e “-”. Premendo il “+” andremo ad incrementare di due il valore del registro ARRC, mentre premendo il meno lo decrementiamo, sempre a passi di due. Questo compito è svolto da due subroutine denominate: “INCB” e “DECB”.

La CPU prima di abbandonare le due subruotine deve attendere sia il rilascio del tasto sia la fine dei rimbalzi delle lamelle del pulsante. Allo scopo, viene richiamata la subroutine “D50ms” in cui si costringe il micro a compiere una serie di loop della durata appunto di 50 millisecondi. Bene, procediamo ora all’assemblaggio del file sorgente, il .ASM per intenderci, e alla conseguente creazione del file oggetto atto ad essere memorizzato nel chip. Invochiamo da MS-DOS l’assemblatore (digitando: AST6 MF40.ASM) e successivamente il programmatore (digitando: ST626XPG). Trasferiamo ora il file MF40.HEX nel buffer del Computer con l’istruzione “LOAD” e di seguito programmiamo il micro con la “PRG”. Togliamo alimentazione alla basetta di programmazione dello Starter Kit, spostiamo i due jumper di W1 nella posizione “USER” e rialimentiamo la piastra.

Se tutto funziona correttamente il buzzer emetterà dopo qualche istante una nota continua. Proviamo a premere più volte il pulsante “+”: la nota del buzzer diventerà sempre più acuta. Premiamo ora qualche volta il pulsante “-” per constatare che la nota diventi invece più grave. Bene, il gioco è fatto e il nostro timer AR funziona a dovere. L’esempio che abbiamo proposto è molto semplice ma in compenso speriamo sia servito allo scopo, ovvero a comprendere il funzionamento del timer AR. In ogni caso, per approfondire l’argomento timer consigliamo di consultare anche gli esempi riportati nel dischetto dello Starter Kit dove si può constatare quanto sia semplice e veloce creare un orologio (RTCST6.ASM) oppure una melodia (MUSIC.ASM).

Il kit è disponibile da Futura Elettronica

Tags:

Leave a Reply