Vai al contenuto
PLC Forum


Relè passo passo personalizzato


Mauro Dalseno

Messaggi consigliati

ma è troppo rumoroso

E' vero! Ho dovuto togliere un condensatore perchè premendo il pulsante generava un impulso di -110dBm a 16kHz.

L'antirimbalzo è software 😉

image.thumb.png.a90711f2ac2f3e10271beee262ea9353.png

 

Il file .hex

:020000000328D3
:10000600210099019A0108308C0022008C01200001
:10001600A101A011A0122011A01020008C191528F2
:10002600711416287110201A1A2803141B2803109D
:10003600711C2128031C2128201422282010711845
:100046002628201227282016201C332801302200BB
:100056008C060C1830288C1431288C102000A10135
:1000660022000C1C4F28803020002106F000803032
:100076000A3A700203184028A10A80302106F000CF
:1000860080300A3A7002013003180030F000701810
:100096004E2820114F28201522008C1C6B288030FA
:1000A60020002106F00080300A3A700203185C280E
:1000B600A10A80302106F00080300A3A7002013031
:1000C60003180030F00070186A28A0106B28A014DE
:1000D60020002019712822000C15732822000C110B
:1000E6002000A018792822000C167B2822000C126A
:0400F60010287C282A
:020000040001F9
:04000E00A40FFF1C20
:00000001FF

Il programma in un void 🤪

//******************************************************************************
// Project :
// Author  :            S.T. 4 PLC Forum
// Date    :            26/12/2019
// MCU     :            PIC12F1840 - INt.OSC. 31kHz
// Compiler:            MikroC PRO for PIC V7.5.0
//******************************************************************************
//****** TAGs ******************************************************************
       sbit Led1       at LATA.B0;
       sbit Led2       at LATA.B1;
       sbit Out1       at LATA.B2;
       sbit Pbutton    at RA3_BIT;
       sbit Out2       at LATA.B4;
       sbit Out3       at LATA.B5;
       bit FsButton, mem, mOut1, mOut2;
       short step;
//******************************************************************************
//******************************************************************************
void main() {
//******************************************************************************
// Registro configurazione Oscillatore
//******************************************************************************
       OSCCON  = 0b00000000;
//******************************************************************************
// Registri configurazione PORT[A]
//******************************************************************************
       TRISA   = 0b00001000;    // RA0-RA1-RA2-RA4=OUT - RA3-RA5=INPUT
//******************************************************************************
       LATA  = 0;
       step  = 0;
       mOut1 = 0;
       mOut2 = 0;
//******************************************************************************
//
//******************************************************************************
      while(1)
        {
         FsButton = !Pbutton &! mem;
         mem =  !Pbutton;
         if(FsButton)
          {
           Led1=~Led1;
           Led2=!Led1;
           step=0;
          }
         if(Led1)
          {
           if(step<10)step++;
           mOut1=(step<10);
          }
         if(Led2)
          {
           if(step<10)step++;
           mOut2=(step<10);
          }
          Out1=!mOut1;
          Out2=!mOut2;
         }
 }

 

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


  • Risposte 105
  • Created
  • Ultima risposta

Top Posters In This Topic

  • gabri-z

    39

  • dott.cicala

    23

  • Mauro Dalseno

    17

  • GiRock

    15

Stefano, il mio amico vedendo i tuoi post ha cambiato idea e vuole tornare a usare il PIC, mi ha detto che Lunedì se i negozi di componentistica elettronica mantovani sono aperti va a comprare i componenti.... il PIC occupa poco spazio e da quanto si capisce dalle tue schermate dovrebbe andare bene.

Link al commento
Condividi su altri siti

 

Il circuito  qual'è?

Il mio , in matita , non posso ancora simulare il 4017 .

A proposito della tua '' sonda logica '' , ce la presenteresti nel sotto-forum adeguato ? Non credo si possa chiamare pubblicità , magari se fosse , un moderatore toglierà il nome .

Link al commento
Condividi su altri siti

 

il PIC occupa poco spazio e da quanto si capisce dalle tue schermate dovrebbe andare bene.

Nessun altro circuito potrebbe battere uno col pic per la funzione del circuito data .

 

Dimenticavo , sta volta puoi saltare il condizionale :superlol: VA !

Modificato: da gabri-z
Link al commento
Condividi su altri siti

 

 

Il mio , in matita

Accipicchia, simulare il digitale con LTspice è roba da mal di testa

 

 

A proposito della tua '' sonda logica '

E' una cinesata da poche decine di €€  clone di questo

Mi  ha sorpreso per quanto funzioni bene

 

 

il mio amico vedendo i tuoi post ha cambiato idea e vuole tornare a usare il PIC

Va bene qualsiasi pic a 8 pin serie 12F1xxx, non quelli vecchi 12Fxxx.

