Pagina 1 di 2

PIC16F877 + Potenziometro + PWMout: in alto mare

MessaggioInviato: 20 set 2013, 10:54
da densha
Ciao a tutti,

sto provando ad avvicinarmi ai PIC e la loro configurazione/programmazione.
A disposizione ho un PIC16F877 e vorrei iniziare a fargli generare un PWM controllato da un potenziometro (ne ho uno da 10K).

Per il lato FW ho trovato e seguito questo thread:

http://www.electroyou.it/forum/viewtopic.php?f=17&t=24820

che ho semplificato eliminando la gestione del secondo PWM.

Codice: Seleziona tutto

#include <PIC.h>
#include <stdio.h>

int main(void)
{
   int ang; //

   TRISC=0; //PORTC tutte uscite per il PWM

   TRISA=0b00101111; // Porte A analogiche come ingressi

   TRISD=0;//Porte D come uscite
   PORTD=0;//Porte D tutte a zero

   T2CON=4; //Timer2 acceso con prescaler a 1
   CCP1CON=12; //Modulo CCP1 settato in modalita' PWM

   PR2=0xFF; //Step massimo del duty cycle (e frequenza)

   ADCON0 = 0b01000101; //attiva porte analogiche con Fosc/8: 5MHz e lettura su AN0
   ADCON1= 0b10001110;

   while(1)
   {
      CHS0=0; // seleziona la porta da leggere (AN0)
      ADCON0bits.GO = 1;  //Fa partire la conversione
      while (ADCON0bits.GO);  //Attende che la conversione sia completa
      ang = ADRESL+(ADRESH<<8); // risultato a 10 bit
      CCPR1L=ang/4; //duty cycle CCP1

   }
}


Per il lato HW:

- ho collegato la 5V e massa al micro;
- ho collegato la 5V al pin di reset (MCLR) tramite una resistenza da 4K7
- ho collegato l'uscita del potenziometro al pin di ingresso analogico AN0

Leggendo l'uscita sul pin CCP1, non vedo nessun segnale uscente così sto sbattendo la testa sul reference manual ma non riesco ad uscirne...

Step successivo è stato collegare un risuonatore ceramico a 3 pin da 4MHz tra i 2 pin del micro dedicati (visto che non son riuscito a capire se di oscillatore ce ne sia uno integrato o meno...) ma nessun cambiamento...

Nella maniera più umile possibile, vi chiedo qualche dritta :oops:

[EDIT]: scusate, dimenticavo un'informazione (credo) importante.
Come ambiente FW utilizzo MPLAB X IDE(v.190) e come compilatore l'XC8

Re: PIC16F877 + Potenziometro + PWMout: in alto mare

MessaggioInviato: 20 set 2013, 11:20
da c1b8
Il 16F877 non ha oscillatore interno, ne serve uno esterno.

Così a prima vista non vedo nulla di strano.
Farei le seguenti verifiche:
1) che l'oscillatore esterno funzioni
2) come imposti i fuses del micro in programmazione
3) che l'ingresso AN0 non sia sempre a 0V
4) prova a scrivere il risultato della lettura dal ADC in uscita su una porta (es. la B) per vedere se i valori combiano cambiando la posizione del potenziomentro.


EDIT: Mi sono permesso di spostare l'argomento nell'apposita sezione dedicata ai Microcontrollori.

Re: PIC16F877 + Potenziometro + PWMout: in alto mare

MessaggioInviato: 20 set 2013, 12:27
da densha
c1b8 ha scritto:Il 16F877 non ha oscillatore interno, ne serve uno esterno.


Avevo questo fortissimo dubbio: in rete chiunque collega un oscillatore esterno, ma leggendo qui:

http://www.mikroe.com/chapters/view/16/chapter-3-pic16f887-microcontroller/#c3v10

mi era sembrato di capire ce ne fosse uno esterno, ma vabè...

La modalità di funzionamento messe a disposizione dovrebbe essere XT (essendo un risuonatore a 4MHz) e ciò mi suscita altri quesiti:

[FW] - dal datasheet si dice di settare i bit FOSC1 e FOSC0, ma non capisco se nel codice su citato ciò venga effettivamente fatto o meno...

[HW] - basta semplicemente collegare il risuonatore al micro e nient'altro, giusto? Essendo a 3 pin, ha i condensatori integrati e il pin centrale lo metto a massa. Non c'è nessun altro accorgimento?

Così a prima vista non vedo nulla di strano.
Farei le seguenti verifiche:
1) che l'oscillatore esterno funzioni


per far questo devo per forza allestire un circuitino di test apposito, vero?

3) che l'ingresso AN0 non sia sempre a 0V


Sul pin AN0 il livello di tensione varia in maniera concorde con il potenziometro

4) prova a scrivere il risultato della lettura dal ADC in uscita su una porta (es. la B) per vedere se i valori combiano cambiando la posizione del potenziomentro.


Intendi portare l'uscita digitale dell'ADC sul pin RB0 (ad esempio) e controllarne l'andamento?

EDIT: Mi sono permesso di spostare l'argomento nell'apposita sezione dedicata ai Microcontrollori.


Grazie mille, cercavo erroneamente la sezione chiamata "microcontrollori" e non la trovavo :mrgreen:

Re: PIC16F877 + Potenziometro + PWMout: in alto mare

MessaggioInviato: 20 set 2013, 12:50
da c1b8
Il link che hai proposta si riferisce al PIC16F887 non al PIC16F877: quale stai utilizzando?

Per verificare l'oscillatore puoi utilizzare un oscilloscopio.

I bit FOSC1 e FOSC0 vanno settati o sul codice o sulle proprietà del progetto/device. Verifica in tutti i possibili menù. A volte è possibile impostarli direttamente dal software del programmatore che utilizzi per spostare il file .hex nel micro.

