Vai al contenuto
PLC Forum


PIC 12F1572


dott.cicala

Messaggi consigliati

Salve a tutti!

Sto cercando di raccogliere informazioni ed esempi sia in ASM che in C (ma pure in Basic o Pacal...tutto fa brodo!) sull'uso di questo piccolo e versatile PIC. In rete non ho trovato molto

ed4716daa99cca4031ea259632dcf98d.JPG

Il piccolo è capace di realizzare funzioni interessanti e dispone di svariate periferiche integrate

7eb386e2b7f98403ff36c20b7028cdc6.JPG

8ebf3ba2e9dc2304832cd5fb5a347941.JPG

dispone, oltre a tutto il resto, 3 uscite PWM a 16bit.

Un buon sistema per mandare in pensione, finalmente, tutti quei circuiti con il 555, XR4151 ecc ecc ecc....:thumb_yello:

Avanti con le idee...e gli esempi...che spero ci siano!

 

Modificato: da dott.cicala
Link al commento
Condividi su altri siti


  • Risposte 66
  • Created
  • Ultima risposta

Top Posters In This Topic

  • dott.cicala

    38

  • Livio Orsini

    12

  • walterword

    8

  • gabri-z

    5

Il bello dei PIC è che sono software compatibili, ovvero tutte le funzioni si programmano nel medesimo modo. QUindi non è necessario trovare esempi specifici per questo tipo di pic, che è piuttosto recente, ma basta consultare le AN Microchip o altri siti per avere tutto disponibile.

Link al commento
Condividi su altri siti

Vanno bene anche le AN....ne ho trovata una sola e non contiene nulla di interessante. Questo piccolo è un po' diverso dai soliti noti....e ha qualche registro in più.

Link al commento
Condividi su altri siti

Arriva Natale......

7cf0f3bed03b8ace585740a154d92ad8.jpg

Usiamo il pic-colo per qualche semplice effetto luminoso....che ha anche valore didattico.

Viene usato l'oscillatore interno a 32MHz

- Un fototransistor connesso ad un AI forma un crepuscolare che avvia la sequenza, la quale inizia con una serie di lampeggii a frequenze diverse e viene ripetuta varie volte fino alla esecuzione della sequenza di alba-tramonto.

11f62d2abdece7584803720aa08ea762.jpg

La gestione del 16bit pwm module e del Complementary waveform generator module, non sono così elementari come si può supporre.

Il codice è stato scritto in MikroC che, non sarà il massimo, ma anche la versione gratuita è sufficiente.....

Le librerie di MikroC,   Pwm_init - Pwm_duty  - Pwm_start  - Pwm_stop (anche nella ultimissima release 6.6.2) non funzionano con questa MCU, e quindi è necessario gestirsi i registri

       Registri dell'oscillatore

       OSCCON  = 0b11110000;    // Int Osc 32MHz 4xPLL ON
       OSCTUNE = 0b00111111;    // Max Frequency

       Registri del 16bit PWM2 Module

       PWM2CON        = 0b11000000;    // module enable, output enable, normal polarity, standard mode
       PWM2CLKCON = 0b00100001;    // HFINTOSC clock, no prescaler
       PWM2PR           = 0x3FF;              // PWM PERIOD COUNT REGISTER
       PWM2PH           = 0x3FF;              // PWM PHASE COUNT REGISTER

       E' inoltre necessario scrivere il valore del Duty Cycle desiderato in due registi (nell'esempio 100%)

       PWM2DCL =0b11111111;

       PWM2DCH =0b00000011;

      Oppure in

      PWM2DC = 512;   // dc=50%

     e in ultimo, settare il bit 7 - LDA - del registo PWM2LDCON

     PWM2LDCON.B7=1;

    il quale poi verrà resettato dal PWM module

         while(1)
         {
          PWM2DC = Dimmer;  
//  <---- Dimmer è una variabile di tipo unsigned int
          PWM2LDCON.B7=1;
         }

Che dite? Non è poi tanto migrabile il codice dagli altri pic 12F5xx - 12F6xx 

 

 

Modificato: da dott.cicala
Link al commento
Condividi su altri siti

//****************************************************************************************
// Project:            Standard Mode PWM Test
// Author :            S.T. 4 Plc Forum
//                     Alba-Tramonto 3ch
// Date   :            19/12/2015
// MCU    :            PIC12F1572 - INT.OSC. 32MHz
//****************************************************************************************
//****** TAGs ****************************************************************************
       sbit Load1   at PWM1LDCON.B7;
       sbit Load2   at PWM2LDCON.B7;
       sbit Load3   at PWM3LDCON.B7;
       unsigned int Dc1, Dc2, Dc3, DutyCycle;
       bit dn, up;