Io ho il 12F1501, il 12F1572 e il 12F1840 e l'ho provato sugli ultimi due.

Il codice più sopra non è quello che serve a te...ho fatto un po' di confusione, quello è per pilotare i led con l'uscita a livello basso.

Quando lo trovi mi dici che  pic hai che lo ricompilo.

 

Il codice giusto per il 1840 è questo

//******************************************************************************
// Project :
// Author  :            S.T. 4 PLC Forum
// Date    :            26/12/2019
// MCU     :            PIC12F1840 - INt.OSC. 31kHz
// Compiler:            MikroC PRO for PIC V7.5.0
//******************************************************************************
//****** TAGs ******************************************************************
       sbit Led1       at LATA.B0;
       sbit Led2       at LATA.B1;
       sbit Out1       at LATA.B2;
       sbit Pbutton    at RA3_BIT;
       sbit Out2       at LATA.B4;
       bit FsButton, app, wait;
       short step;
//******************************************************************************
//******************************************************************************
void main() {
//******************************************************************************
// Registro configurazione Oscillatore
//******************************************************************************
       OSCCON  = 0b00000000;    // 31kHz LF-LP
//******************************************************************************
// Registri configurazione PORT[A]
//******************************************************************************
       TRISA   = 0b00101000;    // RA0-RA1-RA2-RA4=OUT - RA3-RA5=INPUT
//******************************************************************************
       LATA  = 0;               // Azzro Latch
       step  = 0;               // Azzero conteggio
//******************************************************************************
//
//******************************************************************************
      while(1)
        {
         wait = (Out1||Out2)&!Pbutton;          //Attendo fine mpulso
         FsButton = !Pbutton &! app &!wait;     //Fronte discesa pulsante
         app =  !Pbutton;                       //Appoggio per fronte

         if(FsButton)                           // C'è il fonte?
          {
           Led1=~Led1;                          // Inverto stato Led1
           Led2=!Led1;                          // Led2 è l'inverso di Led1
           step=0;                              // Cicli di ritardo
          }
         if(Led1)                               // Led1 è acceso?
          {
           if(step<31)step++;                   // Conto fino a 31
           Out1=(step<31);                      // Attivo uscita per 31 cicli
          }
         if(Led2)                               // Led2 è acceso?
          {
           if(step<31)step++;                   // Conto fino a 31
           Out2=(step<31);                      // Attivo uscita per 31 cicli
          }
         }
 }

 

file .hex

:020000000328D3
:10000600210099019A0108308C0022008C01200001
:10001600A101A011A0122011A01020008C191528F2
:10002600711416287110201A1A2803141B2803109D
:10003600711C2128031C2128201422282010711845
:100046002628201227282016201C332801302200BB
:100056008C060C1830288C1431288C102000A10135
:1000660022000C1C4F28803020002106F000803032
:100076000A3A700203184028A10A80302106F000CF
:1000860080300A3A7002013003180030F000701810
:100096004E2820114F28201522008C1C6B288030FA
:1000A60020002106F00080300A3A700203185C280E
:1000B600A10A80302106F00080300A3A7002013031
:1000C60003180030F00070186A28A0106B28A014DE
:1000D60020002019712822000C15732822000C110B
:1000E6002000A018792822000C167B2822000C126A
:0400F60010287C282A
:020000040001F9
:04000E00A40FFF1C20
:00000001FF

Un'altra cosa che si riesce a fare è impedire di emettere un nuovo impulso mentre è in corso il precedente

image.thumb.png.664f0a355391dcc2787bb6c81c1ae305.png

Oltre che filtrare ogni rimbalzo del pulsante senza nessun componente esterno

image.png.d0195131372456a999fb01ec539000aa.png

 

image.png.a81468a3c8d67fddb426f96d26381a7a.png

image.png

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

In Proteus il tempo del monostabile 4538 non viene simulato, ovvero non viene dedotto dalla lettura RC esterna, deve essere settato nelle proprietà alla voce Monostable Time Constant, ai tempi aveva fregato anche me convinto di aver impostato valori errati, poi ho scoperto l'arcano... :wallbash:

 

Il funzionamento corretto del circuito è presto riassunto:

 

1) Accendi l'ambaradan e tutti i LED sono spenti, le uscite degli impulsi sono a livello logico 1 avendo le sue pull-up
2) Premi una volta il pulsante, (*) si accende il LED LD1 e contemporaneamente l'uscita O1 dell'impulso si setta a 0 fino al rilascio del pulsante che lo ripristina a 1
3) Premi ancora il pulsante, si spegne LD1 e si accende LD2, l'uscita O2 dell'impulso si setta a 0 fino al rilascio del pulsante che lo ripristina a 1
4) Ripremi il pulsante e salti alla condizione (*) e via discorrendo fino al successivo riavvio del circuito


