Le stesse considerazioni valgono per i PIC della famiglia 16F183xx
(16F18323/324/325/326 a 14 pin e /344/345/346 a 20 pin) che hanno tutti in
comune lo stesso modulo oscillatore, così pure in generale, i modelli
16F18xxx che hanno oscillatori simili.
RA5 non funziona...
Un caso che è
venuto all'attenzione dei forum è quello che suona così: "Con il
16F18313... ho fatto tutto quello che serve e il LED su RA5 non lampeggia
neanche per sbaglio...". Non sempre si trovano risposte
sensate.
E se vi rivolgeste al costruttore, sareste tacciati di non aver letto il volume
foglio dati...
Ed effettivamente è così: la risposta è chiaramente leggibile nel foglio
dati, in una delle sue 471 pagine !
Il fatto è che la
causa del problema è al di fuori delle normali aspettative e non
immediatamente individuabile.
Si tratta di questo: in questo PIC, RC5 per default non è un I/O
"normale", ma è l'ingresso dell'oscillatore esterno OSC1.
Così, se voglio utilizzare RC5 come normale I/O, devo escludere questa
funzione di default o "Basic".
E questo è possibile non da uno special function
register, ma solo dalla configurazione iniziale.
Se osserviamo la TABLE 1,
vediamo la situazione delle allocazioni delle varie funzioni integrate
rispetto ai pin.
Dato che negli Enhanced, al default, le funzioni sono disattivate, ci dobbiamo preoccupare solo
di quanto decidiamo di usare.
Se ci limitiamo ad una lettura superficiale della tabella, RA4
e RA5 sono i soliti I/O. Basterà
disabilitare AN4 e AN5 per usarli come digitali.
E qui sta il problema: RA4 e RA5
sono anche CLKOUT e CLKIN.
Normalmente CLKOUT è comune a tutti i
chip, quindi è noto che per usare il pin, devo mettere nel config CLKOUT=OFF
per liberare RA4.
E se non mi interessano oscillatori esterni, non ho altro da fare. Non,
però, in questo caso dove è "Basic" anche il CLKIN,
il che impedisce l'uso del corrispondente pin RA5
come digitale.
Lo vediamo in un'altra tabella.
Qui possiamo rilevare che l'oscillatore di default è scelto dai bit FEXTOSC<2:0>:
il valore di default di questi bit è 111,
ovvero viene selezionato un clock esterno ECH. Ecco che RA5
è l'ingresso di tale oscillatore !
Per liberare RA5 dobbiamo
configurare FEXTOSC<2:0>=100 , disabilitando
la funzione, il che equivale a FEXTOSC=OFF nel
Config.
Intendiamoci: non c'è niente di strano nel fatto che alcuni pin abbiano una
allocazione Basic.
Quello che ha creato il problema è la struttura del clock che è centrata
sull'uso di oscillatori esterni e rende Basic anche l'ingresso di
questi, cosa non comune nei PIC più datati.
Altri pin Basic.
Gli altri pin "Basic" sono comuni ai PIC.
-
RA3 è di default MCLR. Disabilitando la funzione si ottiene
l'I/O. L'azione è il solito: MCLRE = OFF
-
RA<1:0> sono i
pin della comunicazione ICSP/ICD. Normalmente sono I/O, ma diventano accessi
ICSP/ICD sotto controllo dell'ambiente di sviluppo.
-
In CONFIG, l'opzione DEBUG non va toccata e
lasciata a 1, come da default. E' gestita in automatico dall'ambiente di
sviluppo e dai suoi tool.
RC5 lampeggia!!
Ecco un breve esempio:
// LED collegato a RA5 lampeggia
// RA3 e RA4 come I/O
// clock interno da 1 MHz
// 16F18313
#include <xc.h>
#define _XTAL_FREQ 1000000
// clock 1MHz
#define LED LATA5
#pragma config
FEXTOSC = OFF // usa RC5 - EXTOSC disabilitato
#pragma config RSTOSC = HFINT1 // HFINTOSC (1MHz)
#pragma config CLKOUTEN = OFF // Usa RA4 CLKOUT
disabilitato
#pragma config CSWEN = ON
// modifiche clock con NOSC NDIV
#pragma config FCMEN = OFF // no fail-safe
#pragma config MCLRE = OFF //
Usa RA3, no MCLR
#pragma config PWRTE = ON // PWRT abilitato
#pragma config WDTE = OFF // no watchdog
#pragma config LPBOREN = OFF // no BOR a basso consumo
#pragma config BOREN = OFF // no Brown-out
#pragma config BORV = LOW // (Vbor) 2,45 V
#pragma config PPS1WAY = OFF // modifiche funzione PPS abilitata
#pragma config STVREN = ON // errore overflow dello
stack abilitato
#pragma config WRT = OFF // no protezione
scrittura area ROM
#pragma config LVP = OFF // no programmazione
a bassa tensione
#pragma config CP = OFF // no protezione
area ROM
#pragma config CPD = OFF // no protezione
area EEPROM
void main(void) {
ANSELA =
0;
// no analogiche
TRISA
= 0b011111;
// RA5 out
while(1){
// ciclo di lampeggio
LED = !LED;
__delay_ms(500);
}
}
|