Funzione sleep + interrupt.

Salve. Devo utilizzare la funzione sleep facendo risvegliare il pic con un interrupt dal cambiamento di stato delle 4 linee della porta B di un pic

16f84. Ho scritto il seguente programma e compilato con Mplab.

list p=16F84

;Area delle etichette

STATUS EQU 0x03 PORTA_A EQU 0x05 PORTA_B EQU 0x06 RP0 EQU 0x05 RBIF EQU 0x00 INTCON EQU 0x0b

ORG 0 goto INIZIO ORG 4 goto ALLARME ORG 5

;Inizio del programma

INIZIO: bsf STATUS,RP0 movlw b'11110000' movwf PORTA_B clrf PORTA_A bcf STATUS,RP0 clrf PORTA_B

movlw b'10001000' movwf INTCON

sleep

ALLARME: bsf PORTA_A, 0 bcf INTCON,RBIF retfie

END

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
Reply to
Francesco
Loading thread data ...

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

Reply to
Kappa

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.

list p=16F84 INCLUDE "P16F84.INC"

__CONFIG 3FF1H

ORG 0CH

CounterA EQU 0x0c CounterB EQU 0x0e CounterC EQU 0x0d

ORG 0 goto INIZIO ORG 4 goto ALLARME

;Inizio del programma

INIZIO: bsf STATUS,RP0 movlw b'11110000' movwf TRISB movlw b'00000000' movwf TRISA bcf STATUS,RP0 bcf PORTB,0 bcf PORTB,1 bcf PORTB,2 bcf PORTB,3 clrf PORTA

movlw b'10001000' movwf INTCON

CICLO: movlw D'6' movwf CounterC movlw D'24' movwf CounterB movlw D'168' movwf CounterA bcf PORTA,0 sleep goto CICLO

ALLARME: bsf PORTA,0 call LOOP bcf PORTA,0 call LOOP bsf PORTA,0 call LOOP bcf PORTA,0 call LOOP bcf INTCON,RBIF movlw b'00000001' xorwf PORTA,F retfie

LOOP: decfsz CounterA,1 goto LOOP decfsz CounterB,1 goto LOOP decfsz CounterC,1 goto LOOP return

END

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

Reply to
Francesco

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

Reply to
Kappa

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

Reply to
Francesco

"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. * ;* * ;************************************************************

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 ; ;**************************************** ;* 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 ; ; ;**************************************** ;* Delay 1 Secondo * ;* * ;* Parametri: None * ;* * ;* Return: None * ;**************************************** ; Delay_1_Secondo ; movlw D'166' ; \ 1° COntatore movwf TEMP+0 ; / movlw D'199' ; \ 2° COntatore movwf TEMP+1 ; / movlw D'10' ; \ 3° COntatore movwf TEMP+2 ; / Delay_1_Loop_1 ; decfsz TEMP+0,F ; \ goto Delay_1_Loop_1 ; | Delay_1_Loop_2 ; | movlw D'166' ; | movwf TEMP+0 ; | decfsz TEMP+1,F ; | Delay goto Delay_1_Loop_1 ; | Delay_1_Loop_3 ; | movlw D'199' ; | movwf TEMP+1 ; | decfsz TEMP+2,F ; | goto Delay_1_Loop_1 ; / ; retlw 0x00 ; ; ;**************************************** ;* Blink Uscita ALLARME x volte * ;* * ;* Parametri: W = Numero lampeggi * ;* * ;* Return: None * ;**************************************** ; Blink_Allarme ; movwf COUNTER ; Salvo numero lamopeggi ; xorlw 0x00 ; \ btfsc STATUS,Z ; | Controllo parametro passato se zero esco. return ; / Blink_Loop ; movlw B'00000001' ; \ Scambio STATO ALLARME Output xorwf PORTA,F ; / ; call Delay_1_Secondo ; Ritardo 1 Secondo ... ; decfsz COUNTER,F ; goto Blink_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

