Vai al contenuto
PLC Forum


Problema Interrupt In Asm


zanna56

Messaggi consigliati

salve a tutti...sono nuovo del forum ..e avrei bisogno di aiuto,sto riattivando un vecchio progetto con pic
e sto incontrando probelmi con interrupt in asm....arrivo al dunque..pic usato 16f876a 8mhz , gestisce 1 lcd 2x16 una tastiera a matrice un rtc ds1307..e 2 uscite le quali pilotano 2 resistenze esterne a 230vac...soglia on off secondo le tempistiche impostate sul display..c'è pure un write e read dove salvo i parametri impostati..fin qui tutto va a meravglia fin che non uso l'interrupt in asm
dimensione del programma circa 6kword..per ora
ora viene l'ostacolo..non conosco l'assembelr del pic (solo qualche istruzione maggiormente usata ,ho sempre usato pbp pro)...oltre al vecchio st6 o + vecchio ancora quasi scordato, il motorola 68hc000..dico ciò perchè vorrei usare l'interrupt per sincronizzarmi con la rete 50hz per dosare la tensione sulle rsistenze tramite un triac a secondo della tempistica impostata oltre che un input on off come condizionamento..ho scoperto sui forum e anche in pratica che questo interrupt è impreciso..ho tentato di usare un esempio in ASM che ho notato su alcuni post che è pure quello presente nella cartella dei files :sample di microcode studio..ma si impalla il display e non gestisce la tastiera , anche togliendo l'input dell'interrupt rimane bloccato..nonostante l'uscita del triac (previo moc3020)si comporti regolarmente..chiedo scusa se mi son allungato ma ho apura di tralasciare dei dettagli importanti..

ps:se uso l'ONI NTERRUPT DEL PBP tutto funziona regolare,solo che l'uscita che pilota il triac non resta sincronizzata con l'attivazione del fronte

del passaggio per lo zero..da qui l'imprecisione..

grazie in anticipo..

Link al commento
Condividi su altri siti


Il tuo messaggio non è molto chiaro, anzi...

Non si capisce quale problema hai realmente.

L'interrupt esterno a quale porta è legato?

Poi posta il codice della sub di gestione dell'inerrupt, così magari si capisce dse e dove c'è il problema.

Link al commento
Condividi su altri siti

intanto grazie per la visita al post..perdonatemi..allora riassumo..il mio codice funziona se uso l'interrupt in PBP am al sincronizzazione su ra4 dello zero è imprecisa,mentre se uso l'interrupt in ASM. sulll'uscita vedo il treno di impulsi ed è sincronizzato con ra4 ma il resto del programma si impalla..qui posto il codice..come prima prova per vedere il funzionamento ho usato un toggle dell'uscita,ma poi dovrò realizzare le temporizzazioni nei 10ms per parzilizzare la semionda al carico..in modo percentuale..