//****************************************************************************************
//****************************************************************************************
void main() {
//****************************************************************************************
// Registro configurazione Oscillatore
//****************************************************************************************
       OSCCON  = 0b11110000;    // Int Osc 32MHz 4xPLL ON
       OSCTUNE = 0b00111111;    // Max Frequency
//****************************************************************************************
// Registri configurazione PORT[A]
//****************************************************************************************
       WPUA    = 0b00000000;    // Resistenze Pull Up disattivate
       SLRCONA = 0b00000000;    // Slew Rate non limitato
       INLVLA  = 0b00001000;    // Ctrl. Soglia Ingressi 0=TTL-1=Scmitt Triggered
       ODCONA  = 0b00000000;    // Ctrl. Open Drain Outputs 0=Totem Pole-1=Open Drain
       APFCON  = 0b00000000;    // Alternate Pin Function Control Register
       TRISA   = 0b11001000;    // RA0-RA1-RA2-RA4-RA5=OUT - RA3=INPUT
       LATA    = 0b00000000;    // PORT[A] Latch register
       ANSELA  = 0b00000000;    // Ingresso Anaogici OFF
//****************************************************************************************
// Registri configurazione INTERRUPTS
//****************************************************************************************
       INTCON  = 0b00000000;    // INTERRUPTS CTRL REGISTER
       PIE1    = 0b00000000;    // PERIPHERAL INTERRUPT ENABLE REGISTER 1
       PIE2    = 0b00000000;    // PERIPHERAL INTERRUPT ENABLE REGISTER 2
       PIE3    = 0b00000000;    // PERIPHERAL INTERRUPT ENABLE REGISTER 3
       PIR1    = 0b00000000;    // PERIPHERAL INTERRUPT REQUEST REGISTER 1
       PIR2    = 0b00000000;    // PERIPHERAL INTERRUPT REQUEST REGISTER 2
       PIR3    = 0b00000000;    // PERIPHERAL INTERRUPT REQUEST REGISTER 3
       IOCAP   = 0b00000000;    // INTERRUPT-ON-CHANGE PORT[A] POSITIVE EDGE REGISTER
       IOCAN   = 0b00000000;    // INTERRUPT-ON-CHANGE PORT[A] NEGATIVE EDGE REGISTER
       IOCAF   = 0b00000000;    // INTERRUPT-ON-CHANGE PORT[A] FLAG REGISTER
//****************************************************************************************
// Registri configurazione 16-BIT PWM MODULE
//****************************************************************************************
//----RA1 - PWM1 -------------------------------------------------------------------------
       PWM1CON   = 0b11000000;    // module enable, output enable, normal polarity, standard mode
       PWM1CLKCON= 0b00100001;    // HFINTOSC clock, Prescaler /4
       PWM1PR    = 0x3FF;         // PWM PERIOD COUNT REGISTER
       PWM1PH    = 0x3FF;         // PWM PHASE  COUNT REGISTER
//----RA0 - PWM2 -------------------------------------------------------------------------
       PWM2CON   = 0b11000000;    // module enable, output enable, normal polarity, standard mode
       PWM2CLKCON= 0b00100001;    // HFINTOSC clock, Prescaler /4
       PWM2PR    = 0x3FF;         // PWM PERIOD COUNT REGISTER
       PWM2PH    = 0x3FF;         // PWM PHASE  COUNT REGISTER
//----RA2 - PWM3 -------------------------------------------------------------------------
       PWM3CON   = 0b11000000;    // module enable, output enable, normal polarity, standard mode
       PWM3CLKCON= 0b00100001;    // HFINTOSC clock, no prescaler
       PWM3PR    = 0x3FF;         // PWM PERIOD COUNT REGISTER
       PWM3PH    = 0x3FF;         // PWM PHASE  COUNT REGISTER
//----PWM MIRROR REGISTERS ---------------------------------------------------------------
       PWMLD     = 0x000;         // PWM LOAD SIMULTANEOUSLY REGISTER
//****************************************************************************************
//Ciclo Alba-Tramonto
//****************************************************************************************
       while(1)
       {
        if(DutyCycle>=1022)
          {
           up=0;
           Delay_ms(5000);
           dn=1;
          }
        else if(DutyCycle==0)
          {
           dn=0;
           Delay_ms(5000);
           up=1;
          }
        if(up)
           {
            DutyCycle++;
            Delay_ms(100);
           }
        if(dn)
           {
            DutyCycle--;
            Delay_ms(100);
           }
        if(Dc2!=DutyCycle)
          {
           Dc1=DutyCycle;
           Dc2=1022-Dc1;
           Dc3=DutyCycle;  
           PWMLD=0x7;
          }
       PWM1DC = Dc1;
       PWM2DC = Dc2;
       PWM3DC = Dc3;
       }
}
Modificato: da dott.cicala
Link al commento
Condividi su altri siti