Ad ogni modo, stai facendo un grande lavoro anche questa volta come sempre... :thumb_yello:

Modificato: da GiRock
Link al commento
Condividi su altri siti

Si ho cambiato il codice perché

1) Il biled lo piloto direttamente ed è a catodo comune

2) Gli impulsi pilotano i transistor per avere il collegamento a collettore aperto, quindi per mandare bassi gli ingressi del mux devo eccitare i bjt, che sono npn

 

 

Per tale ragione le uscite hanno lo stesso stato (attivo alto)

 

Il funzionamento è come da specifica:

All'accensione nessuna uscita attiva, quindi il mux è tenuto alto dal pullup (non a  schema) i led sono spenti.

Premendo il pulsante (attivo basso) viene attivato il led 1 e generato l'impulso 1.

Alla successiva pressione si spegne il led1, si accende il led2 e viene generato l'impulso 2.

Alla successiva pressione si spegne il led2, si accende il led1 e viene generato l'impulso 1 e via di seguito.

 

Ovvio che l'analizzatore logico ha bisogno di un trigger per iniziare l'acquisizione che nella figura qui sopra è preso dal segnale Pulse_P1,

di conseguenza la situazione iniziale con tutto spento si vede ben poco.

 

Confermo quindi l'ultimo schema e codice pubblicati.

 

 

Ad ogni modo, stai facendo un grande lavoro

Grazie

Link al commento
Condividi su altri siti

Beh , così è più facile leggerlo , sul primo che hai messo , mi sono attorcigliato  il collo per vedere il sincronismo....:superlol:

 

Quel 0,34s è il tempo minimo per un programma , mentre non accetta un altro impulso ?

 

Link al commento
Condividi su altri siti

 

Quando lo trovi mi dici che  pic hai che lo ricompilo.

 

Il codice giusto per il 1840 è questo

Ne ho ordinati un paio su internet, così lo faccio anche io quel circuito.... mi hai invogliato....

domanda: il testo per il file .hex l'ho copiato in un file di testo txt e poi ho cambiato l'estensione in .hex, è corretta questa procedura?

Link al commento
Condividi su altri siti

 

Quel 0,34s è il tempo minimo per un programma , mentre non accetta un altro impulso ?

Sì, se il bottone è premuto ed è in corso un impulso allora aspetta .  L'impulso dura 31 cicli all'interno del While

wait = (Out1||Out2)&!Pbutton;
Out1=(step<31)
Link al commento
Condividi su altri siti

Scusa Dottore,

 

non era meglio mettere tutto in sleep mode dopo ogni pressione del pulsante? :rolleyes:

 

Usando la cattura dei fronti in ingresso e l'interrupt, si potrebbe spegnere il PIC evitando qualsiasi rumore aggiuntivo anche se l'analizzatore di spettro non ne rileva, a mio parere sarebbe stata la cosa più sensata anche se il codice risulterebbe un poco più complicato da scrivere, avevo usato un sistena analogo sia per un campanello elettronico che per un frequenzimetro/duty-cyclometro con buoni risultati...:whistling:

 

Ad ogni modo, conoscendo la tua meticolosità nelle analisi circuitali, non ho dubbi che anche così il tutto funzioni a dovere, speriamo che risponda fedelmente alle specifiche richieste...:clap:

Link al commento
Condividi su altri siti

 

non era meglio mettere tutto in sleep mode

Certamente sì. Ma volevo appunto scrivere un codice semplice da spiegare.

Visto che hai lanciato il sasso....ora lascio a te il compito di scrivere il codice come hai suggerito ;)

Link al commento
Condividi su altri siti

 

Certamente sì. Ma volevo appunto scrivere un codice semplice da spiegare.

Visto che hai lanciato il sasso....ora lascio a te il compito di scrivere il codice come hai suggerito

Non pensavo di avviare una gatta del genere.... non tiratemi degli accidenti 🙄

Link al commento
Condividi su altri siti

 

Non pensavo di avviare una gatta del genere.... non tiratemi degli accidenti 🙄

Assolutamente no. Ci avevo pensato ma comunque...

...Anche in sleep il micro ha pur sempre bisogno di un  clock che non si spegne mai...ed è quello che ho usato io 

9.0 POWER-DOWN MODE (SLEEP)

5. 31 kHz LFINTOSC is unaffected and peripherals
that operate from it may continue operation in
Sleep.

:D

Link al commento
Condividi su altri siti

 


 

Questo l'ho letto dopo , visto che tu eri impegnato , e lo associato al ''tema'' .

 

 

// Conto fino a 31 Out1=(step<31); // Attivo uscita per 31 cicli

:thumb_yello:

Link al commento
Condividi su altri siti

Ospite
Questa discussione è chiusa alle risposte.

×
×
  • Crea nuovo/a...