Ik heb een test programmaatje geschreven voor pic18f258 dat zorgt er voor dat een ledje dat op portA0 hangt, knippert met de snelheid van 0,5 ms. Dit programmaatje werkt, en er is bijna niks mis mee.
Maar wat mij echt nieuwsgierig maakt, is dat de configuratie bytes in de hex file dat door MPASM gecreëerd word kloppen volgens mij niet, waar door na het uploading van deze hex file in de flash van PIC18, bij het controleren(verify) of de data correct is opgeslagen zegt hij de volgende:
Error: Verify error at address 0x300000. Value in image is 0xFF and value in target is 0x00.
Dan heb ik een hex file van qua ,de bewerking, hetzelfde programma als van me bij Voti gedownloaden en bij het controleren van deze krijg ik geen fout melding. Het programma is bij Voti onder dit adres te vinden: http://www.voti.nl/blink/index_1.html#18F242
En wat bijzonder is, dat in de hex file van Voti de configuratie bytes zijn de volgende:
300000: 00 22 0C 0E 00 01 80 00 0F C0 0F E0 0F 40
En in de hex file van het programma dat ik zelf heb geschreven in assembly zijn ze anders:
300000: FF FA FF FE
Ik heb ook een 2de poging gemaakt, en dit programma in C geschreven en geconfigureerd. De configuratie bytes van deze zijn de volgende:
300000 FF FA FF FE FF FF FB FF FF FF FF FF FF FF
Wat nog bijzonder is dat alle programmas werken, dus ook van voti, en ook van mij in assembly en in C. Het verschil zit alleen in de configuratie bytes. Van daar bij het verifying krijg ik een fout melding.
Ik heb nog iets geprobeerd, en dat maakt me nog meer nieuwsgierig. Na dat ik de flash van microcontroller helemaal schoon heb gemaakt(d.w.z de functie erase uitgevoerd) bevatten de configuratie bytes de volgende:
300000: 00 27 0F 0F 00 01 85 00 0F C0 0F E0 0F 40
en geen 300000 FF FA FF FE FF FF FB FF FF FF FF FF FF FF of zo iets.
Nu snap ik het helemaal niet. Dat betekent dat C en assembly compilators compileren mijn programma niet goed. ????????
In de configuratie bytes van me programma in assembly heb ik de volgende:
LIST P=18f258 ;directive to define processor
#include <P18F258.inc> ;processor specific variable definitions
;******************************************************************************
;Configuration bits
__CONFIG _CONFIG1H, _OSCS_OFF_1H & _HS_OSC_1H
__CONFIG _CONFIG2H, _WDT_OFF_2H
en de configuratie bytes van me programma in C worden bij het creëren van het project bij default goed ingesteld. Ik gebruik microC compiler.
Ik weet echt niet waarom moet het op die manier, maar ik heb het op de volgende manier opgelost:
;******************************************************************************
;Configuration bits
_CONFIG0 EQU H'300000'
__CONFIG _CONFIG0, 0x00
__CONFIG _CONFIG1H, 0x22;_OSCS_OFF_1H & _HS_OSC_1H
__CONFIG _CONFIG2L, 0x0f;_BOR_OFF_2L & _PWRT_ON_2L
__CONFIG _CONFIG2H, 0x0e;_WDT_OFF_2H
__CONFIG H'300004', 0x00; __CONFIG _CONFIG3H, 0x00;_CCP2MX_OFF_3H
__CONFIG H'300005', 0x01
__CONFIG _CONFIG4L, 0x85;_STVR_OFF_4L & _LVP_OFF_4L & _DEBUG_ON_4L
__CONFIG H'300007', 0x00
__CONFIG _CONFIG5L, 0x0f;_CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
__CONFIG _CONFIG5H, 0xc0;_CPB_OFF_5H & _CPD_OFF_5H
__CONFIG _CONFIG6L, 0x0f;_WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
__CONFIG _CONFIG6H, 0xe0;_WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
__CONFIG _CONFIG7L, 0x0f;_EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
__CONFIG _CONFIG7H, 0x40;_EBTRB_OFF_7HGewoon default configuratie aangepast
default 300000: 00 27 0F 0F 00 01 85 00 0F C0 0F E0 0F 40
aangepaste 300000: 00 22 0F 0e 00 01 85 00 0F C0 0F E0 0F 40
Nu werkt alles prima, alleen waarom moet het zo? heeft iemand hetzelfde probleme ooit tegen gekomen...
Hoi,
wat me opvalt is dat de waarde op 0x300001 anders is. Dit is de configuratie voor de klok.
0x22 = HS
0x27 = RCIO
Nu lijkt het mij dat als je deze PIC op 20MHz wilt hebben draaien dat 0x22 de juiste waarde is (in combinatie met een 20MHz kristal). Mocht je 'm op 40MHz willen laten draaien met een 10MHz kristal dan moet je de HSPLL modus gebruiken, deze heeft waarde 0x26. Uiteraard is het aantal instructies per seconde 'klok gedeeld door vier', maar dat wist je waarschijnlijk al.
Het andere verschil zit op 0x300003; en daar zit je probleem denk ik. Bij de waarde 0x0F staat de WDT (watchdog timer) aan en bij 0x0E niet (het gaat om bit 0).
Als je de WDT aanzet en je voert niet regelmatig de CLRWDT instructie uit, dan zal de watchdog de PIC telkens weer resetten... en dat is waarschijnlijk niet je bedoeling.
Maar dat verklaart waarom die andere waarde wel werkt.
Zie voor info datasheet 41159c van Microchip.
logic
Maar dat is logisch ...
"Ik heb nog iets geprobeerd, en dat maakt me nog meer nieuwsgierig. Na dat ik de flash van microcontroller helemaal schoon heb gemaakt(d.w.z de functie erase uitgevoerd) bevatten de configuratie bytes de volgende:
300000: 00 27 0F 0F 00 01 85 00 0F C0 0F E0 0F 40
en geen 300000 FF FA FF FE FF FF FB FF FF FF FF FF FF FF of zo iets."
Dat klopt wel.
Als je de PIC schoonmaakt, dan nemen de configuratie-bits hun defaultwaarde van 1 aan.
De bits die niet gebruikt worden, lezen altijd uit als 0.
Als je dus een byte hebt, waarvan alleen de laagste 4 bits gebruikt worden,
dan lezen de hoogste 4 bits altijd uit als 0.
Schrijf je FFh, dan lees je 0Fh: de hoogste 4 bits kun je niet hoog of laag maken.
De waardes "00 27 0F 0F 00 01 85 00 0F C0 0F E0 0F 40" zijn de waardes die je krijgt als alle gebruikte bits op 1 staan.
Maar als je ergens FFh naartoe schrijft, dan zul je bij het verifieren idd een verschil krijgen, want FFh is niet hetzelfde als b.v. 85h.
De foutmelding "Error: Verify error at address 0x300000. Value in image is 0xFF and value in target is 0x00" is dus (vanuit het PC-programma gezien) volkomen terecht.
De 1e byte wordt namelijk helemaal niet gebruikt!
Die leest dus altijd uit als 00h.
Maar daar houdt het PC-programma geen rekening mee.
Jij geeft op dat er FFh in de 1e byte moet komen, en het PC-programma constateert dat er geen FFh staat en geeft dus een foutmelding.
Ik heb een programma geschreven waarin je de configuratie-bytes (en ook de identification-bytes, device-id-bytes en eeprom-memory) kunt bekijken (en eventueel wijzigen) voordat je ze naar de PIC schrijft.
Als je belangstelling hebt, dan zeg je 't maar.