Be io ho avuto qualche difficoltà a far funzionare quello che già funzionava da tempo su di un 16F88 e su di un 16F877A specialmente perché non ho trovato quasi niente in rete e nemmeno nel sito del produttore e contemporaneamente...non sono ferratissimo....Se poi ci aggiungiamo le lacune tremende di MikroC,  e un datasheet di 300 pagine, le difficoltà aumentano.

Le differenze sembrano minime però nell'esempio sopra il funzionamento è in "Standard Mode". Più avanti mi piacerebbe affrontare anche gli altri modi di funzionamento:

Set on Match - Toggle on Match - Center Aligned

Verificare l'effetto dei registri PWMxOF e PWMxPH che determinano rispettivamente la fase e l'offset....tempo permettendo.

Come sempre sono graditi suggerimenti.

Link al commento
Condividi su altri siti

Scusa perchè usi MicroC, quando hai la ersione gratuita del C fornito da Microchip assieme a Mplab e MplabX. La versione gratuita è meno ottimizzata di quella a pagamento, ma comunque non ha lacune di sorta e poi è perfettamente adattata ai varri modelli di PIC.

Io comunque uso CsC per le vecchie CPU, perchè per le nuove non ho gli aggiornamenti (che cosatono).

Poi cosa usi come ICD, PicKit3?

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Il punto è proprio quello.

MikroC mi è stato regalato, con tanto di licenza, insieme alla EasyPic7Pro che ha già a bordo programmatore e ICD, ma ho anche il PicKit3, MPLAB e MPLABX

A parte i limiti del compilatore,che comunque con licenza garantisce upgrades a vita,  la EasyPic7Pro è molto comoda e versatile.