64 movwf OPTION_REG ; bcf STATUS,RP0 ; Passo a Bank 0 RAM ; movlw B'00101000' ; TMR0 e On Port B Change Interrupt. movwf INTCON ; ; ; Inizializzo registri RAM ; bcf PORTIERE ; Cancello segnalazione ALLARME bcf TIMER_EVENT ; Cancello evento timer clrf TIMER+0 ; \ Nessun Evento Timer ... clrf TIMER+1 ; / ; movlw TICK ; \ Interrupt ogni 10mS ... movwf TMR0 ; / ; ; Abilito Interrupt Globali ... ; bsf INTCON,GIE ; Gestione Interrupt Avviata ; ; Loop principale ; Main_Loop ; bcf PORTIERE ; Resetto eventuale nuovo evento portiere ... ; sleep ; Modalità basso consumo ... in attesa di evento ; btfss PORTIERE ; Se arrivato allarme ... continua. goto Main_Loop ; Nessun allarme ... torna in modalità basso consumo ; ; Gestione evento Allarme ... ; movlw HIGH(D'1500') ; \ movwf TIMER+0 ; | Imposto evento Timer movlw LOW(D'1500') ; | a 15 secondi (1500 * 10mS) = 15 Secondi movwf TIMER+1 ; / call Wait_Timer ; Attendo evento timer ... ; movlw D'05' ; \ Faccio lampeggiare 5 volte l'OUTPUT call Blink_Allarme ; / ; goto Main_Loop ; Riparti. ; END ;

auto),

1

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.

Reply to
Kappa

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

Reply to
Francesco

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

Reply to
Kappa

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
Reply to
Francesco

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

Reply to
Kappa

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

Reply to
Francesco

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

Reply to
Kappa

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
Reply to
Francesco

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

Reply to
Kappa

Ciao, potresti postare qui il programma con la modifica dei 15 secondi? mi interesserebbe.

Grazie!

Reply to
=Raggi=Gamma=

"=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

64 movwf OPTION_REG ; bcf STATUS,RP0 ; Passo a Bank 0 RAM ; movlw B'00101000' ; TMR0 e On Port B Change Interrupt. movwf INTCON ; ; ; Inizializzo registri RAM ; bcf PORTIERE ; Cancello segnalazione ALLARME bcf TIMER_EVENT ; Cancello evento timer clrf TIMER+0 ; \ Nessun Evento Timer ... clrf TIMER+1 ; / ; movlw TICK ; \ Interrupt ogni 10mS ... movwf TMR0 ; / ; ; Abilito Interrupt Globali ... ; bsf INTCON,GIE ; Gestione Interrupt Avviata ; ; Attesa 15 secondi prima di partire ; movlw HIGH(WAKE_UP) ; \ movwf TIMER+0 ; | Imposto evento Timer movlw LOW(WAKE_UP) ; | a 15 secondi (1500 * 10mS) = 15 Secondi movwf TIMER+1 ; / call Wait_Timer ; Attendo evento timer ... ; ; Loop principale ; Main_Loop ; bcf PORTIERE ; Resetto eventuale nuovo evento portiere ... ; sleep ; Modalità basso consumo ... in attesa di evento ; btfss PORTIERE ; Se arrivato allarme ... continua. goto Main_Loop ; Nessun allarme ... torna in modalità basso consumo ; ; Gestione evento Allarme ... ; movlw HIGH(WAKE_UP_A) ; \ movwf TIMER+0 ; | Imposto evento Timer movlw LOW(WAKE_UP_A) ; | a 15 secondi (1500 * 10mS) = 15 Secondi movwf TIMER+1 ; / call Wait_Timer ; Attendo evento timer ... ; bsf ALLARME ; Accendo Allarme ; movlw HIGH(WAKE_ON) ; \ movwf TIMER+0 ; | Imposto evento Timer movlw LOW(WAKE_ON) ; | a 1 secondo (100 * 10mS) = 1 Secondi movwf TIMER+1 ; / call Wait_Timer ; Attendo evento timer ... ; bcf ALLARME ; Spengo Allarme ; goto Main_Loop ; Riparti. ; END ;

Di niente ...

Gabriele.

Reply to
Kappa

Ciao, ti funziona il programma? Se si mi puoi mandare il disegno del circuito? Grazie. Francesco

Reply to
Francesco

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.