************ soluzione con PBP **********f(unziona tutto ma impreciso l'interrupt)..

OPTION_REG=%00111000 ' bit4 fronte discesa - bit 5 ra4- bit3 prescaler al 'wdt anche se non usato
INTCON =%00100000 'bit 5 portA4 in interrupt
On Interrupt Goto myint

INTCON =%10100000
main:
.........
........
........
goto main

'qui ci sono delle soubroutines
.................
...............
end select
return
disable
myint
TOGGLE triac
intcon.2=0
tmr0=255
resume
enable
end
************** SOLUZIONE IN ASM ********funziona correttamente solo l'interrupt e il resto si impalla..

OPTION_REG=%00111000 ' bit4 fronte discesa - bit 5 ra4 increm.tmro- bit3 'prescaler al wdt anche se non usato
INTCON =%00100000 'bit 5 portA4 in interrupt

define INTHAND myint
INTCON =%10100000

main

.............

.............

goto main
'qui ci sono delle soubroutines
...............
.............
end select
return
asm
myint:
movwf wsave
swapf STATUS, W
clrf STATUS
movwf ssave
movf PCLATH, W
movwf psave
movf FSR, W
movwf fsave
; Insert interrupt code here
; Save and restore FSR and any other registers used

btfsc _triac '(eseguo un toggle dell'uscita
goto off
bsf _triac
goto exit1
off bcf _triac
exit1
movlw d'255' ; ripristino il tmr0 con 255
movwf TMR0
bcf INTCON, 2 ; Clear interrupt flag


; Restore saved registers
movf fsave, W
movwf FSR
movf psave, W
movwf PCLATH
swapf ssave, W
movwf STATUS
swapf wsave, F
swapf wsave, W
movf wsave, W
retfie ; Return from interrupt
endasm
end

Link al commento
Condividi su altri siti

Forse intravedo quello che non scrivi.

Ma tu vuoi fare un temporizzatore ed usi l'interrupt del timer?

Oppure usi un evento esterno perchè sia contato dal timer0?

Su questo processore, a memoria, gli interrupt esterno sono sulla porta B. Non ho sottomano il datasheet ma avendo fatto numerosi lavori con lo 876-877 non mi sembra di ricordare interrupt Hw che non fossero sulla porta B.

Link al commento
Condividi su altri siti

infatti è l'unico pin libero che ho per rilevare l'evento , (come già detto è un progetto già esistente e funzionante ma senza questa rilevazione) oppure anche il portc.1 utilizzando stesso metodo ma col timer 1,il port b è gia utilizzato,che sia il portb o altro,l' interrupt è lo stesso,...io penso che nell'asm che ho inserito manchi qualcosa ...perchè secondo me il PC o qualche altro registro importante quando torna dall'interrupt non contiene gli stessi dati che dovrebbe per poter proseguire correttamente il programma,...

mentre con il PBP prima di saltare all'interrupt vengono terminate le rotines tipo lcdout o i2c eccc..da qui il fatto dell'imprecisione della sincronizzazione..

saluto e buona giornata

Link al commento
Condividi su altri siti

infatti è l'unico pin libero che ho per rilevare l'evento ,

Ma A4 è un ingresso usabile come ingresso di clock per timer0, non è un ingresso per interrupt.

.da qui il fatto dell'imprecisione della sincronizzazione..

No non credo proprio.

Se leghi il fine conta di TM0 ad interrupt, l'evento ti porta all'indirizzo stabilito dal vettore di interrupt, da dove salti all'indirizzo dove elabori la sub.

Se non ricordo male l'interrupt salva automaticamente lìindirizzo di ritorno, mentre è cura del programmatore salvare eventualmente i registri.

Io uso da sempre timer con TM0 e TM1, come clock uso la frequenza di clock del processore, e mai ho avuto imprecisioni degne di nota.

Ho anche usato proprio un 876 per misurare una frequenza esterna usando A4 come ingresso esterno del contatore e ti garantisco che non ho mai avuto problemi di precisione.

Sono anni che non uso più lo ASM, se non per piccoli pezzi di codice estremamente critici. Per fare quello che ti sei proposto sarebbe molto più indicato il "C", anche quello scaricabile gratuitamente assieme a MPLab.

Link al commento
Condividi su altri siti

esatto ..se il timer0 lo imposto a 255 , il primo impulso che arriva su RA4 fa traboccare tmr0 causando l'interrupt...per cui è come se fosse un pin dedicato.all 'interrupt..(è uno stratagemma che mi son pensato perchè non altri imput del PortB)...come ho già detto, lo stesso input qaundo mi genera l'interrupt in ASM è perfetto mentre se los crivo in pbp è impreciso però mi funziona tutto il resto del programma..

...se non ricordo male provai anche con rb0 ma stessa identica cosa...con routin di interrupt in asm l'uscita è perfetamnete sincronizzata con lo zero crossing e il programma si blocca..mentre in pbp no...ciò vuol dire che scrivendo l'interrupt in PBP come avevo letto da altre parti,non è sempre tempstivo..in asm si...è qui il problema per me però purtroppo ......

pe rimparare il C per ora non se ne parla ..manca il tempo e la lucidità che alla mia età comincia a rallentare..e poi con tutti i vari PLC che devo ricordare per il mio lavoro

ne basta e avanza...

un saluto

Link al commento
Condividi su altri siti

ciò vuol dire che scrivendo l'interrupt in PBP come avevo letto da altre parti,

Nonn so cosa sia PBP, ma presumo che sia qualche cosa che forse va bene per giochini lenti. :smile:

Per fare il lavoro che hai in mente tu, se ho capito bene, hai necessità comunque di una sincronizzazione dall'esterno. La soluzione che hai adottato ti comporta comunque un ritardo, fisso e (quasi) costante, ma il ritardo c'è.

pe rimparare il C per ora non se ne parla

Il "C" non è poi molto difficile, anzi... Oramai il "C" è praticamente un must per chi programma, dovresti pensarci seriamente......

.

Link al commento
Condividi su altri siti

per il c:) va bene...ma per questi programmi e sporadici e obbistici è inutile che impari altri linguaggi..come ho già detto ne bastano quelli per il mio lavoro...

per il PBP:) acronimo di pic basic pro..veda inrete che non è affatto per "giochini lenti"... ;) ...

comunque gradirei risposte attinenti al codice che ho postato..e se manca qualcosa chiedete pure.....

buona domenica

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