Hallo,

Ik zoek een zeer eenvoudig, werkend stukje code voor een PIC 24EP. Ik heb het volgende gevonden voor een HJ, maar ik krijd dit niet werkend op een P24EP64GP202. Ik heb de include regel aangepast. Aan de configs heb ik niets gedaan. Zonder daar aandacht aan te besteden draait dit stukje code op een PIC24HJ128GP502.


.title " Sample dsPIC Assembler Source Code"
.sbttl " LED Toggle"

.include "P24HJ128GP502.inc"
.text
.global __reset
__reset:
mov #0x0a00,W8

mov W8,SPLIM
mov #0x0980,W15

mov #0xfc,W4

mov W4,TRISB

mloop: mov #0x02,W5

mov W5,PORTB
call delay

mov #0x01,W5

mov W5,PORTB
call delay

bra mloop

delay: mov #0x7fff,W6

dloop: dec W6,W6
cp0 W6
bra NZ,dloop
return
.end

Heb je dat bestandje wat achter de include staat en kan je programma het ook vinden?

Ja, heb ik en wordt ook gevonden. Deze code werkt gewoon op een HJ.
Als ik die regel verander, door een willekeurige letter in de naam van het bestandje te typen (.include "P24HJ128GxP502.inc"), dan krijg ik een foutmelding dat dat bestand niet gevonden wordt. Als ik die letter weer verwijder, dan wordt he bestandje weer gevonden.

Dat INC-bestand past bij de P24HJ. Heb je ook het INC-bestand voor de EP gevonden en de .INCLUDE aangepast? Heb je in de configuratie van je project de juiste PIC gekozen en het juiste linkerscript?

Hoe ziet de nieuwe code eruit en wordt die foutloos gecompileerd?

[Bericht gewijzigd door BenZ op (15%)]

Dit is de nieuwe code.


.include "P24EP64GP202.inc"

.text
.global __reset
__reset:
mov #0x0a00,W8

mov W8,SPLIM
mov #0x0980,W15

mov #0xfc,W4

mov W4,TRISB

mloop: mov #0x02,W5

mov W5,PORTB
call delay

mov #0x01,W5

mov W5,PORTB
call delay

bra mloop

delay: mov #0x7fff,W6

dloop: dec W6,W6
cp0 W6
bra NZ,dloop
return
.end


BUILD SUCCESSFUL (total time: 255ms)
Loading code from C:/Users/../MPLABXProjects/PIC24EP64GP202/dist/default/production/PIC24EP64GP202.production.hex...
Loading symbols from C:/Users/../MPLABXProjects/PIC24EP64GP202/dist/default/production/PIC24EP64GP202.production.cof...
Loading completed
Connecting to programmer...
Programming target...
Programming completed
Running target...

Waar worden de configuratiebits gedefinieerd? In het workspace-menu? Zijn de configuraties van beide PIC's wel over en weer te gebruiken?
Simulatie geprobeerd?

Edit: Ik kan niet zien of de juiste PIC is geselecteerd en het juiste linkerscript is gekozen.

[Bericht gewijzigd door BenZ op (23%)]

Niet. De HJ werkt zonder aandacht te besteden aan de config bits.
Dus de HJ werkt door deze code te 'builden' en naar de PIC te sturen. Dat is alles.

http://imageshack.us/photo/my-images/109/screenpg.png/
http://img109.imageshack.us/img109/5991/screenpg.png

[Bericht gewijzigd door aanuit op (31%)]

Vlgs de screenshots wordt de configuratie niet geprogrammeerd. Dus de defaultwaarden van Microchip staan erin. Deugen die?

[Bericht gewijzigd door BenZ op (68%)]

Geen idee, waar kan ik dat vinden?

Kan je de configuratie zoals die in de PIC staat zien met je PICKIT3?

In de datasheet staat de configuratie in het hoofdstuk "Special features".

Edit: voorlopig geen reactie.

Edit2: In de code staan absolute waarden voor de stackinitiatie. Dat is riskant. Ik gebruik
mov #__SP_init, w15
mov #__SPLIM_init, W0
mov W0, SPLIM
nop

[Bericht gewijzigd door BenZ op (14%)]

Toevallig de juist A/D configuraties ingesteld? Ik ben niet bekend met de PIC24EP series, maar bij andere series staan A/D pinnen stnadaard als analog ingesteld. Die moet je eerst op digital zetten. ANSELx registers lijken dat te doen, zoek eens de datasheet naar 11.2 Configuring analog & digital pins.

Port B heeft deels analoge pinnen, toevallig waar je LEDs op blinked. Standaard zijn die analoog, niet digitaal.

Had ik ook al naar gekeken, zal er nog eens naar kijken.
In het voorbeeld valt echter wel op dat daar ook geen aandacht aan besteed wordt, maar dat het wel wertk. Volgens mij zijn pinnen zo goed als altijd als analogg ingesteld.

Als er iemand een simpel stukje, werkende ASM code heeft voor een willekeurige pic24 dan zou ik dat graag bekijken.

