Vai al contenuto
PLC Forum


Cerco ic logico una sola uscita attiva


Vicus

Messaggi consigliati

Se invece volessi chiudere gli interruttori verso massa oltre a mettere le r di pull up invece che pull down cosa dovrei fare? L'ingrato triggera sul fronte di salita?

Link al commento
Condividi su altri siti


  • Risposte 78
  • Created
  • Ultima risposta

Top Posters In This Topic

  • Vicus

    29

  • gabri-z

    22

  • dott.cicala

    19

  • Nik-nak

    2

Top Posters In This Topic

Posted Images

  • 1 month later...

Ciao, vi aggiorno: ho optato per la soluzione con micro. L'ho ordinato e mi arriverà la settimana prossima in compenso è arrivato il programmatore che però non funziona. Conoscete un modo per programmare i pic con arduino?

Link al commento
Condividi su altri siti

Che programmatore hai ordinato...che non funziona?

 

Se hai un adattatore usb-rs232 o addirittura la rs232 sul pc, puoi costruire il prommer presentato nel mio intervento del 23 marzo.

Funziona sicuramente...se costruito correttamente.

 

Che pic vuoi usare?

Link al commento
Condividi su altri siti

Quello che mi hai consigliato tu ovvero il PIC16F88. Il programmatore è un TL866A e il self check mi da 5 errori nel "over current protection" e infatti non riesce a programmarmi una prom. Ha pure l'icsp ma non so se funzioni.

 

Seguendo questo:

c9c4baf4af2970468a977d20eb1bc40a.jpg

il pic hai il pull up interno?

Link al commento
Condividi su altri siti

Quote

TL866A

ho capito.....quello cinese :thumbdown: 

Da quanto ho visto, non costa nemmeno poco. Purtroppo a volte capita di comprare aggeggi cinesi che non funzionano ma solitamente i venditori cinesi sono disposti anche a sostituirli, i tempi  sono molto lunghi.

A me è capitato con un noise generator: ci son voluti più di 3 mesi per averne uno funzionante :senzasperanza:

 

Il 16F88 ha il weak pull up su portB....non è una resistenza ma un pmos....che non va caricato troppo, va bene appunto per i pulsanti.

Il codice lo avevo a suo tempo collaudato e quindi è perfettamente funzionante.

 

E' possibile programmare i pic anche con arduino.....in rete c'è qualcosa....ma a me arduino dà l'orticaria, anche se ne ho più di uno....

....e poi ho il pickit3 e la easy pic7...quindi....non ci ho mai provato....ma adesso che ci penso....proverò con la red pitaya :smile:

Link al commento
Condividi su altri siti

Red pitaya è un bel aggeggino. Dovrò cercarmi qualcuno con un programmatore per portare il progetto a termine in breve tempo. Qui c'è qualcuno nel triangolo Vicenza-Treviso-Padova?

Link al commento
Condividi su altri siti

  • 4 weeks later...

Ok, ho la scheda finita. Mi basta programmare il pic e fare il primo test. Il codice che mi avete dato è questo:

:020000001628C0
:0E0006008312031321088A00200882000800DC
:1000140003208A110A128000840AA00A0319A10A83
:08002400F003031D0A28080087
:10002C004D30831603138F0083129F0183169F019B
:10003C009B01F03085000F3086008312850107305C
:10004C00831681008B018C018D0183128C018D0133
:10005C0083168E010F3083120605A200A301003017
:10006C00A3050030A3004628013085006628023025
:10007C0085006628043085006628083085006628CF
:10008C0000302306031D4C280E30220603193A2893
:10009C0000302306031D54280D30220603193D2879
:1000AC0000302306031D5C280B3022060319402860
:1000BC0000302306031D6428073022060319432849
:0400CC003028672849
:04400E00183FFF3F19
:00000001FF

ora che faccio? Io ho fatto così, creo un file .hex e ci copio dentro quello che c'è qui sopra. Apro il programmatore e apro l'hex. C'è la possibilità di inserire da che riga partire, solo code, all memory e altre opzioni. Lascio tutto di default?

Link al commento
Condividi su altri siti

Capito tutto, ha usato gli altri quattro ingressi, da 0 a 3 mentre io ho usato quelli dello schema ovvero da 4 a 7. Modifico il firmware e provo a ricaricarlo.

Link al commento
Condividi su altri siti

Alt un attimo :blink:

 

 

 

Non me lo ricordo più....però l'avevo provato e funzionava.

 

PortB dove sono collegati i pulsanti è letta a byte. Mask è una maschera che mette in  AND il valore di portB con 0x07 che vale 00001111.

 

Quindi i pulsanti vanno collegati da RB0 a RB3

 

Da RB0 a RB3 significa usare i pesi binari da 20  a  23

 

cioè i valori decimali 1-2-4-8

 

Quindi il case deve essere

 

       MASK:= PORTB & 0x0f;

       switch (MASK) {

         CASE 1: PORTA:=1;

         break;

         CASE 2: PORTA:=2;

         break;

         CASE 4:

         PORTA:=4;

         break;

         CASE 8:

        PORTA:=8;

        break;

         }

 

Le uscite sono collegate da RA0 A RA3 e scritte nello stesso modo

 

Link al commento
Condividi su altri siti

e...ho sbagliato un'altra volta....volevo dire 0x0F

 

F in esadecimale vale 15 in decimale che vale 1111 in binario

 

