eug60 Inserito: 3 settembre 2004 Segnala Share Inserito: 3 settembre 2004 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 More sharing options...
stefano_ Inserita: 14 dicembre 2004 Segnala Share Inserita: 14 dicembre 2004 ciao, scusami se ti faccio una domanda sul tuo post anziche darti una risposta ,a sei la mia ultima possibilitae' 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 16f84if inporta & 2 = 1 Then "fa una cosa"else"fa un'altra cosa"end ifoppure ho provato conif a.2 = 1 Then "fa una cosa"else"fa un'altra cosa"end ifmi 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 anticipatamenteciao ciao Link al commento Condividi su altri siti More sharing options...
mario76 Inserita: 28 dicembre 2004 Segnala Share Inserita: 28 dicembre 2004 rispondo a stefanodevice 16f84if inporta & 2 = 1 Then "fa una cosa"else"fa un'altra cosa"end ifoppure ho provato conif a.2 = 1 Then "fa una cosa"else"fa un'altra cosa"end if-------------------------------->endif è attaccatostai attento è un'unica parola.per eug60 manda il sorgente che do un'occhiata. Link al commento Condividi su altri siti More sharing options...
stefano_ Inserita: 29 dicembre 2004 Segnala Share Inserita: 29 dicembre 2004 grazuie 1000 per la tua risposta Link al commento Condividi su altri siti More sharing options...
stefano_ Inserita: 30 dicembre 2004 Segnala Share Inserita: 30 dicembre 2004 per Mario76ciao, scusa se scrivo in questo forum ma a quando sembra sei l'unico che utilizza pic basic proe 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 conun tempo di 5ms,ora vorrei inserire una funzione che per esempio quando ho schiacciato per 5 volte un pulsantemi 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 displayquindi dovrei separare le 2 oprazioni in modo tale che anche quando accendo il led per 2 secondiil 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 More sharing options...
mario76 Inserita: 30 dicembre 2004 Segnala Share Inserita: 30 dicembre 2004 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 More sharing options...
mario76 Inserita: 30 dicembre 2004 Segnala Share Inserita: 30 dicembre 2004 ON INTERRUPTON INTERRUPT GOTO LabelON 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 handlermyint: led = 1 ' Turn on LED when interrupted RESUME ' Return to main program ENABLE ' Enable interrupts after handlerTo 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 More sharing options...
stefano_ Inserita: 30 dicembre 2004 Segnala Share Inserita: 30 dicembre 2004 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 More sharing options...
stefano_ Inserita: 2 gennaio 2005 Segnala Share Inserita: 2 gennaio 2005 per Mario76,il seguente codice dovrebbe far lampeggiare un led presente su RB4 ed al momento che schiaccio il pulsante su RA4CONTEMPORANEAMENTE 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 occhiatadevice = 16f628symbol pulsante = porta.4CONFIG XT_OSC , WDT_OFF , PWRTE_ON , BODEN_OFF , LVP_OFF , CP_OFFdim a as wordon interrupt goto miointintcon = %10010000 ' abilito l'interrupt relativo al cambiamento di stato di RB0 ed abilito il GIE (global interrupt)main:a = 0 trisa = %10000trisb = %11000000portb = 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 maindisable ' Questo proprio non so a cosa serve !!!!!!!!mioint:set portb.5delayms 1000low portb.5 resumeenable Link al commento Condividi su altri siti More sharing options...
mario76 Inserita: 3 gennaio 2005 Segnala Share Inserita: 3 gennaio 2005 perche tutto questo casino per una cosa cosi semplice?non serve un'interrupt per questo basta un loopdevice = 16f628CONFIG XT_OSC , WDT_OFF , PWRTE_ON , BODEN_OFF , LVP_OFF , CP_OFF'dichiarazione variabililamp var bytesymbol pulsante = porta.4symbol ledLampeggiante = portb.5'impostazione portetrisa = %10000trisb = %11000000ledlampeggiante=0lamp=0main:set portb.4delayms 500low portb.4if 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 interruptif pulsante =1 Then goto lampeggiogoto mainlampeggio:'routine per il lampeggio e per altre impostazionitoggle lampgoto main'adesso dovrebbe funzionare , controlla il collegamento sull'ingresso a.4: Link al commento Condividi su altri siti More sharing options...
mario76 Inserita: 3 gennaio 2005 Segnala Share Inserita: 3 gennaio 2005 se vuoi eventualmente usare l'interrupt il programma è un po diverso.innanzitutto non si puo usare ra4 per ingresso ma rb0perche 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 More sharing options...
stefano_ Inserita: 3 gennaio 2005 Segnala Share Inserita: 3 gennaio 2005 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 aiutianche perche ti ho già rotto abbastanza...dunque:sto realizzando un segnapunti con 4 display a 7 segmenti, 2 per visualizzare il punteggio della 1° squadrae 2 per visualizzare il punteggio della 2° squadra,e 2 pulsanti per incrementare il punteggio delle relativesquadre.Il programma l'ho impostato cosi:ho 2 variabili dove memorizzo il punteggio in decimale,ogni volta che schiaccio un pulsante incrementola relativa variabile, per visualizzare il punteggio sui 4 display non faccio altro che vedere ilvalore 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'infinitogoto mainIl programma l'ho testato e funziona correttamente, quello che non riesco a fare è accendere un singolo led per un secondo quandola somma del punteggio delle 2 squadre vale 5 o meglo riesco a farlo nel seguente modoif punteggio1+punteggio2 = 5 then set portb.1 delayms 1000 low portb.1end ifin 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 More sharing options...
mario76 Inserita: 4 gennaio 2005 Segnala Share Inserita: 4 gennaio 2005 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 More sharing options...
stefano_ Inserita: 4 gennaio 2005 Segnala Share Inserita: 4 gennaio 2005 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 More sharing options...
mario76 Inserita: 4 gennaio 2005 Segnala Share Inserita: 4 gennaio 2005 (modificato) praticamente, si! Modificato: 4 gennaio 2005 da mario76 Link al commento Condividi su altri siti More sharing options...
stefano_ Inserita: 8 gennaio 2005 Segnala Share Inserita: 8 gennaio 2005 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 cicliProgrammaper poi spegnerlo ma non funzione !!!loopPrincipaleif 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 endifif 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 endifendifgoto loopPrincipalea 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 More sharing options...
mario76 Inserita: 10 gennaio 2005 Segnala Share Inserita: 10 gennaio 2005 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 More sharing options...
mario76 Inserita: 10 gennaio 2005 Segnala Share Inserita: 10 gennaio 2005 prova a lasciarlo solo acceso, togliendo il codice:if contatempo =1000 Then ' trascorso 1000 cicli spengo il ledlow portb.4Acceso = 0 ' e riazzero questa variabileendifse rimane acceso okse si spegne vuol dire che cè un problema da qualche altra parte. Link al commento Condividi su altri siti More sharing options...
lutherblisset Inserita: 10 gennaio 2005 Segnala Share Inserita: 10 gennaio 2005 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 More sharing options...
stefano_ Inserita: 10 gennaio 2005 Segnala Share Inserita: 10 gennaio 2005 grazie 1000 Mario76faccio subito la prova Link al commento Condividi su altri siti More sharing options...
mario76 Inserita: 11 gennaio 2005 Segnala Share Inserita: 11 gennaio 2005 x lutherblissetCaro 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 More sharing options...
lutherblisset Inserita: 11 gennaio 2005 Segnala Share Inserita: 11 gennaio 2005 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 More sharing options...
stefano_ Inserita: 11 gennaio 2005 Segnala Share Inserita: 11 gennaio 2005 per Mario76OK ok ok ok ok funzia che una meraviglia Grazie 10000000000000000000000 !!!!!!! Link al commento Condividi su altri siti More sharing options...
mario76 Inserita: 12 gennaio 2005 Segnala Share Inserita: 12 gennaio 2005 per lutherblissetprova 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 More sharing options...
mario76 Inserita: 12 gennaio 2005 Segnala Share Inserita: 12 gennaio 2005 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 More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora