Vai al contenuto
PLC Forum


Up Down - pic 16f877a


Marco40

Messaggi consigliati

Ciao a tutti mi presento mi chiamo Marco da qualche tempo sto cercando di capire come funzionano i pic ho gia fatto i primi passi con led lampeggianti e cose varie adesso vorrei passare al secondo livello e gestire due display a 7 segmenti , vorrei fare un programma che premendo un tasto mi incremente la cifra e premendo un altro tasto la decremente , ho da poco comprato una scheda usata ad una fiera la easypic4 che uso come banco di prova e programamtore e in rete ho trovato i vari esempi , e programmo tutto in C .

Negli esempi c'è un programma già fatto che mi permette di gestire un doppio display a due cifre , però l'incremento viene eseguito automaticamente da 0 a 99 e poi riparte questo è il programma :

#include "Display_utils.h"

unsigned short i, j, v, por1, por2;

void interrupt() {

if (v==0) {

PORTA = 0;

PORTD = por2; // prepare mask for digit

PORTA = 2; // turn on 1st, turn off 2nd 7seg.

v = 1;

} else {

PORTA = 0;

PORTD = por1; // prepare mask for digit

PORTA = 1; // turn on 2nd, turn off 1st 7seg.

v = 0;

}

TMR0 = 0;

INTCON = 0x20;

void main() {

OPTION_REG = 0x80;

por2 = 0x3F;

j = 0;

TMR0 = 0;

INTCON = 0xA0; // Disable PEIE,INTE,RBIE,T0IE

PORTA = 0;

TRISA = 0;

PORTD = 0;

TRISD = 0;

do {

for (i = 0; i<=99; i++) { // count from 0 to 99

j = i % 10u;

por1 = mask(j); // prepare appropriate digit

j = (char)(i / 10u) % 10u;

por2 = mask(j); // prepare appropriate digit

Delay_ms(1000);

}

} while (1); // endless loop

}//~!

Qualcuno di voi sarebbe così gentile da spiegarmi come posso modificarlo per far si che sia io con due tasti a decidere se incrementare o decrementare la cifra sul display ?

grazie ancora a tutti Marco

Link al commento
Condividi su altri siti


Guarda io non conosco il linguaggio in questione..però ho visto che hai messo un for che ti incremente la cifra...

invece dovresti inserire una variabile inizializzata a zero (che dovrebbe essere l'uscita sul display) che di volta in volta che pigi il pulsante up o down si incrementa di 1 o si decrementa di 1.

Programmino logico:

out=0

up=off

down=off

do

if up=on

out=out+1

"stampa" out

if down=on

out=out-1

"stampa" out

else

"stampa" out

while 99=>out>=0

Uhmmm mi sa che devo riprendere un pò di programmazione ahahhaha ph34r.gif

Link al commento
Condividi su altri siti

grazie maguls per la ta risposta , ho diciamo afferrato un po' il tuo discorso in parole povere devo sotituire il for e quindi il ripeti con un comando if ,se non ho capito male ?

Però sono ancora in alto mare comunque devo assegnare una porta del pic come ingrsso dove devo collegare i due pulsanti ed una porta del pic come uscita per collegare il display ,il ragionamento è giusto?

Link al commento
Condividi su altri siti

Consiglio di un vecchio.

Per leggere ingressi, che siano da pulsante o da altro, ho sempre usato una determinata metodologia.

1 - Si usa un timer con interrupt. Tipicamente 10 ms.

2 - Ad ogni interrupt si leggono gli ingressi e si memorizzano.

3 - Precedentemente sono stati memorizzati gli ingressi nel loro stato precedente.

4 - si confrontano gli stati attuali con quelli precedenti. Se lo stato coincide si considera come stabile.

5 - si confronta con lo stato stabile precedente e si verifica se c'è stata la variazione di stato che coincide con l'attivazione del pulsante.

6 - Secondo il pulsante premuto si associa l'evento-funzione.

Spiegata così sembra un'operazione lunghissima ma ti assicuro che son pochissime righe di istruzioni, molto meno di quelle che hai scritto.

Inoltre è preferibile non usare le funzioni di dalay se non quando è indispensabile.

Se non riesci a fare la funzione che ho descritto ti pubblico un esempio tratto da un'applicazione mia.

Questa discussione tratta una specie di corso per imparare ad usare i PIC attraverso esempi e spiegazioni.

Link al commento
Condividi su altri siti

Grazie Livio dopo provo a compilare un programma io per vedere se riesco a capire come funziona la cosa , in caso contrario sarò ben felice di vedere la tua applicazione, però se posso chiedervi ancora un grosso favore se il mio programma non dovesse funzionare vorrei pubblicarlo e chiedere a voi esperti dove sbaglio per rendermi conto dei mie errori , grazie ancora a tutti della diponibilità

Link al commento
Condividi su altri siti

Ciao a tutti dopo aver tentato varie prove e cercato di seguire i vostri consigli nulla da fare non riesco a fare eseguire ciò che voglio al progrmma qualcuno sa aiutarmi .

Link al commento
Condividi su altri siti

Debuggare i programmi è più difficile che scriverli. E' la prima cosa che bisogna impparare bene.

Spezza il tuo programma in tante celle elementari, mattoncini. Parti con quello fondamentale. Ad esempio verifica se ogni volta che premi un tasto questo viene riconosciuto.

Hai a disposizione un PICKIT non dovrebbe essere poi così macchinoso da verificare.

Una volta verificato che questo funziona, lo duplichi per l'altro tasto e ne verifichi il funzionamento, poi aggiungi il conteggio in avanti e verifichi, infine aggiungi il conteggio indietro.

Link al commento
Condividi su altri siti

Ciao Livio grazie per il consiglio , dopo provo a stendere un programma e vedere cosa esce, quello che io non riesco a capire come fare è dire al pic che ho premuto il tasto collegato su RB0 e deve incrementare partendo da 0 fino a 99 , e invece premendo il tasto RB1 deve decrementare da 99 a 0 , comunque domani con più calma farò delle prove come dici t creando deimattoncini e provando passo passo a costruire la casa.

Grazie ancora a tutti

Link al commento
Condividi su altri siti

Ti scrivo il codice in C secondo compilatore CCS


void main {

.....
  if( bit_test(portb, 0) {

         contasu();
   }

   if( bit_test(portb, 1) {

         contagiu();
   }

.......
}

void contasu()
   {
       contatore ++;
       if (contatore > 99) {
             contatore = 99;
        }
   }


void contagiu()
   {
       contatore --;
       if (contatore == 0) {
             contatore = 0;
        }
   }

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

Prima di tutto buon Natale a tutti

Grazie Livio per il tuo aiuto ma non riesco a fare un progrmma per pilotare un display in questo modo , ho provato a complilare un programma come mi avevi scritto tu ma il mio complilatore mi da errori su errori , nessuno usa o a mai usato il mikro C per complilare un programma ??

Link al commento
Condividi su altri siti

Che centra il pilotaggio del display?

Per prima cosa devi risolvere il problema del conteggio.

Guarda che probabilmente il micrC avrà delle "builtin function" differenti.

Però io sostengo da sempre che prima di usare linguaggi evoluti, bisogna imparare ad usare l'assembler, perchè è l'unico modo che permette di capire veramente come funziona il micro.

Se tu usassi l'assembler avresti già risolto il problema ed avresti capito bene come si fa.

Link al commento
Condividi su altri siti

Ciao Livio ho usato il C perchè mi è stato consigliato poi ho trovato questa scheda per programmare della mickroelettronica , e mi sono gettato nel C , alla fine non riesco a capire come far eseguire il conteggio non pilotare il display mi ero esperesso male

Link al commento
Condividi su altri siti

Come per ogni problema di automatica, ma non solo, esiste una strategia ed una tattica.

Prima si stabilisce la tattica, ovvero la filosofia che sovraintende alla risoluzione generale del problema, poi da questa ne discende la tattica, cioè il modo più efficace di risolvere il problema nell'ambito della strategia scelta.

Tu hai, consapevolemente o inconsapevolmente, scelto la strategia però ti sei impantanato nella tattica.

Hai 2 ingressi premendone uno il contatore avanza, premendo l'altro il contatore retrocede.

Hai associato l'avanzamento all'ingresso 0 della porta B, e la retrocessione all'ingresso 1 della porta B.

Per prima cosa dovrai configurare i bit 0 e 1 della porta B come ingressi, quindi devi programmare allo scopo il registro TRISB, quindi dovrai avere TRISB = xxxx.xx00 oerchè mettendo a 0 il bit corrispondente è configurato come ingresso.

Poi dovrai verificare che:

1 - Il bit 0 del parta B sia passato dallo stato di 0 a quello di 1 e vi permanga per almeno 10 ms. Se questo avviene incrementi il contatore.

2 - Medeisma verifica per il bit 1 della porta B. Se questo avviene decrementi il contatore.

Come fare? Io ti indicato il modo semplificato (manca il filtro da 10 ms). A parte il richiamo alla built in function del compilatore CCS, il metodo è universalmente valido.

Però forse il vero problema è che tu ti sei buttato a programmare in "C" senza conoscere a fondo l'attrezzo (C compiler mikroC, am anche il geenrico "C" language) e, soprattutto, ignorando il funzionamento del microcontrollore.

Speeso si presume che saltando a piè pari i vari passaggi si risparmi tempo.

NO! Se ne perde di più.

La casa si costruisce dalle fondamenta, non dal tetto.

Si inizia a studiare il controllore, poi magari si programma con linguaggio evoluto.

Per prima cosa ci si deve studiare il datasheet del processore, anche se son 200 e più pagine.

Lo si fa passo passo, magari facendo anche qualche prova in assembler. Tanto è gratis. Scarichi MPLAB ed hai già tutto. Tra l'altro, se non vado errato, il microC è provvisto del plu in per MPLAB.

Link al commento
Condividi su altri siti

Ciao Livio si effettivamente ho voluto fare il passo più lungo della gamba e mi ritrovo con un mal di testa nel cercare di risolvere il problema che non ti dico , ormai il mio compilatore da più errori di me .

Apparte scherzi non riesco a capire dove sbaglio ho provato e riprovato ma non c'è verso , sto cercando un programma per capire come fare in rete ma non c'è nessuno sa aiutarmi , mi basterebbe un esempio scritto con il compilatore della mickro per farmi un idea , lo so che è una richiesta che va contro le regole del forum ma devo capire come e dove sbaglio .

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