ogni bit da destra a sinistra vale 2n

 

dove n è il numero del bit. Il bit 3 ad esempio vale 2cioè 8 in decimale.

 

Un byte è composto da 8 bit e quindi si ha da dx a sx   27...... 20

In decimale ogni bit della portaB che ha 8 ingressi e quindi è un byte vale

128-64-32-16-8-4-2-1

Se facciamo la somma di ognuno otteniamo partendo dal caso in cui gli ingressi sono tutti spenti a quello in cui sono tutti accesi, ( ma vale anche per le uscite) abbiamo

un campo di valori che va da 0 a 255, cioè 256 combinazioni.

 

In questo circuito, con l'istruzione switch - case, viene riconosciuto un solo valore per volta che può assumere la porta dove sono collegati i pulsanti e siccome sono quattro, gli altri 4 ingressi non utilizzati vengono mascherati.

 

Si ha il valore della maschera che vale 00001111

e il valore dei pulsanti che può valere 0001 - 0010 - 0100 - 1000 che appunto in decimale significa 1-2-4-8.

 

Se si premono più pulsanti contemporaneamente si avrà una combinazione diversa non compresa nel case e quindi non verrà attivata nessuna uscita.

 

E come sono attivate le uscite?

 

Le uscite sono su un'altra porta, la portA che ha 4 ingressi ma stanzia sempre 8 bit, quindi un byte.

L'uscita RA0 ha valore decimale 1 - RA1 vale 2 - RA2 vale 4 - RA3 Vale 8, cioè 2n

 

dove n è il numero del bit e in questo caso dell'ingresso o dell'uscita.

 

Spero che Ho stato spiegato  :superlol:

 

Link al commento
Condividi su altri siti

come...non sono stato abbastanza chiaro? :superlol:

 

e allora mi spiego meglio....

 

se facciamo la AND fra 00001111

e portB con il pulsante su RB0 premuto, leggendo il byte PortB avremo

 

00000001 AND 00001111= 00000001  = 1 dec       -

 

con RB1 premuto

 

00000010 AND 00001111= 00000010   = 2 dec

 

con RB2 premuto

 

00000100 AND 00001111= 00000100 = 4 dec

 

con RB3 premuto

 

00001000 AND 00001111= 00001000 = 8 dec

 

se ponessimo a 1 RB7 avremo

 

10000000 AND 00001111= 00000000

 

Ora, se scriviamo 8 in nella porta RA otterremo che RA assumerebbe il valore binario 00001000

cioè si accenderebbe RA3 che vale 23 cioè 8...e così via

 

switch alla fine è un commutatore che si posiziona solamente alla posizione definita dal valore associato al CASE

e in quella posizione esegue l'istruzione presente....

 

:P

 

...quindi....non può non funzionare....

 

 

 

Link al commento
Condividi su altri siti

Quote

come costruire un ciclotrone con una pila mini stilo da 1,5v....scarica?

Semplice da dire ... la vendi come buona e scapi .. te ne procuri altre 10 quasi scariche e le vendi per buone ; cambi quartiere , dopo cinque giri cosi , cambi città  , poi ripeti , :P e dopo 500 passi 1/10  , potrai provare di trovare uno sponsor per il ciclotrone ; a Lui conviene raccontare la Tua ascensione , sarà più fiducioso sapendo 'sta verità :roflmao:

Link al commento
Condividi su altri siti

Comunque nello schema si usano RB4 RB5 RB6 ed RB7. Le modifiche al codice che ho fatto sono state:

settare quei pin come ingressi, modificare la maschera in 0xf0, cambiare i valori in 224, 208, 176 e 112. Ci ho messo un po' a capire cosa e come però alla fine ci sono riuscito. Quello che mi ha messo fuori strada è questa dichiarazione:

// Inputs
   sbit P1       at RB0_BIT;
   sbit P2       at RB1_BIT;
   sbit P3       at RB2_BIT;
   sbit P4       at RB3_BIT;

 che dubito serva a qualcosa. Ora devo solo inserire delle pause tra quando chiudo un uscita e abilito l'altra. Qualche suggerimento sull'istruzione "aspetta senza fare qualcosa".

Link al commento
Condividi su altri siti

Sono contento che ci sei riuscito. :thumb_yello:

 

In effetti la dichiarazione di P1-P2-P3-P4 non serve a nulla perché in un secondo momento ho deciso di leggere e scrivere le porte  in un colpo solo considerandole come dei Bytes come spiegato più sopra, visto che la funzione richiesta era alquanto elementare.

 

Poi un po' di confusine devo ammettere di averla fatta, tra schema e codice....colpa dell'ora tarda che purtroppo non viene più indicata a fianco dei messaggi....la nuova piattaforma del forum ha eliminato le cose utili di quello vecchio...è il nuovo che avanza o gli avanzi del nuovo.

 

Ora, disappunto a parte, sembra che la specifica di progetto sia cambiata.

 

Oltre a quanto fatto vorresti introdurre un ritardo tra lo spegnimento di un'uscita e l'accensione di un'altra.

 

Non c'è molto da modificare, bastano due/tre righe...

 

Sarebbe interessante e costruttivo nei confronti di quanti hanno partecipato alla discussione, se pubblicassi la tua soluzione....prima che il tutto piombi nell'oblio e non ve ne rimanga più traccia.

 

 

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...