Hej jag undrar om någon här har koll på hur minnesaddreseringen sker på PIC18F2550 i program minnet när PC(Program Counter) Är ett negativt värde.
För när man använder kommandot BRA så verkar det som enligt databladet för PIC18F2550 att PC kan få ett negativt värde, men vart pekar den då i program minnet?
Så här står det i databladet:
Rimligen menas att n kan vara positiv eller negativ, du kan alltså hoppa framåt eller bakåt, dvs öka eller minska PC.
Dock inom gränserna som anges även om minnet i sig är större.
Castor skrev:Rimligen menas att n kan vara positiv eller negativ, du kan alltså hoppa framåt eller bakåt, dvs öka eller minska PC.
Dock inom gränserna som anges även om minnet i sig är större.
Så om PC skulle bli negativ så bör man sätta den till 0?
PC kan aldrig bli negativ (skrev jag inte det?).
Däremot kan den "slå över" och man bör väl programmera
så att det undviks. Varför är det ett problem? Vid en BRA
till en label i koden så kan det ju aldrig inträffa.
Nu förutsätter jag vissa saker: Du skriver assembler och vill göra BRA (branch=hopp?) ? Då vill du fortsätta där rutinen XYZ finns, då räknar assemblern (när du kör den) ut skillnaden mellan nuvarande PC och adressen XYZ och lägger det som en offset (som kan vara positiv eller negativ) efter koden för BRA. När koden sedan exekveras adderas offseten till PC och PC ersätts med det nya värdet (hopp framåt eller bakåt) och programmet fortsätter därifrån.
Jag kör andra processorer än PIC så om detta är fel får någon PIC-guru rätta.
Korrekt. Men labeln du hoppar till kan ju inte ligga "under" koden
så att argumentet till BRA skulle kunna peka längre "tillbaka"
än vad det faktiskt finns tillgänglig kod. *All* kod ligger så klart
på positiva adresser.
Kanske bättre om Emil beskrivet ett faktiskt fall där detta är ett problem.
Rent tekniskt kan man ha en BRA på en låg adress med ett argument
som är större (och negativt) än den egna adressen. Detta skulle få
PC att "slå runt" till en hög adress. Sedan början den läsa instruktion
0x000, vilket av processorn tolkas som NOP och den stegar då bara
fram till adress "noll" och startar i princip om. Men detta är ju inget
som händer i praktiken...
5.1 Program Memory Organization
PIC18 microcontrollers implement a 21-bit program
counter which is capable of addressing a 2-Mbyte
program memory space. Accessing a location between
the upper boundary of the physically implemented
memory and the 2-Mbyte address will return all ‘0’s (a
NOP instruction).