zanna56 Inserito: 23 luglio 2013 Segnala Share Inserito: 23 luglio 2013 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 More sharing options...
Livio Orsini Inserita: 23 luglio 2013 Segnala Share Inserita: 23 luglio 2013 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 More sharing options...
zanna56 Inserita: 24 luglio 2013 Autore Segnala Share Inserita: 24 luglio 2013 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 More sharing options...
Livio Orsini Inserita: 24 luglio 2013 Segnala Share Inserita: 24 luglio 2013 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 More sharing options...
zanna56 Inserita: 25 luglio 2013 Autore Segnala Share Inserita: 25 luglio 2013 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 More sharing options...
Livio Orsini Inserita: 25 luglio 2013 Segnala Share Inserita: 25 luglio 2013 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 More sharing options...
zanna56 Inserita: 25 luglio 2013 Autore Segnala Share Inserita: 25 luglio 2013 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 More sharing options...
Livio Orsini Inserita: 25 luglio 2013 Segnala Share Inserita: 25 luglio 2013 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. 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 More sharing options...
zanna56 Inserita: 28 luglio 2013 Autore Segnala Share Inserita: 28 luglio 2013 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 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