Sida 1 av 1
Stopwatch i MPLABX ger värde som ej stämmer med verkligheten
Postat: 26 oktober 2017, 10:49:52
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)
Re: Stopwatch i MPLAB ger värde som ej stämmer med verklighe
Postat: 26 oktober 2017, 10:55:53
av Icecap
Finns det några aktiva interrupts i projektet?
Re: Stopwatch i MPLAB ger värde som ej stämmer med verklighe
Postat: 26 oktober 2017, 10:58:52
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å...
Re: Stopwatch i MPLAB ger värde som ej stämmer med verklighe
Postat: 26 oktober 2017, 11:33:39
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).
Re: Stopwatch i MPLAB ger värde som ej stämmer med verklighe
Postat: 26 oktober 2017, 12:11:46
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)
Re: Stopwatch i MPLAB ger värde som ej stämmer med verklighe
Postat: 26 oktober 2017, 12:23:24
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

Re: Stopwatch i MPLAB ger värde som ej stämmer med verklighe
Postat: 26 oktober 2017, 12:26:17
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?
Re: Stopwatch i MPLAB ger värde som ej stämmer med verklighe
Postat: 26 oktober 2017, 13:03:18
av bos
MPLABX. Olyckligtvis glömde jag "X" i ämnesraden.
Re: Stopwatch i MPLABX ger värde som ej stämmer med verkligh
Postat: 26 oktober 2017, 14:35:08
av sodjan
Jo, oscillator frekvensen brukar nog kallas "Fosc". Inte speciellt
intuitivt, det är ju normalt just oscillator frekvensen man talar om...