Stopwatch i MPLABX ger värde som ej stämmer med verkligheten

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
bos
Inlägg: 2273
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Stopwatch i MPLABX ger värde som ej stämmer med verkligheten

Inlägg av bos »

För en PIC16F688, som körs i 4MHz (intosc) behöver jag en delay på ca. 1 sekund. Jag har därför med hjälp av debug-stopwatchen i MPLAB letat upp lämpligt värde att köra en for-loop över.

Denna loop:

Kod: Markera allt

for (unsigned long n = 0; n < 219300; n++) {}
Ger detta värde i simulatorn:

Kod: Markera allt

Stopwatch cleared. Stopwatch cycle count = 0 (0 ns)
Target halted. Stopwatch cycle count = 4038340 (1.009585 s)
Vilket är helt OK delay för mitt ändamål. Men, när jag kör den koden på en fysisk krets så tar det strax över 10 sekunder för den att exekvera. Min första tanke här var att klockan är fel inställd, men jag har dubbelkollat och intosc är satt till 4MHz.

Varför blir det så gravt fel?


EDIT: Rubrik (MPLAB -> MPLABX)
Senast redigerad av bos 26 oktober 2017, 13:03:51, redigerad totalt 1 gång.
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Stopwatch i MPLAB ger värde som ej stämmer med verklighe

Inlägg av Icecap »

Finns det några aktiva interrupts i projektet?
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Stopwatch i MPLAB ger värde som ej stämmer med verklighe

Inlägg av sodjan »

Du skulle nog behöva jämföra den genererade koden i båda fallen
och se om de skiljer sig från varandra. Kanske att miljön "bygger"
olika beroende på om det ska köras i MPSim eller om det byggs
för produktion, så att säga.

Och interrupts, som Icecap påpekar, men med tanke på att du över
huvud taget ens funderar på den där typen av loopar, gör att jag inte
tror att du tittar på "finesser" som interrupts alls.

Det kanske är helt onödigt att tillägga att metoden för att åstadkomma
fördröjningar inte är lämplig i sig, men säger det ändå...
bos
Inlägg: 2273
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: Stopwatch i MPLAB ger värde som ej stämmer med verklighe

Inlägg av bos »

Du skulle nog behöva jämföra den genererade koden i båda fallen
och se om de skiljer sig från varandra. Kanske att miljön "bygger"
olika beroende på om det ska köras i MPSim eller om det byggs
för produktion, så att säga.
Det var ett bra tips. Det är fullt tänkbart att debug-info var påslaget när jag körde via simulatorn, medan det inte var det för produktionskoden. Ska kolla upp detta.

Interrupts är för övrigt helt avslagna (INTCON = 0).

Det enda den är kretsen gör är att en gång per sekund avläsa en analog signal med ADC och ändra en utgångspinne beroende på vad den analoga signalen var, så det kändes inte aktuellt med lyx och finess som snygga väntefunktioner, t.ex timer-interrupts eller motsvarande. En for-loop var enklast (även om det nu blev lite mismatch i tidsåtgång jämfört med simulatorn).
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Stopwatch i MPLAB ger värde som ej stämmer med verklighe

Inlägg av sodjan »

Ja, nu då du vet vilken tid det blev så är det ju enkelt
att räkna baklänges och hitta ett bra värde. Men bättre
är ju att förstå varför det blev som det blev...

Är det XC8? Se då även "3.5.10 How Can I Implement a Delay in My Code?"
i manulen samt beskrivningarna för __delay_ms(n) och __delay_us(n)
bos
Inlägg: 2273
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: Stopwatch i MPLAB ger värde som ej stämmer med verklighe

Inlägg av bos »

Det är definitivt nånting med simulatorn. Nu provade jag att klocka en enda nop:

Kod: Markera allt

Target halted. Stopwatch cycle count = 1 (250 ns)
För 4MHz är det där helt galet. Om jag räknar rätt borde det bli en instruktionstid på 1us, men simulatorn räknar alltså fyra gånger snabbare.

Där är med andra ord felkällan. Frågan är bara varför, eftersom jag ställt in 4MHz i ... och precis nu när jag skrev här insåg jag vad felet är. Klockinställningen i simulatorn är Instruction frequency, inte oscillator frequency. Det är en faktorsskillnad på 4 mellan de två. Jag ska med andra ord skriva 1MHz där istället för 4MHz.

Oerhört förvirrande att de valt "instruction frequency" istället för oscillator. Fast å andra sidan är felet mitt eftersom jag utgick från att det var det senare; hade jag bara läst vad som stått hade det inte varit några problem :lol:
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Stopwatch i MPLAB ger värde som ej stämmer med verklighe

Inlägg av sodjan »

Talar vi om MPSIM här? Jag har bestämt för mig att det
i alla fall *var* oscillator frekvensen man angav förr...
Är det gamla MPLAB8 eller MPLABX?
bos
Inlägg: 2273
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: Stopwatch i MPLAB ger värde som ej stämmer med verklighe

Inlägg av bos »

MPLABX. Olyckligtvis glömde jag "X" i ämnesraden.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Stopwatch i MPLABX ger värde som ej stämmer med verkligh

Inlägg av sodjan »

Jo, oscillator frekvensen brukar nog kallas "Fosc". Inte speciellt
intuitivt, det är ju normalt just oscillator frekvensen man talar om...
Skriv svar