gestione porte PIC

  • Federico_d
  • Autore della discussione
  • Nuovo Utente
  • Nuovo Utente
Di più
5 Anni 9 Mesi fa #1 da Federico_d
gestione porte PIC è stato creato da Federico_d
Buongiorno,
come ho scritto nella mia presentazione, sto iniziando a fare i primi esperimenti con un PIC 18F2550 per prendere confidenza col workflow: MPLAB-X 5.2 - PIC Kit 4 - MCU. Ho notato che dopo aver programmato il PIC, se stacco il programmatore e le porte PGD e PGC rimangono "floating", il micro non funziona correttamente. Quindi ho provato a mettere un resistore di pull-down e successivamente ho tolto il resistore e settato le due porte in OUTPUT/LOW. In entrambi i casi tutto sembra funzionare. E' prassi corretta mettere in down queste porte, o ci sono altri accorgimenti che non conosco ?
Grazie,e buona giornata a tutti.
Federico

Non si può essere sicuri di nulla. Ne sono assolutamente certo!

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Cosimix
  • Elit Utente
  • Elit Utente
Di più
5 Anni 9 Mesi fa #2 da Cosimix
Risposta da Cosimix al topic gestione porte PIC
Buon pomeriggio!

Cosa fa il micro per non funzionare correttamente?

E' buona regola avere il controllo di tutti i pin del micro, anche di quelli non utilizzati. Se dai un'occhiata agli esempi del testo XC8 Step by Step, troverai sempre delle configurazioni del tipo
Code:
LATB = 0x00; TRISB = 0xFF;

In genere si consiglia di impostare i pin non utilizzati come input e, se hai spazio e resistori da consumare, non è sbagliato collegare questi ultimi verso massa (oppure collegando i pin direttamente a massa), evitando di lasciarli floating. Il motivo è legato ad un discorso di consumi e di interferenze che il micro potrebbe captare. Ovviamente dipende dal tipo di applicazione.. Se il circuito andrà in orbita grazie ad un razzo di Elon Musk (tra l'altro il prossimo partirà tra qualche ora) allora è il caso di prendere qualche accorgimento.
Per chi proviene da Arduino è normale porsi la tua domanda perché in ambiente Arduino in genere si impostano solo i pin di interesse attraverso la funzione pinMode(), mentre tutti gli altri di default vengono impostati come input.

Saluti,
Cosimo

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
5 Anni 9 Mesi fa #3 da Mauro Laurenti
Risposta da Mauro Laurenti al topic gestione porte PIC
Salve Federico,

a meno che tu non stia in fase di debug, quando stacchi il programmatore deve funzionare.
Non ci deve essere l'esigenza di collegare PGD e PGC a massa.

Quale schema elettrico stai utilizzando?

Saluti,

Mauro

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
5 Anni 9 Mesi fa #4 da Mauro Laurenti
Risposta da Mauro Laurenti al topic gestione porte PIC
...abbiamo scritto in contemporanea.

Quello che è strano è che non funziona quando stacchi il programmatore.

I miei dubbi sono sulla linea MCLR ed eventualmente il watchdog interno (da disabilitare).

Saluti,

Mauro

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Federico_d
  • Autore della discussione
  • Nuovo Utente
  • Nuovo Utente
Di più
5 Anni 9 Mesi fa #5 da Federico_d
Risposta da Federico_d al topic gestione porte PIC
Posterò lo schema elettrico appena possibile, lo devo disegnare. Nel frattempo aggiungo che il programma fa banalmente lampeggiare un led. Il non-funzionamento si manifesta così: se stacco il PK4 quando il led è spento, questo rimane spento. Se lo stacco a led acceso, questo inizia a sfarfallare esattamente a 50 Hz, misurati da oscilloscopio. Cosa che ovviamente non so spiegare. Mettendo a massa le due suddette porte il led inzia a lampeggiare come mi aspetto. Il pic è impostato per funzionare con l'oscillatore interno a 8 MHz.
Ecco il codice.

#include <stdio.h>
#include <stdlib.h>
#include <pic18f2550.h>
#include <xc.h>

#define DELAY_VALUE 50000
#define FOREVER 1
#pragma config WDT = OFF // Watchdog Timer Enable bit
#pragma config FOSC = INTOSC_EC

int main(int argc, char** argv) {

unsigned long counter = DELAY_VALUE;

TRISA = 0b0000; // set PORTA full output
TRISB = 0b0000; // set PORTB full output
OSCCONbits.IRCF = 0b111; // set internal clock to 8 MHz
PORTBbits.RB6 = 0; // set PGC to down
PORTBbits.RB7 = 0; // set PGD to down

while (FOREVER) {

while(counter)
{
counter--;
}
counter = DELAY_VALUE;

LATAbits.LATA0 = ~LATAbits.LATA0;

}

return (EXIT_SUCCESS);
}

Non si può essere sicuri di nulla. Ne sono assolutamente certo!

Si prega Accesso o Crea un account a partecipare alla conversazione.

Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Forum - Ultimi messaggi