Hallo,

ik heb een bootloader die het hoofdprogramma downloadt naar het flash.

Dit hoofdprogramma werkt perfekt als je het programmeert zonder bootloader. Echter als ik het schrijf naar het flash met een bootloader, doet het programma raar:

* in de while (1) lus worden na 7 keer de lus om onverklaarbare redenen variabelen veranderd.

* interrupts werken niet meer vanaf een bepaald punt. In het begin van het programma werken ze wel.

* De bootloader wordt niet overschreven.

Iemand een idee/verklaring?

als je met de bootloader programeert dan is het logisch dat hij daar niet over heen programmeert waar heb je anders die bootloader voor nodig?

is het toch geen bug in de bootloader?(waar komt de bootloader vandaan)

verder geen idee waarom die dingen opspelen

CCS bootloader. Volgens mij doet die zijn werk goed.

Ff mezelf quoten, ik heb laatst nog volgende uitleg gegeven op een ander forum, die ook voor jou perfect van toepassing is:

Aangezien je code rechtstreeks in een PIC wel werkt, ligt het probleem puur aan de bootloader die het programma blijkbaar niet goed geschreven krijgt.

Wat een voor de hand liggende moeilijkheid is, is dat de eerste instructie (vlak na org 0x00 dus) een NOP instructie moet zijn, zodat de bootloader daar een GOTO kan plaatsen naar zichzelf, en bij het opstarten van de PIC de bootloader in actie kan komen. Als je nu echter de eerste instructie hebt gebruikt (doorgaans een goto naar het eigenlijke programma, want op ORG 0x04 moet de interrupt-code starten) zal deze ook overschreven worden door de GOTO naar de bootloader, deze zal na zijn werkt te doen (kijken of er iemand de PIC wil programmeren) een GOTO doen naar de 2e instructie (vlak na de verplichte NOP, als je deze wel hebt gezet dan staat daar de GOTO naar jou eigen programma).
Doorgaans kan je dat in de compiler aangeven met iets van ICD_enable ofzo (ook ICD werkt op een vergelijkbare manier), zie de help dus.

Sla er ook eens de documentatie van de gebruikte bootloader op na, om te zien welke eisen deze stelt aan je programma.

In de betere compilers kan je de ASM-versie van je programma zien, daarin kan je checken of die NOP er al dan niet staat.


0000:  MOVLW  00
0001:  MOVWF  0A
0002:  GOTO   165
0003:  NOP

1e 4 adressen is altijd de resetvectoren.

op adres 0004 zit de interrupt vector.

Dat is allemaal goed; er moet iets zijn met het mainprogramma..

Op 16 januari 2007 15:50:39 schreef Christophe@WORK:


0000:  MOVLW  00
0001:  MOVWF  0A
0002:  GOTO   165
0003:  NOP

1e 4 adressen is altijd de resetvectoren.

op adres 0004 zit de interrupt vector.

Dat is allemaal goed; er moet iets zijn met het mainprogramma..

Niet goed dus, wat je moet hebben is het volgende:


0000:  NOP
0001:  MOVLW  00
0002:  MOVWF  0A
0003:  GOTO   165

En hoe krijg je dat? Die bytes worden geschreven door de compiler..

Kun je niet met een pragma directive de memory location opgeven?

Op 17 januari 2007 08:59:34 schreef Christophe@WORK:
En hoe krijg je dat? Die bytes worden geschreven door de compiler..

In dat tekstje dat ik van mezelf heb gequote staat vermeld wat je moet zoeken in je compiler.


#device ICD=TRUE

dit enabled de debugger..