Tips & Tricks - PIC

 

RA5 in 16F18313


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);
 }
}


 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 11/04/24.