Assembler in MplabX
11 Anni 7 Mesi fa #6
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Assembler in MplabX
Ciao Giovanni,
come detto credo che il problema risieda nel fatto che il linker file non controlli tutti gli spostamenti e variabili allocate in maniera statica.
Se hai scritto gia' il programma in C, se non e' troppo complesso puoi dare un'occhiata al codice assembly generato dal compilatore.
...visto che lo devi scrivere in assembly non sara' arabo vedere il codice creato!
Saluti,
Mauro
come detto credo che il problema risieda nel fatto che il linker file non controlli tutti gli spostamenti e variabili allocate in maniera statica.
Se hai scritto gia' il programma in C, se non e' troppo complesso puoi dare un'occhiata al codice assembly generato dal compilatore.
...visto che lo devi scrivere in assembly non sara' arabo vedere il codice creato!
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Mauro Laurenti
- Moderator
Riduci
Di più
11 Anni 7 Mesi fa #7
da Scollo
Risposta da Scollo al topic Assembler in MplabX
Ciao Mauro,
ho preso spunto dal Tuo suggerimento, ed ho provato ad effettuare il disassembly del mio programma in assembler (dal menù Windows, Pic memory view, Program memory) e con mia grande sorpresa ho costato che le direttive org vengono eseguite correttamente infatti il programma viene allocato come prescritto.
Il fatto curioso e che il programma va in tilt quando l'occupazione della program memory supera 0x00ff oppure viene allocato sopra l'indirizzo 0x00ff, qualunque istruzione viene messa fuori da questa zona il programma assembler non funziona sul PIC, mentre in simulazione sembra funzionare correttamente.
Sinceramente non riesco ad immaginare il problema e quindi la soluzione. Attendo fiducioso Tua opinione.
Saluti,
Giovanni
ho preso spunto dal Tuo suggerimento, ed ho provato ad effettuare il disassembly del mio programma in assembler (dal menù Windows, Pic memory view, Program memory) e con mia grande sorpresa ho costato che le direttive org vengono eseguite correttamente infatti il programma viene allocato come prescritto.
Il fatto curioso e che il programma va in tilt quando l'occupazione della program memory supera 0x00ff oppure viene allocato sopra l'indirizzo 0x00ff, qualunque istruzione viene messa fuori da questa zona il programma assembler non funziona sul PIC, mentre in simulazione sembra funzionare correttamente.
Sinceramente non riesco ad immaginare il problema e quindi la soluzione. Attendo fiducioso Tua opinione.
Saluti,
Giovanni
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Scollo
- Autore della discussione
- Junior Member
Riduci
Di più
- Messaggi: 23
- Ringraziamenti ricevuti 0
11 Anni 7 Mesi fa #8
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Assembler in MplabX
Ciao Giovanni,
dall'organizzazione della memoria interna non vedo grandi problemi o ragioni per cui non debba funzionare.
Il fatto che in simulazione funzioni mi fa anche pensare che ci sia qualche hardware che non viene simulato per cui non vedi eventuali reset o stalli.
Hai disabilitato il Watch Dog?
Se hai abilitato le interruzioni ha messo le relative interrupt service Routine?
Saluti,
Mauro
dall'organizzazione della memoria interna non vedo grandi problemi o ragioni per cui non debba funzionare.
Il fatto che in simulazione funzioni mi fa anche pensare che ci sia qualche hardware che non viene simulato per cui non vedi eventuali reset o stalli.
Hai disabilitato il Watch Dog?
Se hai abilitato le interruzioni ha messo le relative interrupt service Routine?
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
11 Anni 7 Mesi fa #9
da Scollo
Risposta da Scollo al topic Assembler in MplabX
Ciao Mauro
Mi sono interstadito e mi sono messo in testa di capire perchè non funziona, allora il Tuo suggerimento mi ha fatto riflettere, nel mio programma faccio uso di interrupt che sembrano funzionare correttamente.
Allora, sempre pensando che il problema si annidasse nella gestione della program memory, ho pensato di fare delle prove con un programma più semplice e senza interrupt per vedere come si comportasse il 18f2550 nel momento in cui andassi ad allocare istruzioni nella parte alta della program memory.
Ecco il programma dal quale sono partito: (mi permetto di postarlo perchè è semplicissimo)
#include <p18F2550.inc>
CONFIG WDT=OFF ; disable watchdog timer
CONFIG LVP = OFF ; Low-Voltage programming disabled (necessary for debugging)
CONFIG FOSC = INTOSCIO_EC ; Internal oscillator, port function on RA6
CONFIG PBADEN=OFF ; Portb digital
errorlevel -302
cblock 0x100
Dato ; variabili usate per dati temporanei
Riporto
endc
org 0x00
Start:
clrf TRISC ; Configura PortC tutte uscite
movlw 0xff ; Accendo PORTC
movwf PORTC
movlw 0x00 ; Azzero le varibili
movwf Dato
movwf Riporto
Inizio: ; ciclo ritardo
decfsz Dato, f
goto Inizio
decfsz Riporto, f
goto Inizio
movlw 0x00 ; Spengo PORTC
movwf PORTC
end
come vedi accendo un LED e dopo un po' lo spengo, il programma sembra funzionare, ma non funziona correttamente, perchè dopo il primo lampeggio, dopo circa ogni 5 secondi ripete il lampeggio. A questo punto penso che abbia ragione Tu, il programma dopo ogni 5 secondi si resetta, ma perchè si resetta? non dovrebbe fermarsi.
Saluti,
Giovanni
Mi sono interstadito e mi sono messo in testa di capire perchè non funziona, allora il Tuo suggerimento mi ha fatto riflettere, nel mio programma faccio uso di interrupt che sembrano funzionare correttamente.
Allora, sempre pensando che il problema si annidasse nella gestione della program memory, ho pensato di fare delle prove con un programma più semplice e senza interrupt per vedere come si comportasse il 18f2550 nel momento in cui andassi ad allocare istruzioni nella parte alta della program memory.
Ecco il programma dal quale sono partito: (mi permetto di postarlo perchè è semplicissimo)
#include <p18F2550.inc>
CONFIG WDT=OFF ; disable watchdog timer
CONFIG LVP = OFF ; Low-Voltage programming disabled (necessary for debugging)
CONFIG FOSC = INTOSCIO_EC ; Internal oscillator, port function on RA6
CONFIG PBADEN=OFF ; Portb digital
errorlevel -302
cblock 0x100
Dato ; variabili usate per dati temporanei
Riporto
endc
org 0x00
Start:
clrf TRISC ; Configura PortC tutte uscite
movlw 0xff ; Accendo PORTC
movwf PORTC
movlw 0x00 ; Azzero le varibili
movwf Dato
movwf Riporto
Inizio: ; ciclo ritardo
decfsz Dato, f
goto Inizio
decfsz Riporto, f
goto Inizio
movlw 0x00 ; Spengo PORTC
movwf PORTC
end
come vedi accendo un LED e dopo un po' lo spengo, il programma sembra funzionare, ma non funziona correttamente, perchè dopo il primo lampeggio, dopo circa ogni 5 secondi ripete il lampeggio. A questo punto penso che abbia ragione Tu, il programma dopo ogni 5 secondi si resetta, ma perchè si resetta? non dovrebbe fermarsi.
Saluti,
Giovanni
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Scollo
- Autore della discussione
- Junior Member
Riduci
Di più
- Messaggi: 23
- Ringraziamenti ricevuti 0
11 Anni 7 Mesi fa - 11 Anni 7 Mesi fa #10
da Mauro Laurenti
Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.
Risposta da Mauro Laurenti al topic Assembler in MplabX
Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.
Si prega Accedi o Crea un account a partecipare alla conversazione.
Moderatori: Mauro Laurenti
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.
Login
© LaurTec 2006 - 2024