Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

PIC timer preimpostato

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[11] Re: PIC timer preimpostato

Messaggioda Foto UtenteIlGuru » 8 set 2015, 13:20

Vedi, già i due pulsanti io li metterei sulla PORTB così posso sfruttare le resistenze di pull-up interne e risparmiarle sul PCB
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
5.482 2 10 13
G.Master EY
G.Master EY
 
Messaggi: 1924
Iscritto il: 31 lug 2015, 23:32

0
voti

[12] Re: PIC timer preimpostato

Messaggioda Foto UtenteIlGuru » 8 set 2015, 13:23

simo85 ha scritto:I pulsanti sui pin RA2 e RA3 non vanno bene. Devi usare i pin con le interruzioni Interrupt on Change. Poi, puoi usare i pull-up interni.


Il 16F84 ha interrupt solo su RB0. Magari attivarlo su interrupt non è necessario ed inizialmente complicherebbe il codice, comunque sono d'accordo di usare la PORTB per sfruttare i pull-up che su PORTA non ci sono.
Ultima modifica di Foto UtenteIlGuru il 8 set 2015, 13:29, modificato 2 volte in totale.
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
5.482 2 10 13
G.Master EY
G.Master EY
 
Messaggi: 1924
Iscritto il: 31 lug 2015, 23:32

0
voti

[13] Re: PIC timer preimpostato

Messaggioda Foto Utentesimo85 » 8 set 2015, 13:25

IlGuru ha scritto:così posso sfruttare le resistenze di pull-up interne e risparmiarle sul PCB

Beh, prima di risparmiare due resistori, deve pensare alle interruzioni (sul PORTB).

IlGuru ha scritto:Il 16F84 ha interrupt solo su RB0

La tabella del datasheet a pag. 24 non dice le stesse cose. Stai confondendo INT (pag. 49) con IOC. ;-)
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[14] Re: PIC timer preimpostato

Messaggioda Foto UtenteIlGuru » 8 set 2015, 13:28

simo85 ha scritto:La tabella del datasheet a pag. 24 non dice le stesse cose. Stai confondendo INT con IOC. ;-)


Hai ragione, vanno bene anche da RB4 a RB7 :)
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
5.482 2 10 13
G.Master EY
G.Master EY
 
Messaggi: 1924
Iscritto il: 31 lug 2015, 23:32

1
voti

[15] Re: PIC timer preimpostato

Messaggioda Foto UtentePaolino » 8 set 2015, 14:50

La gestione con interrupt non è strettamente obbligatoria, benché comoda. :D
Quello che suggerisco di non far mancare è l'antirimbalzo sugli ingressi dei pulsanti, pena comportamenti anomali del firmware.

Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[16] Re: PIC timer preimpostato

Messaggioda Foto Utentebebos89 » 8 set 2015, 16:12

Salve, ho inserito gli ingressi sulle porte RB4 e RB5 e le uscite sulle prime due PortB.

prova orzoro.jpg
Avatar utente
Foto Utentebebos89
60 1 6
Frequentatore
Frequentatore
 
Messaggi: 126
Iscritto il: 14 nov 2012, 15:06

0
voti

[17] Re: PIC timer preimpostato

Messaggioda Foto Utentesimo85 » 8 set 2015, 16:15

Bene. Ora puoi cominciare a scrivere le prime linee di codice. :-)
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[18] Re: PIC timer preimpostato

Messaggioda Foto UtenteIlGuru » 8 set 2015, 18:25

Nel progetto ci hai messo un quarzo, da quanto è? Ci serve saperlo per settare i bit di configurazione e la costante _XTAL_FREQ.
Ipotizziamo che sia da 8Mhz, se fosse inferiore di 3.5MHz dovremmo usare #pragma config FOSC = XT.

Quindi cominciamo con i bit di configurazione:
Codice: Seleziona tutto
#pragma config FOSC  = HS
#pragma config WDTE  = OFF
#pragma config CP    = OFF
#pragma config PWRTE = OFF


Che compilatore userai?
Io uso xc8 di Microchip

quindi:
Codice: Seleziona tutto
#include <xc.h>

#define _XTAL_FREQ  8000000


Poi viene il codice:

Codice: Seleziona tutto
void main(void) {
   /*
      E qui mettiamo il codice
   */
}
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
5.482 2 10 13
G.Master EY
G.Master EY
 
Messaggi: 1924
Iscritto il: 31 lug 2015, 23:32

1
voti

