Waardes van constantes bestaan niet in een firmwarefile, alleen in de sourcecode. Als jij in je programma schrijft:
pic basic code:
const MyConst As Byte[1] = (0xAA)
..
..
..
myByte = MyConst[0]
dan wordt de constante door de compiler meteen vertaald en eruit gesloopt. Wordt dan:
Bij het wissen van een 32 word block (kleinste mogelijk) moet je vooraf wel de overige words lezen als je ze weer wilt herstellen...
De waarde 0x3FFF voor de overige bytes is eigenlijk 'leeg', zodat die bytes ongebruikt blijven.
Als er een ORG achter staat, wordt de waarde op die plaats geschreven tijdens programmeren.
Als je die later zelf verandert, blijft die veranderde waarde gewoon bewaard...
Normaal zijn constantes er alleen voor de leesbaarheid, je kunt ook net zo goed meteen een waarde gebruiken.
Het kan trouwens nog eenvoudiger. Default zijn alle geheugenplaatsen leeg (0x3FFF)
Je kunt ook waardes schrijven zonder eerst te wissen, zolang het aantal '0' bits maar groter wordt.
(je kunt van een '1' een '0' maken, maar niet andersom)
pic basic code:
Program Test
Dim MyByte As Byte
led1 As sBit At Latb.0
led2 As sBit At Latb.1
WrBuff AS Word[4]
main:
trisb = 0
anselb = 0
latb = 0
MyByte = Flash_read(0x1FFF)
If MyByte = 0xFF Then
led1 = 1 delay_ms(1000) led1 = 0
Flash_erase(0x1FE0)
WrBuff[0] = 0x3FFF
WrBuff[1] = 0x3FFF
WrBuff[2] = 0x3FFF
WrBuff[3] = 0x0055
Flash_Write(0x1ffC, WrBuff)
Else
led2 = 1 delay_ms(1000) led2 = 0
End If
While True Wend
End.
Je hebt dan geen const nodig. Wel moet je de linkerfile (.mlk) voor de 16F1847 aanpassen zodat de compiler de laatste 4 bytes niet gebruikt.
code:
<MCU>
<DEVICE_NAME>P16F1847</DEVICE_NAME>
<ROM>
<MIN_ADDR>0x0</MIN_ADDR>
<MAX_ADDR>0x1fff</MAX_ADDR>
</ROM>
De 0x1fff moet dan 0x1ffb worden.
[Bericht gewijzigd door
Arco
op maandag 27 april 2020 00:06:00
(42%)