Secondo voi può andare? Ho provato a simularlo con PIC SIMULATOR IDE 5.20 ma non funziona cioè arrivato alla funzione sleep il programma si ferma e se metto a ON una delle
4 linee di input della porta B non succede niente. Ho notato inoltre che se assembo e compilo lo stesso programma con PIC SIMULATOR IDE mi vengono fuori degli errori che non avevo con Mplab. Aiutatemi a capire come funziona questo software che trovo molto utile. Grazie. Francesco
Didn't find your answer? Ask the community — no account required.
K
Kappa
"Francesco" ha scritto nel messaggio:
Ciao.
Dovrebbe essere semplice ...
Non importa aggiungere un ORG, il compilatore sa gia si aggiungere all'indirizzo 5 PM il resto del codice ...
qui aggiungere il PULL-UP sul PORTB non fa male .... se ti serve ...
bcf OPTION_REG, RBPU
Qui è consigliabile inserire un LOOP che dici ???? Una volta eseguiro il primo SLEEP ... dove va ??? Si dovrebbe resettasre ma meglio sistemarlo no ???
Aggiungerei ...
Wait_Loop sleep goto Wait_Loop
Ti accorgi solo del primo passaggio, meglio inserire uno XOR sul valore del BIT almeno inverte lo stato a tutti gli INTERRUPT
ALLERME: movlw 0b00000001 xorwf PORT_A,F retfie
Manca il salvataggio dell'ambiente di lavoro W, FSR, STATUS ecc ... cmq dovrebbe andare ...
Prova a ricontrollare ...
delle
Hai provato con MPLAB 6.60 .... l'ambiente IDE ufficiale di microchip ... se non funziona li .... non va di sicuro ....
Di niente.
Gabriele.
F
Francesco
Ciao Gabriele, grazie per aver risposto, non ci speravo più. Allora, ho fatto le modifiche che mi hai indicato ed ho aggiunto un ciclo di ritardo ( LOOP). Il ciclo di ritardo LOOP lo ricavato dal programma PicLoops. Ho fatto la simulazione con Mplab 5.00 però arrivato al ciclo di ritardo non ne esce più forse perchè devo aspettare molto cioè la simulazione non avviene in tempo reale cioè a 4 MH? Se è così, quanto tempo devo aspettare per un ciclo di ritardo di 1 secondo? Questo è il programma modificato.
Ci sono errori? Come posso ritardare l'evento interrupt di una 15 di secondi cioè dove devo mettere il ritardo ? Mi spiego meglio sto costruendo un antifurto per auto collegando il circuito alle porte dell'auto, per cui dopo che accendo il circuito vorrei che aspettasse un 15 di secondi prima di controllare le porte ( le porte sono collegate ai pin della porta B per gli interrupt). Grazie per la disponibilità. Francesco
K
Kappa
"Francesco" ha scritto nel messaggio:
Ciao ...
Non controllo spesso il neswgroup, ma se posso dare una mano lo faccio volentieri.
di
Un ciclo di ritardo si chiama "DELAY" ;-) ...
non
Perchè usi MPLAB così vecchio ??? Scarica il nuovo MPLAB IDE 6.60 .... effettivamente con quella vechhia verzione la simulazione è un pò lenta 15 secondi possono diventare 1 minuto, nella nuova versione non è ancora in real-time ma ci manca poco ... ti consiglio di aggiornarla.
secondo?
La cosa è indefinibile, dipende anche dalla velocità del PC (almeno con la vers. 5.00, con la 6.60 è real-time o giu di lì).
A prima vista sembra di no, comuque per una maggior chiarezza di lettura, metti le routine prima del programma principale ... ;-). Noto una modifica all' ISR (Interrupt Service Routine) perchè non togli lo XORWF sul PORTA se lo fai lampeggirae da solo, non serve più a questo punto ... no ???
devo
Il pic va in SLEEP, appena arriva un evento, setta un FLAG, non appena esce dall'ISR, il programma principale controllerà questo FLAG, se è HIGH (stato precedente LOW) eseguirà un ritardo di 15 sec e poi la procedura, una volta finito si riporta all'inzio, ovvero il SLEEP. Se il FLAG è invariato ritorna in SLEEP senza eseguire alcunchè.
circuito
Con i PIC ti sarai reso conto anche tu che l'unica limitazione è nella fantasia.
Per tornare al tuo programma se vuoi (senza toccare neite del tuo ingegno) posso vedere di dargli una ritoccattina, almeno impari anche qualche trucchetto ;-)
Fammi sapere.
Ci mancherebbe.
Gabriele.
F
Francesco
Ciao, ho messo in download mplab 6.60 tra qualche giorno posso utilizzarlo( modem
56 K). Fai pure le modifiche vuoi così poso imparare nuove cose. Vorrei come ti avevo detto che il pic aspettasse un 15-20 secondi prima di testare i pin della porta B ( tempo necessario per poter uscire dall' auto), poi deve andare in sleep in modo da consumare poca corrente, poi con l'evento interrupt ( apertura di una delle porte dell'auto)deve mettere a 1 una delle linee della porta A per circa un secondo perchè sulla porta A collego un tasto di un cellulare per mandare la chiamata :-) Ora vorrei fare questo poi più in là faremo un'altra piccola modifica. Grazie ancora. Francesco
ciclo
se
esce
(stato
volta
ritorna
sono
K
Kappa
"Francesco" ha scritto nel messaggio
modem
Prima o poi arriverà ... :-) ...
Fatte ecco quello che ho scritto, ho anche lo ZIP del progetto pronto se ti interessa, ma devi dirmi come mandartelo.
;************************************************************ ;* * ;* Antifurto a distanza. * ;* * ;* Author : Francesco, Kappa * ;* Company : Nessuna * ;* Date : 12 Aprile 2004 * ;* * ;* Type : Microchip PIC16F84A-04/SP * ;* Tcycle : 1.00 us * ;* WDT : OFF * ;** ;* Release : 0.01 * ;** ;* History : * ;* 11 Agosto 2004 - Versione 0.01 controllo stato * ;* ingressi, gestione ALLARMI. * ;** ;************************************************************
Questo ga lo fa, aspetta evento su PORTB, aspetta 15 secondi, e poi setta per un secondo un bit di PORTA, per poi tornare il SLEEP.
Come vuoi.
Di niente.
Gabriele.
F
Francesco
Ciao puoi mandare il file zippato al seguente indirizzo togliendo NOSPAM:
snipped-for-privacy@NOSPAMlibero.it
Hai tutto questo in poco tempo, sei un genio dell'assembler :-) Spero di capire tutto il listato. Non so come ringraziarti. Francesco
K
Kappa
"Francesco" ha scritto nel messaggio
Ciao.
Inviato.
Non un genio ... magari ... è che ci lavoro tutti i giorni quindi non è difficile per me.
Normalmente commento abbastanza i miei listati, ma qualcosa forse non ti sarà chiaro, chiedi se hai biogno.
Ci mancherebbe ... :-) ... quando avrai imparato fai come faccio io ;-).
Ciao Gabriele.
F
Francesco
Ciao, ho dato uno sguardo al listato e devo dire che ci ho capito poco :-( Comunque mi pare di aver capito, correggimi se sbaglio, che il pic aspetti
15 secondi dopo che è partito l'interrupt mentre io vorrei che il pic , una volta acceso, non facesse niente per 15 secondi ( tempo per uscire dall'auto) altrimenti come apro la porta per uscire mi parte l'allarme; quindi ricapitolando, accendo il circuito, aspetta 15 secondi, dopo di chè l'eventuale apertura di una delle porte dell'auto deve far partire l'interrupt (cioè l'allarme) che deve mettere subito a 1 il bit 0 della porta A per circa 1 secondo per poi ritornare a zero. Poi possiamo fare una piccola modifica ( e forse è questo che tu intendevi con i 15 secondi) cioè quando il circuito è accesso ed io devo aprire la portiera, ovviamente parte l'allarme per cui possiamo fare che l'allarme parti dopo un 5-10 secondi, tempo per spegnere il circuito. Se poi sai come creare e gestire un telecomando per disattivare l'allarme sarebbe il massimo :-) Vabbe ora limitiamoci a questo. Francesco
K
Kappa
"Francesco" ha scritto nel messaggio
Ciao.
Piano piano lo capirai ... soprattutto simulandolo ...
una
OK, non è una grossa complicazione basta inserire un ritardo all'accensione.
OK sistemo anche questa parte ...
OK questo c'è già, 15 secondi, casomai metto un #define all'inizio del programma così impostiamo 3 valori di timer:
- Accensione.
- Ritardo Antifurto.
- Tempo high BIT su port A.
Se vuoi anche quello mi devi pagare :-P .... stò scherzando. Cosa vuoi usare per fare ciò ??? Un modulo Aurel ??? Hai qualche preferenza ??? Vuoi fare anche un telecontrollo a distanza con GSM, magari anche con il GPS ... sarebbe na figata :-) ... manda un SMS se la macchina si muove ... mandando anche le coordinate. Possiamo anche chiamare noi l'auto per sapere dove stà, magari facendo anche scattare l'antifurto e/o accendendo spegnendo uscite.
Guarda anche al fuuro :-).
Controlla la posta dopo mezzanotte ... dovrebbe essere pronto.
Ciao Gabriele.
F
Francesco
Ciao ho letto la posta e fra un pò posso simulare il programma con mplab così ci capisco meglio. A cosa servono gli altri file che ci sono nel progetto tipo Francesco.mcp .mcs .mcw?
l'allarme
usare
mandando
stà,
Questo magari si può fare più in là, così mi complico ancora di più. Puoi darmi qualche informazione sul modulo Aurel, qualche link va anche bene. Sarebbe bello comandare il circuito con un telecomando. Se vuoi ti mando il disegno del circuito in formato Fidocad così gli dai anche uno sguardo correggendo un pò di errori che sicuramente ci saranno. Come hai capito il circuito deve funzionare in auto e vorrei utilizzare la batteria dell'auto, poi anche gli ingressi cioè le portiere sono a 12 V ma il pic, se non sbaglio, non accetta 12 V in input come posso fare? Grazie Francesco
K
Kappa
"Francesco" ha scritto nel messaggio:
Ciao ...
ci
Sicuramente meglio del 5.00, nella vers. 6.60 l'interfaccia grafica è un pò cambiata, ma molto familiare ...
Sono file del progetto, Watch Windows, Setup imulazione, ecc ...
formatting link
Bello e non molto complicato ...
Ok ... posso dargli un'occhiata ... meglio OrCad .. no ??? :-)
Hai ragione il PIC accetta solo ingressi 0-Vcc o meglio 0-5V. ci sono molti modi, trattandosi di un solo ingresso, possiamo:
1) Mettere una resistenza che 10K verso il PIN e un diodo con Anodo al PIN e Katodo a VCC.
2) Costruire un partitiore, in modo da avere 5 volt con ingresso 14,4 Volt (Tensione batteria in carica).
3) Usare dei disaccoppiatori ottici.
(1) - (2) sono semplici (3) migliore ma un pò piu complicata.
Di niente.
Gabriele.
F
Francesco
Ciao, ho simulato il programma con mplab 6.60 e funziona però facendo Animate è troppo lento mentre con Run è veloce però non vedo i cambiamenti in Special Function Register. In pratica per capire se il programma funziona ho fatto Run e dopo un pò stoppavo per vedere dove era arrivato, poi gli davo l'input e così via. Come simuli tu il programma? Prima di fare la simulazione deve fare sempre Make? C'è un modo per vedere in tempo reale(o quasi) i cambiamenti nel Special Function Register? Ti allego il circuito con cui sto facendo le prove del programma dove al posto del cellulare sto utilizzando una calcolatrice cioè ho saldato due fili su un tasto :-) Ho provato il programma con questo circuito ma non va. Purtroppo non ho Orcad. Nel disegno del circuito manca qualcosa tipo il reset ma la parte che mi interessa penso sia l'ingresso su RB5.
[FIDOCAD] TY 150 55 5 3 270 0 0 * Pic 16f84 LI 160 60 180 60 MC 185 60 0 0 980 LI 180 60 185 60 LI 185 70 170 70 LI 170 70 170 65 LI 170 65 160 65 LI 185 60 200 60 MC 200 60 0 0 170 MC 200 70 0 0 170 LI 185 70 200 70 LI 210 60 220 60 LI 210 70 220 70 MC 220 60 3 0 040 MC 220 70 3 0 040 LI 160 55 170 55 LI 170 55 170 40 LI 170 40 120 40 LI 120 40 120 55 TY 170 50 5 3 90 0 0 * RA0 BE 145 48 145 52 150 52 150 48 LI 135 70 130 70 LI 130 70 130 110 MC 130 110 0 0 040 TY 160 61 4 2 0 0 0 * 15 TY 160 56 4 2 0 0 0 * 16 TY 160 51 4 2 0 0 0 * 17 MC 135 50 0 0 650 TY 130 66 5 3 0 0 0 * 5 LI 160 70 165 70 LI 165 70 165 80 LI 165 80 180 80 TY 160 66 4 2 0 0 0 * 14 LI 160 90 165 90 LI 165 90 165 100 TY 160 86 4 2 0 0 0 * 11 TY 167 95 4 2 0 0 0 * RB5 TY 188 63 4 2 0 0 0 * 4 MH TY 207 56 4 2 0 0 0 * 27 pF TY 207 66 4 2 0 0 0 * 27 pF MC 180 80 0 0 170 LI 175 80 175 75 LI 190 80 200 80 LI 175 75 225 75 MC 225 75 0 0 010 TY 232 73 4 2 0 0 0 * Vcc = 5 V MC 220 80 3 0 040 LI 200 80 221 80 TY 187 76 4 2 0 0 0 * 100 nF MC 95 55 0 1 340 MC 95 85 0 0 040 LI 95 75 95 85 LI 75 55 60 55 TY 95 50 5 3 0 0 0 * 1 TY 95 75 5 3 0 0 0 * 2 TY 75 50 5 3 0 0 0 * 5 TY 75 75 5 3 0 0 0 * 4 TY 100 71 5 3 90 0 0 * 4n25 LI 60 55 45 55 MC 45 55 2 0 074 LI 75 75 45 75 MC 45 75 2 0 074 TY 34 93 5 3 90 0 0 * Contatti cellulare LI 95 55 120 55 MC 245 110 0 0 010 TY 253 108 4 2 0 0 0 * Vcc = 5 V LI 225 110 245 110 MC 205 110 1 0 115 TY 195 103 5 3 0 0 0 * 10 K LI 205 110 225 110 LI 165 100 190 100 LI 190 100 190 110 LI 190 110 195 110 MC 185 110 1 0 750 LI 185 110 190 110 LI 130 110 132 110 LI 132 110 170 110
K
Kappa
"Francesco" ha scritto nel messaggio
Ciao ... hai anche la mia email ... questo post altrimenti diventa lungo un secolo ... ;-).
Special
La funzione "Animate" ha una velocità impostabile, controlla nelle opzioni ... Special Function Register, sono i registri del Processore, la RAM è File Register ...
Io vado Step-Step con F8 fino ad un call, mi fermo, se voglio vedere cosa fa la routine che stò per chiamare, continuo con F8 se so già che funziona e cosa fa, ma soprattutto che registri modifica e quali devo passare, li sistemo (a mano) e poi faccio SETP-OUT o metto un BreakPoint dopo la Call e faccio RUN, la simulazione si ferma subito dopo la Call.
Solo la prima volta o sei fai delle modifiche al programma, cmq te lo chiede lo stesso MPLAB, quando fai una modifica di effettuare un nuovo make.
In tempo reale non è possibile in alcun modo, nemmeno con l'emulatore, solo dopo lo STOP puoi vedere lo stato dei registri. In Real-Time sarebbe cmq impossibile ... il PC non ce la farebbe a stare dietro a tutti i registri ...
:-) ... per provare .... va bene ... potevi mettere anche un LED a questo punto ... cmq il tasto chiude un circuito o si aspetta una tensione ???
Basta controllare .... :-) ... difficile che una cosa funzioni al primo colpo .... non funziona quasi mai ...
Peccato, cmq va bene anche FidoCad
Lo guardo e ti faccio sapere.
Ciao Gabriele.
=
=Raggi=Gamma=
Ciao, potresti postare qui il programma con la modifica dei 15 secondi? mi interesserebbe.
Grazie!
K
Kappa
"=Raggi=Gamma=" ha scritto nel messaggio
Nessun problema ... eccolo:
;************************************************************ ;* * ;* Antifurto a distanza. * ;* * ;* Author : Francesco, Kappa * ;* Company : Nessuna * ;* Date : 12 Aprile 2004 * ;* * ;* Type : Microchip PIC16F84A-04/SP * ;* Icycle : 1.00 us * ;* WDT : OFF * ;** ;* Release : 0.01 * ;** ;* History : * ;* 11 Agosto 2004 - Versione 0.01 controllo stato * ;* ingressi, gestione ALLARMI. * ;** ;************************************************************
LIST P=16F84A, F=INHX8M include "P16F84A.inc" ; ; Flags di configurazione ; __CONFIG _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC __IDLOCS 0x0001 ; ; Disabilito segnalazione Cross page boundary ; Disabilito segnalazione Bank warnings ; errorlevel -306 ; NO Crossing page boundary Warnings errorlevel -302 ; No Bank Warnings errorlevel -220 ; No Bank Warnings ; ;**************************************** ;* Inizio Banco 0 RAM * ;**************************************** ; ORG 0x0C ; ; ISR_TEMP RES 0x04 ; 0x0C - 0x0F Registri di backup gestione ISR ; TEMP RES 0x08 ; 0x10 - 0x17 Registri di comodo, non per passaggio dati. ; COUNTER RES 0x01 ; 0x18 Contatore generico ; ALLARMI RES 0x01 ; 0x19 Registro definizione allarmi ; TIMER RES 0x02 ; 0x1A - 0x1B Timer a 16 Bit ... ; ;**************************************** ;* Definizioni di sostituzione * ;**************************************** ; #define ALLARME PORTA,0 ; Segnalazione allarme ... Output PORTA Bit 0 ; #define PORTIERE ALLARMI,0 ; Segnalazione allarme ... Main Program #define TIMER_EVENT ALLARMI,7 ; Segnalazione evento timer ; #define TICK D'99' ; 10mS evento TMR0 ; #define WAKE_UP D'1500' ; 15 Secondi Wake-UP #define WAKE_UP_A D'1500' ; 15 Secondi Attesa prima di segnalare allarme #define WAKE_ON D'100' ; 1 Secondo Allarme ON ; ;**************************************** ;* Program Counter al RESET * ;**************************************** ; ORG 0x0000 ; Start Program Counter ; nop ; nop ; nop ; ; goto Start_Firmware ; ; ;**************************************** ;* Program Counter al ISR * ;**************************************** ; ; ORG 0x0004 ; Isr ; movwf ISR_TEMP+0 ; backup W ; swapf STATUS,W ; W = STATUS clrf STATUS ; movwf ISR_TEMP+1 ; backup STATUS ; movf PCLATH,W ; backup PCLATH movwf ISR_TEMP+2 ; clrf PCLATH ; cancello impaginazione ! ; movf FSR,W ; back-up FSR movwf ISR_TEMP+3 ; ; ; Inizio gestione ISR, 10 cicli macchina piu tardi, 10uS più tardi a 4 MHz ... ; ; ; Gestione Overflow TMR0 ; Isr_TMR0_Event ; btfss INTCON,T0IF ; Evento TMR0 goto Isr_PortB_Change; ; bcf INTCON,T0IF ; Resetto evento TMR0 ; movf TIMER+1,W ; \ xorlw 0x00 ; | btfss STATUS,Z ; | goto Isr_TMR0_Dec ; | ; | Controllo TIMER ... movf TIMER+0,W ; | xorlw 0x00 ; | btfss STATUS,Z ; | goto Isr_TMR0_Dec ; / ; bsf TIMER_EVENT ; Segnalo Evento TIMER goto Isr_TMR0_Restart; Esci. Isr_TMR0_Dec ; movf TIMER+1,W ; \ xorlw 0x00 ; | btfsc STATUS,Z ; | Decremento TIMER decf TIMER+0,F ; | decf TIMER+1,F ; / Isr_TMR0_Restart ; movlw TICK ; \ Overflow TMR0 ogni 10 mS movwf TMR0 ; / ; ; Gestione Interrupt on PortB Change ; Isr_PortB_Change btfss INTCON,RBIF ; Evento Port B Change goto Ritorno ; ; bcf INTCON,RBIF ; Resetto Evento PortB Change ; bsf PORTIERE ; Setta allarme PORTIERE. ; ; Fine ISR, ripristina registri e riparti. ; Ritorno ; movf ISR_TEMP+3,W ; Restore FSR movwf FSR ; ; movf ISR_TEMP+2,W ; Restore PCLATH movwf PCLATH ; ; swapf ISR_TEMP+1,W ; Restore STATUS movwf STATUS ; ; swapf ISR_TEMP+0,F ; Restore W swapf ISR_TEMP+0,W ; ; retfie ; Riparti da dove rimasto ! ; ;**************************************** ;* Wait Timer * ;* * ;* Parametri: None * ;* * ;* Return: None * ;**************************************** ; Wait_Timer ; bcf TIMER_EVENT ; Resetto Evento ... Wait_Timer_Loop ; btfss TIMER_EVENT ; Attesa evento TIMER goto Wait_Timer_Loop ; ; return ; ; ;**************************************** ;* Program Counter Programma principale * ;**************************************** ; ORG 0x0100 ; Start Firmware Start_Firmware ; clrf PORTA ; \ Cancello PORT A-B clrf PORTB ; / ; bsf STATUS,RP0 ; Passo a Bank 1 RAM movlw B'11111110' ; Bit 7-1 N/D , 0 Bit Test movwf PORTA ; movlw B'11110000' ; Bit 7-4 Interrupt on change, 3-0 N/D movwf TRISB ; Setup PORTB ; movlw B'00000101' ; Pull-Up Enable. Timer 0 Prescaler