Ik heb in mijn geval (PIC24FJ64GB004) setm.w AD1PCFGL aan het begin van de code staan om alle poorten op digitaal te zetten. Het gegeven programmaatje lijkt me prima om te testen.

[Bericht gewijzigd door BenZ op (21%)]

Inmiddels werkt het volgende op een p24EP128MC202.
Bedankt voor de hulp.


.include "p24EP128MC202.inc"

.text
.global __reset

__reset:
mov #__SP_init,w15

mov #__SPLIM_init,w0

mov w0,SPLIM

mov #0x0000,W1

mov W1,TRISA

mainLoop:
mov #0x0001,W5

mov W5,PORTA
call delay

mov #0x0002,W5

mov W5,PORTA
call delay

bra mainLoop

delay:
mov #0xf000,W6

dloop:
dec W6,W6
cp0 W6
bra NZ,dloop
return

.end

Enig idee wat er mis ging bij de vorige PIC (P24EP64GP202)?

Nog niet. Als ik er uit ben, dan zal ik het posten.

Voor geïnteresseerden in de PIC24 en daarbij passende assemblerprogramma's heb ik een setje in het uploadarchief gezet (USB, interrupt, etc.).

Waar kan ik het uploadarchief vinden?

Onderstaand stukje code laat PORTB aan en uit gaan. Waarom PORTA niet aan en uit gaat, snap ik niet.


.include "p24EP64GP202.inc"

.text
.global __reset

__reset:
mov #__SP_init,w15

mov #__SPLIM_init,w0

mov w0,SPLIM
nop

;TRISA
mov #0x0000, W1
mov W1, TRISA

;TRISB
mov #0x0000, W1
mov W1, TRISB

;ANSELA
mov #0x0000, W1
mov W1, ANSELA

;ANSELB
mov #0x0000, W1
mov W1, ANSELB


mainLoop:

mov #0x0000, W1
mov W1, PORTA
mov #0x0000, W1
mov W1, PORTB
call delay1

mov #0xffff, W1
mov W1, PORTA
mov #0xffff, W1
mov W1, PORTB
call delay1

bra mainLoop

delay1:
mov #0xffff,W6

dloop1:
call delay2
dec W6,W6
cp0 W6
bra NZ,dloop1
return

delay2:
mov #0x4,W7

dloop2:
dec W7,W7
cp0 W7
bra NZ,dloop2
return

.end

EDIT:

Ik denk dat ik er uit ben. De adressen in de linker file komen niet overeen met de adressen in de datasheet. Zie ook deze discussie bij Microchip.

EDIT2:

Linker file verwijdert en code aangepast. EQU regels toegevoegd. Nu knipperen zowel PORTA als PORTB. Fout zit dus echt in het linker script.


.equ TRISA, 0x0E00
.equ PORTA, 0x0E02
.equ LATA, 0x0E04
.equ ODCA, 0x0E06
.equ CNENA, 0x0E08
.equ CNPUA, 0x0E0A
.equ CNPDA, 0x0E0C
.equ ANSELA, 0x0E0E

.equ TRISB, 0x0E10
.equ PORTB, 0x0E12
.equ LATB, 0x0E14
.equ ODCB, 0x0E16
.equ CNENB, 0x0E18
.equ CNPUB, 0x0E1A
.equ CNPDB, 0x0E1C
.equ ANSELB, 0x0E1E

.include "p24EP64GP202.inc"

.text
.global __reset

__reset:
mov #__SP_init,w15

mov #__SPLIM_init,w0

mov w0,SPLIM
nop

;TRISA
mov #0x0000, W1
mov W1, TRISA

;TRISB
mov #0x0000, W1
mov W1, TRISB

;ANSELA
mov #0x0000, W1
mov W1, ANSELA

;ANSELB
mov #0x0000, W1
mov W1, ANSELB

;ODCA
mov #0x0000, W1
mov W1, ODCA


mainLoop:
bset LATA, #0

call delay1

mov #0x0000, W1
mov W1, PORTA
mov #0x0000, W1
mov W1, PORTB
call delay1

mov #0xffff, W1
mov W1, PORTA
mov #0xffff, W1
mov W1, PORTB
call delay1

bra mainLoop

delay1:
mov #0xffff,W6

dloop1:
call delay2
dec W6,W6
cp0 W6
bra NZ,dloop1
return

delay2:
mov #0x4,W7

dloop2:
dec W7,W7
cp0 W7
bra NZ,dloop2
return

.end


EDIT3:

Reactie Microchip:

Thank you for reporting this issue to us.

I assume you are using the XC16 v1.10 compiler.
I will attach the gld file of this device from XC16 v1.00, which does not seem to have this issue. You can try to merge the two linker script files by using a merging tool like WinMerge or KDiff3 and use it in your projects.

I will report this issue to the XC16 division and they will probably fix it by the next release of compiler.

Mooi dat je eruit gekomen bent. Microchip maakt het je soms erg moeilijk....

Mijn files:
http://www.uploadarchief.net/overview.html;jsessionid=D1188A30FEAB516A…
(ik werk met ASM30/C30).