Dovrebbe essere possibile usarla anche con MPLAB - MPLABX  (non l' ICD) e con il PicKit3...ma non ho ancora provato

Link al commento
Condividi su altri siti

con 2,50 euro ti prendevi un arduino 1 di ultima generazione dalla cina ed avevi gia finito .

Installavi Ide, Atmel Studio o Visual Studio + Visual micro plugin ,sempre gratis ovviamente 

Modificato: da walterword
Link al commento
Condividi su altri siti

Sì lo so, ne ho più d'uno....ma quando ci faccio qualcosa e guardo dentro la scatola....non vedo niente di mio ma un puzzle di cose comprate e assemblate.

Con i pic invece è diverso. Parto da un mio schema, un mio pcb,  passando per una decina di fallimenti.....prima o poi raggiungo l'obbiettivo.

I datasheets sono un condensato di informazioni, basta interpretare male una virgola e non funziona nulla...però leggendo e rileggendo.....

Ora....volevo provare con l'appena scaricato MPLAB....e cosa scopro?

579827d72325888ec89742d362932100.jpg

...che non viene supportato e bisogna passare all'ancora più complesso MPLAB X  dove X è l'incognita che rappresenta la quantità di moccoli necessari per raggiungere l'obiettivo.....:superlol:

Link al commento
Condividi su altri siti

No guarda che MPLABX è solo apparentemente più complesso, ma in pratica è più semplice e da molte funzioni in più, basta farci la mano.

Se ti interessa vai sul sito di Elettronicain e c'è un bel tutorial su MPLABX, non so se è scaricabile anche da chi non è abbonato. Nel caso fammelo spaere e, se hai pazienza, te lo scarico io e te lo invio per posta elettronica.

 

Comunque fai bene a preferire i PIC. Soprattutto perchè se fai i lavori bene ti eviti un sacco di grane con le EMC che schede come Arduino proprio non digeriscono (anche Walter ne sa qualche cosa di questi problemi con arduino:smile:), anche perchè lo scopo primario di queste schede è un sistema di sviluppo software a basso costo.

Io da un  po' ho rinunciato perchè con i chip smd  proprio non me la senta di saldare. Poi dovrei far fare i cs da aziende specializzate, perchè con questi dispositivi, se non sono pulci come quello che stai usando, fare i cs in casa per me un'espressione di tavazzismo spinto.:smile:

Link al commento
Condividi su altri siti

Eccolo qui.....MPLAB X IDE....

78e3bfd1a9336aff1cd2b82e99a7520d.jpg

sul sito di Elettronicain e c'è un bel tutorial su MPLABX

:blink:  sono abbonato dal....2001......e non me ne sono accorto.....colpa delle valvole! :lol: 

Adesso guardo....se trovo la tessera e la password.....

Link al commento
Condividi su altri siti

L'ho trovato!! Adesso lo stampo e me lo studio.

Comunque sto usando la versione DIL8.....niente di più che un 555 come dimensioni, ma dalle potenzialità il cui limite è la sola fantasia.

Più avanti....nel progettino di cui sopra, verrà inserita la parte inerente l'interruttore crepuscolare, che servirà a dare l'avvio alla sequenza, sfruttando un ingresso analogico che fa capo allo stesso pin di un PWM e per fare ciò, verrà sfruttata la possibilità fornita registro

APFCON  [Alternate Pin Function Control Register]

il quale permette di "spostare" alcune funzioni da un pin ad un altro.

Magari aggiornerò lo schema allo scopo di pilotare un led rgb....in pratica...tanto lavoro...che si può evitare comprando la pallina cinese che esegue le stesse funzioni....al costo di 3€.....

 

Link al commento
Condividi su altri siti

Però vuoi mettere la soddisfazione?

Io ho sempre sostenuto che chi fa questo nostro deve avere un bel substrato di masochismo.:smile::smile:

Link al commento
Condividi su altri siti

Però vuoi mettere la soddisfazione?

Io ho sempre sostenuto che chi fa questo nostro deve avere un bel substrato di masochismo.:smile::smile:

 
 

Non esiste la soddisfazione senza una '' fatica '' precedente ........:thumb_yello::thumb_yello::thumb_yello: 

Mi ritengo nella stessa '' trincea '' , anche se di livello inferiore , :P cioè , di fatica .........maggiore !:superlol: 

Link al commento
Condividi su altri siti

//******************************************************************************
// Project :            Standard Mode PWM Test
// Author  :            S.T. 4 Plc Forum
//                      Alba-Tramonto 3ch + Crepuscolare
// Date    :            20/12/2015
// MCU     :            PIC12F1572 - INT.OSC. 32MHz
// Compiler:            MikroC PRO for PIC V6.6.2
//******************************************************************************
//****** TAGs ******************************************************************
       sbit Load1   at PWM1LDCON.B7;
       sbit Load2   at PWM2LDCON.B7;
       sbit Load3   at PWM3LDCON.B7;
       sbit man     at RA3_BIT;
       unsigned int Dc1, Dc2, Dc3, DutyCycle, AnVal;
       bit dn, up, start;
//******************************************************************************
//******************************************************************************
void main() {
//******************************************************************************
// Registro configurazione Oscillatore
//******************************************************************************
       OSCCON  = 0b11110000;    // Int Osc 32MHz 4xPLL ON
       OSCTUNE = 0b00111111;    // Max Frequency
//******************************************************************************
// Registri configurazione PORT[A]
//******************************************************************************
       WPUA    = 0b00000000;    // Resistenze Pull Up disattivate
       SLRCONA = 0b00000000;    // Slew Rate non limitato
       INLVLA  = 0b00001011;    // Ctrl.Ingressi 0=TTL-1=Scmitt Triggered
       ODCONA  = 0b00000000;    // Ctrl. Outputs 0=Totem Pole-1=Open Drain
       APFCON  = 0b00000011;    // Alternate Pin Function: PW1->RA5 - PWM2->RA4
       TRISA   = 0b11001011;    // RA2-RA4-RA5=OUT - RA0-RA1-RA3=INPUT
       LATA    = 0b00000000;    // PORT[A] Latch register
       ANSELA  = 0b00000001;    // Ingressi Anaogici RA4=AN3
//******************************************************************************
// Registri configurazione INTERRUPTS
//******************************************************************************
       INTCON  = 0b00000000;    // INTERRUPTS CTRL REGISTER
       PIE1    = 0b00000000;    // PERIPHERAL INTERRUPT ENABLE REGISTER 1
       PIE2    = 0b00000000;    // PERIPHERAL INTERRUPT ENABLE REGISTER 2
       PIE3    = 0b00000000;    // PERIPHERAL INTERRUPT ENABLE REGISTER 3
       PIR1    = 0b00000000;    // PERIPHERAL INTERRUPT REQUEST REGISTER 1
       PIR2    = 0b00000000;    // PERIPHERAL INTERRUPT REQUEST REGISTER 2
       PIR3    = 0b00000000;    // PERIPHERAL INTERRUPT REQUEST REGISTER 3
       IOCAP   = 0b00000000;    // INTERRUPT-ON-CHANGE PORT[A] POS.EDGE REGISTER
       IOCAN   = 0b00000000;    // INTERRUPT-ON-CHANGE PORT[A] NEG.EDGE REGISTER
       IOCAF   = 0b00000000;    // INTERRUPT-ON-CHANGE PORT[A] FLAG REGISTER
//******************************************************************************
// Registri configurazione 16-BIT PWM MODULE
//******************************************************************************
//----RA1 - PWM1 ---------------------------------------------------------------
       PWM1CON   = 0b11000000;    // module en, output en, norm pol, standard m.
       PWM1CLKCON= 0b00100001;    // HFINTOSC clock, Prescaler /4
       PWM1PR    = 0x3FF;         // PWM PERIOD COUNT REGISTER
       PWM1PH    = 0x3FF;         // PWM PHASE  COUNT REGISTER
//----RA0 - PWM2 ---------------------------------------------------------------
       PWM2CON   = 0b11000000;    // module en, output en, norm pol, standard m.
       PWM2CLKCON= 0b00100001;    // HFINTOSC clock, Prescaler /4
       PWM2PR    = 0x3FF;         // PWM PERIOD COUNT REGISTER
       PWM2PH    = 0x3FF;         // PWM PHASE  COUNT REGISTER
//----RA2 - PWM3 ---------------------------------------------------------------
       PWM3CON   = 0b11000000;    // module en, output en, norm pol, standard m.
       PWM3CLKCON= 0b00100001;    // HFINTOSC clock, no prescaler
       PWM3PR    = 0x3FF;         // PWM PERIOD COUNT REGISTER
       PWM3PH    = 0x3FF;         // PWM PHASE  COUNT REGISTER
//----PWM MIRROR REGISTERS -----------------------------------------------------
       PWMLD     = 0x000;         // PWM LOAD SIMULTANEOUSLY REGISTER
//******************************************************************************
//******************************************************************************
//Crepuscolare con isteresi
//******************************************************************************
    while(1)
     {
         AnVal=ADC_Read(0);
         start=((AnVal>512)||(AnVal>128 & start));
//******************************************************************************
//Ciclo Alba-Tramonto
//******************************************************************************
       if(start||man)
       {
        if(DutyCycle>=1022)
          {
           up=0;
           Delay_ms(5000);
           dn=1;
          }
        else if(DutyCycle==0)
          {
           dn=0;
           Delay_ms(5000);
           up=1;
          }
        if(up)
           {
            DutyCycle++;
            Delay_ms(100);
           }
        if(dn)
           {
            DutyCycle--;
            Delay_ms(100);
           }
        if(Dc2!=DutyCycle)
          {
           Dc1=DutyCycle;
           Dc2=1022-Dc1;
           Dc3=DutyCycle;
           PWMLD=0x7;
          }
       }
       else {
         DutyCycle=1023;
         Dc1=0;
         Dc2=0;
         Dc3=0;
         dn=1;
         up=0;
         PWMLD=0x7;
         }
         PWM1DC = Dc1;
         PWM2DC = Dc2;
         PWM3DC = Dc3;
     }
}
Modificato: da dott.cicala
Link al commento
Condividi su altri siti

Stefano poi mi studio l'applicazione perchè potrebbe essere interessante conoscere questi ragnetti.

Solo che è un po' che ho accantonato i pic proprio per la ralizzazione dei cs. Però questi cosini si potrebbe anche cablarli su una mille fori.

Mi ritengo nella stessa '' trincea '' , anche se di livello inferiore , :P cioè , di fatica .........maggiore !:superlol: 

Gabri non fare il modesto.:smile:

Link al commento
Condividi su altri siti

dottor Cicala ....se il tuo problema è quello di vedere qualcosa di tuo nella scatoletta quando la apri allora potresti anche creartelo il microcontrollore , per esempio con un fpga.

O seno' puoi anche creare un microprocessore fatto in casa, prendi qualche laser, i wafer di silicio .... il silicio lo preferisci in wafer oppure credi sia meglio installare un impianto e produrlo direttamente tramite processo Siemens ?  

:D:D:D 

Io quando apro la scatoletta vedo sempre quello che mi interessa, il firmware , il software rappresentano l'anima del programmatore 

Link al commento
Condividi su altri siti

Caspita!  

Vedendo il tuo nome fra gli interventi mi ero illuso di poter assistere a una lectio magistralis sul software.....e invece.....

Comunque...non ho detto e non penso nemmeno che arduino sia un bidone e chi lo usa sia un minus habens.....al contrario di quanto hai fatto tu. :toobad:

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora

×
×
  • Crea nuovo/a...