[19] Re: PIC timer preimpostato

Messaggioda Foto UtenteWALTERmwp » 8 set 2015, 22:58

Ciao Foto Utentebebos89, per quanto hai premesso, oltre agli utili consigli che hai ricevuto, ti suggerirei di dare una "impostazione" al tuo programma, a meno che tu non abbia già le idee chiare.
A prescindere dal linguaggio che poi decidi di utilizzare, ma anche a prescindere dal microcontrollore, se vogliamo, un minimo di rappresentazione grafica credo possa agevolare, quindi:

Considerato il fatto che si cerca un minimo di flessibilità potresti pensare di ricorrere a cinque temporizzazioni.
Ognuna fa riferimento ad un parametro; se vuoi gestire due cicli differenti (due pulsanti) significa allora predisporre dieci parametri.
In funzione del pulsante premuto vengono presi in considerazione quelli associati.
Ogni parametro viene(deve) essere utilizzato come comparatore del relativo timer, quindi cinque timer.
Quando il timer risulta maggiore o uguale al valore del "suo" parametro attivi una flag (una variabile).
Quando "quella" variabile risulta attivata, compi l'azione prevista.
L'azione, come da grafico, può consistere nell'abilitare un timer e attivare una uscita o azzerare il timer e disattivare l'uscita.
I timer tr.2 e tr.3 vengono attivati in concomitanza dell'evento start.
Ne prevederei due distinti, per ogni evenienza.
Ho scritto "timer" ma intendo riferirmi a variabili generiche, non alla risorsa del microcontrollore.
Ogni timer, quindi ogni variabile, dovrebbe essere incrementata, se risulta attivata(attivato), di una unità ogni volta che "scade" il TIMER che hai scelto di utilizzare.
Il TIMER costituisce così la tua griglia temporale; puoi impostarlo, per esempio, a 10 ms, a 20 ms, o come preferisci, insomma decidi la risoluzione temporale.
Quando il TIMER "scade" viene automaticamente (o immediatamente) "ricaricato" e contestualmente provvedi all'incremento delle variabili "abilitate".
Ti suggerirei, inoltre, di aggiungere un terzo pulsante, di STOP, che probabilmente potrebbe tornare molto utile.
Alla sua pressione potresti, per esempio, provvedere alla disattivazione "incondizionata" delle uscite e all'azzeramento, sempre incondizionato, dei cinque timer(s).
Superfluo forse scriverlo ma, ovvio che i due pulsanti di START dovrebbero essere ignorati sino al termine del ciclo.
Vedi se questo ti può essere di aiuto.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8982
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[20] Re: PIC timer preimpostato

Messaggioda Foto UtenteIlGuru » 8 set 2015, 23:33

Si possono aggiungere altri 3 pulsanti sulla PORTB che fanno scattare un' interrupt, RB0, RB7 ed RB7 senza tirare in ballo tipologie circuitali più complesse, però vanno messi dei condensatori antirimbalzo, e le resistenze di pull up si possono togliere perché si possono usare quelle interne del PIC.
Le resistenze piuttosto vanno messe sulle basi dei transistor per limitare la corrente.
L'interrupt service routine deve leggere il pulsante premuto ed impostare un valore in un registro per dire al ciclo in esecuzione quale procedura eseguire, alla fine resettare il flag di interrupt.
Il ciclo nel mail si occupa di richiamare la procedura da eseguire, o non fare niente se non è stato premuto nessun tasto.
Prima del ciclo, nel main, vanno attivati i pullup:
Codice: Seleziona tutto
nRBPU    =   0;

vanno impostati ad 1 i bit di TRISB che devono essere degli input ed a 0 quelli che devono essere output:
Codice: Seleziona tutto
TRISB           = 0b11110011; // RB2-RB3 output

stessa cosa per TRISA:
Codice: Seleziona tutto
TRISA           = 0b11111101; // RA1 output

Poi inizializzati i pin delle porte che devono essere a 0 per interdire i transistor.
Codice: Seleziona tutto
PORTA           = 0b11111101; // RA1 LOW
PORTB           = 0b11110011; // RB2-RB3 LOW


A questo punto mettendo a 1 i bit rispettivi delle due porte invece che a 0, tramire delle OR o AND logiche e delle opportune bitmask, sai come attivare i relè.
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
5.482 2 10 13
G.Master EY
G.Master EY
 
Messaggi: 1924
Iscritto il: 31 lug 2015, 23:32

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 11 ospiti