Assembler in MplabX

10 Anni 11 Mesi fa #11 da Scollo
Risposta da Scollo al topic Assembler in MplabX
Ciao Mauro
Anzitutto grazie, oggi leggendo il tuo libro sul C18, avevo notato che mettevi sempre alla fine il while(1), per bloccare l'esecuzione del programma. Infatti adesso tutto funziona correttamente, almeno quello. Ti terrò informato sulla allocazione del programma nella program memory.

Saluti
Giovanni

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Scollo
  • Junior Member
  • Junior Member
Di più
10 Anni 11 Mesi fa - 10 Anni 11 Mesi fa #12 da Scollo
Risposta da Scollo al topic Assembler in MplabX
Ciao Mauro
approfitto della Tua pazienza e competenza per metterti a conoscenza della evoluzione del problema relativo alla allocazione del programma nella program memory, come Ti avevo detto qualche giorno fa, per capirci qualcosa ho provato un programma semplice, lo sottopongo alla Tua analisi, data la semplicità:

#include <p18F2550.inc>

CONFIG WDT=OFF ; disable watchdog timer
CONFIG MCLRE = ON ; MCLEAR Pin on
CONFIG DEBUG = ON ; Enable Debug Mode
CONFIG LVP = OFF ; Low-Voltage programming disabled (necessary for debugging)
CONFIG FOSC = INTOSCIO_EC ; Internal oscillator, port function on RA6
errorlevel -302
cblock 0x20
Delay1
Delay2 ; variabili usate per dati temporanei
endc

org 0x00
Start:
clrf TRISC ; Configura PortC tutte uscite

ForeverLoop:
call Ritardo
movlw 0x00
call Visualizza ; chiamata per LED1=ON, LED=OFF
movwf LATC
call Ritardo
movlw 0x02
call Visualizza ; chiamata per LED1=OFF, LED=ON
movwf LATC
goto ForeverLoop

org 0x0100 ; commentando questa FUNZIONA
Visualizza:
andlw 0x02
addwf PCL, 1
retlw B'10000000' ; Accendi LED 0
retlw B'01000000' ; Accendi LED 1

org 0x0200
Ritardo: ; Ciclo di ritardo
movlw 0x40
movwf Delay2
Ritardo1:
decfsz Delay1,f
goto Ritardo1
decfsz Delay2,f
goto Ritardo1
return

end
Commentando la riga con ORG 0x0100 davanti alla routine Visualizza, il programma gira correttamente facendo lampeggiare i due led alternativamente.
Nel momento in cui tolgo il commento sulla riga in oggetto inizia a lampeggiare un solo led in maniera irregolare.
Faccio presente che in simulazione il tutto funziona correttamente. Curioso del Tuo pensiero.

Saluti
Giovanni
Ultima Modifica 10 Anni 11 Mesi fa da Scollo.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Scollo
  • Junior Member
  • Junior Member
Di più
10 Anni 11 Mesi fa #13 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Assembler in MplabX
Ciao Giovanni,

Personalmente toglierei gli indirizzi assoluti org 0x0100 e org 0x0200 visto che poi hai delle etichette.
lascerei poi al linker prendere le dovute decisioni di allocazione del programma ed evitare che non vai contro le impostazioni del linker file.

Saluti,

Mauro

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
10 Anni 11 Mesi fa #14 da Scollo
Risposta da Scollo al topic Assembler in MplabX
Ciao Mauro,

In questo caso posso farlo, nel caso specifico siccome la tabella è lunga viene a trovarsi a cavallo delle pagine 0x00ff e 0x0100 e quindi poi mi sfasa il program counter, quindi ho l'esigenza di forzare con ORG il posizionamento della routine all'inizio di una nuova pagina, per poter gestire correttamente il program counter. L'esempio l'avevo creato intenzionalmente per provare a capire dove si annida l'inghippo nel momento in cui uso la direttiva ORG ed a seguire modifico la parte LSB del program counter (PCL). Grazie in ogni caso.

Saluti,

Giovanni

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Scollo
  • Junior Member
  • Junior Member
Di più
10 Anni 11 Mesi fa #15 da Scollo
Risposta da Scollo al topic Assembler in MplabX
Ciao Mauro,

Come Ti avevo accennato ho proseguito le mie analisi perchè mi serve posizionare la routine Visualizza su un'altra pagina. Sono partito dalla costatazione che il programma in simulazione funziona e nella pratica no. Allora ho analizzato l'evoluzione del contenuto del registro relativo al program counter (PCL, PCLATH, PCLUTH) ed ho notato che durante la simulazione, quando effettuo la chiamata alla routine Visualizza il PCLATH viene giustamente modificato e rimane tale anche durante l'esecuzione della routine.
Poi ho usato il programmatore debugger ICD3 ed ho controllato l'esecuzione del programma sul PIC e con mia grande sorpresa ho notato che nel momento in cui eseguo la routine Visualizza il PCLATH viene inspiegabilmente azzerato, quindi dopo l'istruzione addwf PCL, 1 l'esecuzione torna sul programma principale in una posizione sbagliata e senza concludere correttamente la routine.
Ho momentaneamente risolto il problema impostando il PCLATH manualmente, così funziona però mi rimane il cruccio di non aver capito il perchè dell'azzeramento di PCLATH nella realtà.

Saluti,

Giovanni

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Scollo
  • Junior Member
  • Junior Member
Di più
Moderatori: Mauro Laurenti

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login