Vai al contenuto
PLC Forum


Picbasicpro


eug60

Messaggi consigliati

Salve a tutti, da un po di tempo mi diletto alla programmazione dei Pic con PicBasicPro con grande soddisfazione, il mio ultimo lavoro prevede l'utlizzo di un 16F876A e di un display lcd sul quale vengono visualizzate delle frasi che però sono salvate su una 24c16 e richiamate a secondo delle necessità, il probema che incontro è il seguente; il compilatore mi da un errore in fase di compilazione del programma che ho appurato è dovuto al fatto che ho sconfinato con il numero delle istruzioni del progamma anche se nella finestra "Program memory" si vede che sono all 40% di utilizzo della memoria disponibile.

Sono io che sbaglio qualcosa, è un limite del PicBasicPro........

Qualcuno mi può aiutare???????

:(:(:(:(:(

Link al commento
Condividi su altri siti

  • 3 months later...

ciao,

scusami se ti faccio una domanda sul tuo post anziche darti una risposta ,a sei la mia ultima possibilita

e' da qualche giorno che sto cercando di imparare a programmare i pic utilizzando pic basic pro, dovrei testare un pulsante collegato su ra2 per verificare se è premuto oppure no, il codice che ho scritto è il seguente:

device 16f84

if inporta & 2 = 1 Then "fa una cosa"

else

"fa un'altra cosa"

end if

oppure ho provato con

if a.2 = 1 Then "fa una cosa"

else

"fa un'altra cosa"

end if

mi da sempre errore: "else assignment operator missing" perche ??? che devo fare per sapere se il pulsante è premuto o no ??????

Scusami ancora se ti ho scritto qui e grazie anticipatamente

ciao ciao

Link al commento
Condividi su altri siti

  • 2 weeks later...

rispondo a stefano

device 16f84

if inporta & 2 = 1 Then "fa una cosa"

else

"fa un'altra cosa"

end if

oppure ho provato con

if a.2 = 1 Then "fa una cosa"

else

"fa un'altra cosa"

end if

-------------------------------->

endif è attaccato

stai attento è un'unica parola.

per eug60 manda il sorgente che do un'occhiata.

Link al commento
Condividi su altri siti

per Mario76

ciao,

scusa se scrivo in questo forum ma a quando sembra sei l'unico che utilizza pic basic pro

e sopratutto sei l'unico in grado di aiutarmi, ti chiedo un'ultima cosa ( spero )

dovrei eseguire 2 diverse operazioni contemporaneamente, mi spiego

il mio prg è composto da un ciclo infinito accende 4 display 7 segmenti multiplexandoli con

un tempo di 5ms,

ora vorrei inserire una funzione che per esempio quando ho schiacciato per 5 volte un pulsante

mi accende un led per 2 secondi, il problema come puoi capire è che se nel programma principale

accendo un led per 2 secondi, per 2 secondi blocco il multiplexing che mi fa accendere i 4 display

quindi dovrei separare le 2 oprazioni in modo tale che anche quando accendo il led per 2 secondi

il ciclo principale che cambia 4 uscite con una pausa di 5ms per accendere i display non si blocchi.

Ho sentito paralare di interrupt ma non so cosa sia o meglio come si utilizza con pic basic pro.

Saresti così gentile da farmi un semplice esempio per risolvere il mio problema o almeno darmi un

indirizzata ?? Oppure è più complesso di come credo ??

Grazie 1000 anticipatamente e buon anno a tutti

Link al commento
Condividi su altri siti

allora, secondo me, ti converrebbe utilizzare un display lcd. in questo modo puoi fare tutto quello che vuoi perche il display si memorizza il dato (io infatti ho ormai eliminato i display a 7 segmenti perche difficili da gestire, e il circuito diventa molto complesso). E qui penso che non dovresti avere problemi a inserire un delay di 2000 mS.

Nel caso in cui per tua scelta vuoi tenere i display 7 seg, allora ti conviene fare la seguente:

intanto studiati il manuale: http://microengineeringlabs.com/resources/pbpmanual/

poi leggere il datasheet del pic che usi e vedere quale registro bisogna configurare per attivare l'interrupt

(solitamente è intcon). naturalmente solo rb0 preve l'uso dell'interrupt.

le istruzioni sono le seguenti:

ON INTERRUPT GOTO etichetta '

INTCON = %10010000 ' abilita interrupt su rb0

'programma principale

DISABLE ' disabilita interrupt (oppure puoi disattivarlo impostando il registro intcon)

etichetta:

'

' Turn on LED when interrupted

RESUME ' ritorna al programma

ENABLE ' riabilita interrupt (puoi usare intcon=%10010000, è lo stesso)

Link al commento
Condividi su altri siti

ON INTERRUPT

ON INTERRUPT GOTO Label

ON INTERRUPT allows the handling of microcontroller interrupts by a PicBasic Pro subroutine.

There are 2 ways to handle interrupts using the PicBasic Pro Compiler. The first is to write an assembly language interrupt routine. This is the way to handle interrupts with the shortest latency and lowest overhead. This method is discussed under advanced topics in a later section.

The second method is to write a PicBasic Pro interrupt handler. This looks just like a PicBasic Pro subroutine but ends with a RESUME.

When an interrupt occurs, it is flagged. As soon as the current PicBasic Pro statement=s execution is complete, the program jumps to the BASIC interrupt handler at Label. Once the interrupt handler is complete, a RESUME statement sends the program back to where it was when the interrupt occurred, picking up where it left off.

DISABLE and ENABLE allow different sections of a PicBasic Pro program to execute without the possibility of being interrupted. The most notable place to use DISABLE is right before the actual interrupt handler. Or the interrupt handler may be placed before the ON INTERRUPT statement as the interrupt flag is not checked before the first ON INTERRUPT in a program.

Latency is the time it takes from the time of the actual interrupt to the time the interrupt handler is entered. Since PicBasic Pro statements are not re-entrant (i.e. you cannot execute another PicBasic Pro statement while one is being executed), there can be considerable latency before the interrupt routine is entered.

PBP will not enter the BASIC interrupt handler until it has finished executing the current statement. If the statement is a PAUSE or SERIN, it could be quite a while before the interrupt is acknowledged. The program must be designed with this latency in mind. If it is unacceptable and the interrupts must be handled more quickly, an assembly language interrupt routine must be used.

Overhead is another issue. ON INTERRUPT will add an instruction after every statement to check whether or not an interrupt has occurred. DISABLE turns off the addition of this instruction. ENABLE turns it back on again. Usually the additional instruction will not be much of a problem, but long programs in small microcontrollers could suffer.

More than one ON INTERRUPT may be used in a program.

ON INTERRUPT GOTO myint ' Interrupt handler is myint

INTCON = %10010000 ' Enable RB0 interrupt

. . .

DISABLE ' Disable interrupts in handler

myint: led = 1 ' Turn on LED when interrupted

RESUME ' Return to main program

ENABLE ' Enable interrupts after handler

To turn off interrupts permanently (or until needed again) once ON INTERRUPT has been used, set INTCON to $80:

INTCON = $80

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

certo che il modo per gestire meglio l'interrupt è tramite assembler.

ma io preferisco quello in basic.

comunque devi sempre avere a portata di mano manuale del pic basic e datasheet. sempre.

ciao e buon lavoro.

Link al commento
Condividi su altri siti

effettivamente ho tutto,

il manuale ed il data datasheet solo che è tutto in inglese e non è molto facile, comunque con il tuo aiuto ed il manuale penso di poter andare avanti,

grazie 1000 ancora per il tuo preziosissimo aiuto...

grazie e buon anno !!!!!

Link al commento
Condividi su altri siti

per Mario76,

il seguente codice dovrebbe far lampeggiare un led presente su RB4 ed al momento che schiaccio il pulsante su RA4

CONTEMPORANEAMENTE al led presente su RB4 dovrebbe lampeggiare il led presente su RB5 come puoi immaginare questo non accade !?!?!?

Ecco il codice ti sarei molto grato se potessi dargli un occhiata

device = 16f628

symbol pulsante = porta.4

CONFIG XT_OSC , WDT_OFF , PWRTE_ON , BODEN_OFF , LVP_OFF , CP_OFF

dim a as word

on interrupt goto mioint

intcon = %10010000 ' abilito l'interrupt relativo al cambiamento di stato di RB0 ed abilito il GIE (global interrupt)

main:

a = 0

trisa = %10000

trisb = %11000000

portb = 0

main:

set portb.4

delayms 500

low portb.4

delayms 500

' Se schiaccio il pulsante presente su RA4 cambio lo stato di rb0 in modo tale da far verificare il relativo interrupt

if pulsante =0 Then toggle portb.0

goto main

disable ' Questo proprio non so a cosa serve !!!!!!!!

mioint:

set portb.5

delayms 1000

low portb.5

resume

enable

Link al commento
Condividi su altri siti

perche tutto questo casino per una cosa cosi semplice?

non serve un'interrupt per questo basta un loop

device = 16f628

CONFIG XT_OSC , WDT_OFF , PWRTE_ON , BODEN_OFF , LVP_OFF , CP_OFF

'dichiarazione variabili

lamp var byte

symbol pulsante = porta.4

symbol ledLampeggiante = portb.5

'impostazione porte

trisa = %10000

trisb = %11000000

ledlampeggiante=0

lamp=0

main:

set portb.4

delayms 500

low portb.4

if lamp=1 then toggle LedLampeggiante

' Se schiaccio il pulsante presente su RA4 cambio lo stato di rb0 in modo tale da far verificare il relativo interrupt

if pulsante =1 Then goto lampeggio

goto main

lampeggio:

'routine per il lampeggio e per altre impostazioni

toggle lamp

goto main

'adesso dovrebbe funzionare , controlla il collegamento sull'ingresso a.4:

Link al commento
Condividi su altri siti

se vuoi eventualmente usare l'interrupt il programma è un po diverso.

innanzitutto non si puo usare ra4 per ingresso ma rb0

perche rbo gestisce l'interrupt (vedi datasheet)

poi disable serve ad evitare che nella routine di interrupt si riabilita l'interrupt un'altra volta.

Link al commento
Condividi su altri siti

ciao, Mario76,

penso di non aver capito oppure ( sicuramente ) mi sono spiegato male,

adesso ti spiego precisamente il mio problema poi se hai tempo da buttare e vogli mi aiuti

anche perche ti ho già rotto abbastanza...

dunque:

sto realizzando un segnapunti con 4 display a 7 segmenti, 2 per visualizzare il punteggio della 1° squadra

e 2 per visualizzare il punteggio della 2° squadra,e 2 pulsanti per incrementare il punteggio delle relative

squadre.

Il programma l'ho impostato cosi:

ho 2 variabili dove memorizzo il punteggio in decimale,ogni volta che schiaccio un pulsante incremento

la relativa variabile, per visualizzare il punteggio sui 4 display non faccio altro che vedere il

valore della variabile ed in base al valore utilizzando " select case " accendo i segmenti dei display.

L'accensione dei display avviene in multiplexing nel seguente modo:

se per esempio il punteggio è 9 a 12

spengo il primo display aspetto 5ms imposto le uscite in modo da visualizzare il numero 9 ed accendo il

secondo display, aspetto 5ms imposto le uscite per visualizzare il numero 1 spengo il secondo display ed accendo il terzo,

aspetto 5ms imposto le uscite per visualizzare il numero 2 spengo il terzo display ed accendo il quarto, e poi ricomincio dall'inizio.

Tutto il codice che ho descritto viene eseguito all'infinito

main:

codice che viene eseguito all'infinito

goto main

Il programma l'ho testato e funziona correttamente, quello che non riesco a fare è accendere un singolo led per un secondo quando

la somma del punteggio delle 2 squadre vale 5 o meglo riesco a farlo nel seguente modo

if punteggio1+punteggio2 = 5 then

set portb.1

delayms 1000

low portb.1

end if

in questo modo pero blocco il multiplexing dei display per tutto il tempo che il led mi rimane acces ( 1 secondo )

io invece vorrei far accendere il led senza però bloccare il multiplexing ( 5ms ) dei 4 display.

Non so se mi sono spiegato, spero proprio di si comunque ti ringrazio per il tempo che mi hai dedicato....

grazie 1000

Link al commento
Condividi su altri siti

allora secondo me, ti conviene inserire una variabile al'interno del ciclo del multiplex. questa variabile si incrementa e quando arriva ad un valore che hai impostato e che corrisponde a circa 1 secondo cambia lo stato del led. se ho tempo scrivo qualche riga di esempio

Link al commento
Condividi su altri siti

se per esempio ad eseguire il programma il pic impiega 2ms ( non so quanto è ) tu mi dici di tener acceso il led per 500 cicli dopodiche lo spengo cosi è stato acceso circa 1 secono ???

Dico bene?

Grazie 1000 ancora !!!!!!!!!!!!!!

Link al commento
Condividi su altri siti

carissimo Mario76,

mi dispiace disturbarti nuovamente ma proprio non riesco a capire cosa è che non va,

ti invio il pezzo di programma che dovrebbe gestire l'accensione di un led per un determinato numero di cicliProgramma

per poi spegnerlo ma non funzione !!!

loopPrincipale

if Contanumero1 = 5 and acceso = 0 then ' se il punteggio della prima squadra è arrivato a 5

set portb.4 'accendo il led

Acceso = 1 ' setto ad 1 questa variabile

endif

if Contanumero1 = 5 and acceso = 1 then ' se il punteggio della prima squadra è arrivato a 5 ed ho acceso il led

contatempo = contatempo+1 ' inizio a contare il numero di cicli programma

if contatempo =1000 Then ' trascorso 1000 cicli spengo il led

low portb.4

Acceso = 0 ' e riazzero questa variabile

endif

endif

goto loopPrincipale

a parte la pessima struttura del codice comunque a prima vista dovrebbe funzionare, invece quando arrivo a 5 il led si accende solo per un brevissimo istante e poi si spegne, ho provato ad aumentare i cicli da attendere da 1000 fino a 5000000 fa non cambia nulla !!!!!!!!!!!!!!!!!!!!!!!!!!!

GRazie 1000 come sempre

Link al commento
Condividi su altri siti

il codice sembra giusto. praticamente è come quello che ti dicevo. probabilmente sono due le ipotesi per cui si spegne il led: 1) la variabile acceso da qualche parte si azzera, 2) viene utilizzata la prta b.4 da qualche altra parte e si azzera. comunque guardero con piu attenzione il codice e ti faro sapere.

Link al commento
Condividi su altri siti

prova a lasciarlo solo acceso, togliendo il codice:

if contatempo =1000 Then ' trascorso 1000 cicli spengo il led

low portb.4

Acceso = 0 ' e riazzero questa variabile

endif

se rimane acceso ok

se si spegne vuol dire che cè un problema da qualche altra parte.

Link al commento
Condividi su altri siti

Ciao mario io ho un problema simile a quello di stefano(ma senza tasti da attivare) e cioè:Io ho preso un codice dal sito della microengeenering labs: http://www.melabs.com/resources/samples/x1...1/pbp/tempx.bas che serve a leggere la temperatura dal ds1820 della dallas.Ho naturalmente riadattato il software per il 16f84 e in effetti(collegando il pic a hyperterminal) funziona rilevando la temperatura correttamentee mostrandola sullo schermo.Il mio problema è che io uso lo stesso pic per accendere(in multiplexer)i led che serviranno a visualizzare la temperatura,ma siccome la rilevazione della stessa dal 1820 avviene ogni 2 secondi,nel frattempo il display si spegne naturalmente perchè il suo conteggio è molto più veloce e non può aspettare 2 secondi,in questi casi bisogna per forza usare 2 pic(uno per la rilevazione della temperatura e uno per il conteggio relativo alla sezione display)o c'è un'altra soluzione più semplice?

Link al commento
Condividi su altri siti

x lutherblisset

Caro lutherblisset elimina i dispaly 7 segmenti. Sono costosi richiedono un master ed un circuito piu complesso, consumano di piu, non puoi testare bene i programmi, ed il programma diventa pesante. utilizza invece un display lcd anche 8 colonne x 2 righe. costano ormai poco. tutta un'altra cosa. il progetto diventa anche piu professionale. ciao

Link al commento
Condividi su altri siti

caro mario 76,non posso perchè deve essere visibile da lontano ed essere grande e luminoso infatti ho comprato digit giganti,facevi prima a dirmi che non si può..........

Link al commento
Condividi su altri siti

per lutherblisset

prova ad utilizzare un quarzo di 20MHZ (devi usare il pic 16f84 che prevede questo clock). comunque la lettura della temperatura non viene fatta ogni msec, quindi puoi scegliere ad esmpio un tempo di aggiornamento di 1Sec. quindi ti conviene fare una routine principale per la visualizzazione dei display, poi dopo magari 100 cicli passa ad una subroutine di aggiornamento della temperatura che comunque per poi tornare quindi alla visualizzazione del dato.

Link al commento
Condividi su altri siti

comunque pensavo che potevi utilizzare un integrato della maxim che gestisce diversi tipi di display e il multiplex. puoi passare il dato attraverso la porta seriale o i2c. sono ottimi.

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