PIC timer preimpostato
Moderatore:
Paolino
42 messaggi
• Pagina 2 di 5 • 1, 2, 3, 4, 5
0
voti
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
IlGuru il 8 set 2015, 13:29, modificato 2 volte in totale.

0
voti
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.
1
voti
La gestione con interrupt non è strettamente obbligatoria, benché comoda.
Quello che suggerisco di non far mancare è l'antirimbalzo sugli ingressi dei pulsanti, pena comportamenti anomali del firmware.
Ciao.
Paolo.
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
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-

Paolino
32,6k 8 12 13 - G.Master EY

- Messaggi: 4226
- Iscritto il: 20 gen 2006, 11:42
- Località: Vigevano (PV)
0
voti
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:
Che compilatore userai?
Io uso xc8 di Microchip
quindi:
Poi viene il codice:
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
*/
}

1
voti
Ciao
bebos89, 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
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.
-

WALTERmwp
30,2k 4 8 13 - G.Master EY

- Messaggi: 8982
- Iscritto il: 17 lug 2010, 18:42
- Località: le 4 del mattino
0
voti
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:
vanno impostati ad 1 i bit di TRISB che devono essere degli input ed a 0 quelli che devono essere output:
stessa cosa per TRISA:
Poi inizializzati i pin delle porte che devono essere a 0 per interdire i transistor.
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è.
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è.

42 messaggi
• Pagina 2 di 5 • 1, 2, 3, 4, 5
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 5 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)