densha ha scritto:Intendi portare l'uscita digitale dell'ADC sul pin RB0 (ad esempio) e controllarne l'andamento?

Non sul pin RB0 ma su tutta la porta B (da RB0 a RB7) in modo da avere visibilità dell'intero valore in uscita all'adc: questo per verificare che la conversione funzioni e l'uscita non sia sempre 0.

Re: PIC16F877 + Potenziometro + PWMout: in alto mare

MessaggioInviato: 20 set 2013, 14:34
da densha
c1b8 ha scritto:Il link che hai proposta si riferisce al PIC16F887 non al PIC16F877: quale stai utilizzando?


Devi scusarmi, devo essermi proprio rimbecillito #-o

Il mio è il PIC16F877, quindi il link è errato e non c'è oscillatore interno.

Per verificare l'oscillatore puoi utilizzare un oscilloscopio.
I bit FOSC1 e FOSC0 vanno settati o sul codice o sulle proprietà del progetto/device. Verifica in tutti i possibili menù. A volte è possibile impostarli direttamente dal software del programmatore che utilizzi per spostare il file .hex nel micro.


Ho alimentato il circuito, facendo arrivare la 5V al micro: con i puntali dell'oscilloscopio mi son messo su uno dei 2 pin esterni del risuonatore e massa, ma non c'è nulla...

densha ha scritto:Intendi portare l'uscita digitale dell'ADC sul pin RB0 (ad esempio) e controllarne l'andamento?

Non sul pin RB0 ma su tutta la porta B (da RB0 a RB7) in modo da avere visibilità dell'intero valore in uscita all'adc: questo per verificare che la conversione funzioni e l'uscita non sia sempre 0.


Ho modificato il codice in questa maniera:
Codice: Seleziona tutto
#include <PIC.h>
#include <stdio.h>

int main(void)
{
   int ang; //

   TRISC=0; //PORTC tutte uscite per il PWM

   TRISA=0b00101111; // Porte A analogiche come ingressi

   TRISD=0;//Porte D come uscite
   PORTD=0;//Porte D tutte a zero

   TRISB=0;//Porte B come uscite
   PORTB=0;//Porte B tutte a zero

   T2CON=4; //Timer2 acceso con prescaler a 1
   CCP1CON=12; //Modulo CCP1 settato in modalita' PWM

   PR2=0xFF; //Step massimo del duty cycle (e frequenza)

   ADCON0 = 0b01000101; //attiva porte analogiche con Fosc/8: 5MHz e lettura su AN0
   ADCON1= 0b10001110;

   while(1)
   {
      CHS0=0; // seleziona la porta da leggere (AN0)
      ADCON0bits.GO = 1;  //Fa partire la conversione
      while (ADCON0bits.GO);  //Attende che la conversione sia completa
      ang = ADRESL+(ADRESH<<8); // risultato a 10 bit

      PORTB = ADRESL + (ADRESH << 8);  // uscita dall'ADC a 10bit su PORTB

      CCPR1L=ang/4; //duty cycle CCP1

   }
}



e alimentando il tutto, con l'oscilloscopio ho visualizzato uno ad uno i pin [RB0...RB7] senza veder nulla :cry:

Re: PIC16F877 + Potenziometro + PWMout: in alto mare

MessaggioInviato: 20 set 2013, 14:42
da c1b8
densha ha scritto:con i puntali dell'oscilloscopio mi son messo su uno dei 2 pin esterni del risuonatore e massa, ma non c'è nulla...

Temo che se non hai oscillazione il risuonatore non funzioni... e di conseguenza non hai speranza di far funzionare il PIC.
Quale risuonatore utilizzi (hai il codice)?

Re: PIC16F877 + Potenziometro + PWMout: in alto mare

MessaggioInviato: 20 set 2013, 14:50
da densha
c1b8 ha scritto:
densha ha scritto:con i puntali dell'oscilloscopio mi son messo su uno dei 2 pin esterni del risuonatore e massa, ma non c'è nulla...

Temo che se non hai oscillazione il risuonatore non funzioni... e di conseguenza non hai speranza di far funzionare il PIC.
Quale risuonatore utilizzi (hai il codice)?


Non ho alcun codice, purtroppo...

Il componente è questo:
Risonatore.jpg
Risonatore.jpg (99.73 KiB) Osservato 6023 volte



Edit c1b8: ho rimosso il link al sito esterno ed inserito l'immagine direttamente. Ti prego di seguire sempre questa regola.

Re: PIC16F877 + Potenziometro + PWMout: in alto mare

MessaggioInviato: 20 set 2013, 14:56
da c1b8
Prova ad inserire 2 condensatori da 20pf tra i pin del PIC dove colleghi il risonatore e massa.

Re: PIC16F877 + Potenziometro + PWMout: in alto mare

MessaggioInviato: 20 set 2013, 15:11
da densha
c1b8 ha scritto:Prova ad inserire 2 condensatori da 20pf tra i pin del PIC dove colleghi il risonatore e massa.


Fatto ma non cambia nulla, sempre segnali bassi e piatti sui pin.

PS: ho usato quel risonatore a 3 pin proprio perché dovrebbe avere i 2 condensatori integrati.

Re: PIC16F877 + Potenziometro + PWMout: in alto mare

MessaggioInviato: 20 set 2013, 15:17
da c1b8
Immagino tu non abbia un quarzo, giusto per togliersi il dubbio sulla mancata oscillazione...

L'uso dei condensatori era solo un tentativo disperato...

OT: Se ti interressa avvicinarti ai PIC e sperimentare con loro, forse è rimasto ancora qualche PierinPIC18. Guarda qui