Simulatorn i MPLAB, TMR0 räknar inte.
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Simulatorn i MPLAB, TMR0 räknar inte.
Jag har skrivit ihop lite kod för att komma igång igen med PIC programmering.
En blinkande diod som där det är TMR0 som sköter räknandet.
Allt fungerade som det ska i början. Simulerade i MPLAB innan jag laddade in koden i PICen och verkligheten stämde överens med simuleringen, som det ska göra.
Men efter att ha gjort en ändring i koden, ändrat ett decimaltal från 2 till 10 í en räknare som förlänger blinktiden, inte prescalern.
Efter detta så räknar TMR0 inte upp i simulatorn. Men om jag laddar ner den nya koden i PICen så fungerar det som jag vill, Dioden blinkar vilket bevisar att TMR0 är på och "rullar på" i verkligheten.
Är detta ett problem som någon känner till? Någon som har ett "botemedel" för strejkande TMR0 i simulatorn.
MVH Peter
En blinkande diod som där det är TMR0 som sköter räknandet.
Allt fungerade som det ska i början. Simulerade i MPLAB innan jag laddade in koden i PICen och verkligheten stämde överens med simuleringen, som det ska göra.
Men efter att ha gjort en ändring i koden, ändrat ett decimaltal från 2 till 10 í en räknare som förlänger blinktiden, inte prescalern.
Efter detta så räknar TMR0 inte upp i simulatorn. Men om jag laddar ner den nya koden i PICen så fungerar det som jag vill, Dioden blinkar vilket bevisar att TMR0 är på och "rullar på" i verkligheten.
Är detta ett problem som någon känner till? Någon som har ett "botemedel" för strejkande TMR0 i simulatorn.
MVH Peter
Re: Simulatorn i MPLAB, TMR0 räknar inte.
PIC-modell ?
MPLAB version ?
Posta gärna en liten demo som visar problemet så att den
intresserade kan testa själv.
MPLAB version ?
Posta gärna en liten demo som visar problemet så att den
intresserade kan testa själv.
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: Simulatorn i MPLAB, TMR0 räknar inte.
Ush, då måste jag juh visa min "fulkod". =)
PIC: 16f690
MPLAB: 8.76.00.00
Koden:
Jag är fullt medveten om att det är i alla fall ett par ställen i denna korta kod som man kan skriva betydligt enklare och snyggare. Tex där jag tänder och släcker dioden i ISR:en.
Så om någon har förslag på lösning till simulator problemet så mottages det tacksamt.
Ska prova mer i helgen.
MVH Peter
Ps, ush vad fult det blir med inklistrad kod, Ds.
PIC: 16f690
MPLAB: 8.76.00.00
Koden:
Kod: Markera allt
list p=16f690 ; list directive to define processor
#include <P16F690.inc> ; processor specific variable definitions
__CONFIG _CP_OFF & _CPD_OFF & _BOR_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_ON & _FCMEN_OFF & _IESO_OFF
; '__CONFIG' directive is used to embed configuration data within .asm file.
; The labels following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.
;***** VARIABLE DEFINITIONS
w_temp EQU 0x7D ; variable used for context saving
status_temp EQU 0x7E ; variable used for context saving
pclath_temp EQU 0x7F ; variable used for context saving
cblock 0x20 ;Minnesbanker som används i koden
d1
endc
;**********************************************************************
ORG 0x000 ; processor reset vector
goto main ; go to beginning of program
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movf PCLATH,w ; move pclath register into W register
movwf pclath_temp ; save off contents of PCLATH register
; isr code can go here or be located as a call subroutine elsewhere
NOP
MOVLW .0
MOVWF TMR0
BCF INTCON, T0IF
DECFSZ d1
GOTO endIsr
movlw .10
movwf d1
BTFSS PORTC,0
GOTO pa
BTFSC PORTC,0
GOTO av
GOTO endIsr
av
BCF PORTC,0
GOTO endIsr
pa
BSF PORTC,0
endIsr
movf pclath_temp,w ; retrieve copy of PCLATH register
movwf PCLATH ; restore pre-isr PCLATH register contents
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
main
; remaining code goes here
BANKSEL PORTC
CLRF PORTC ;Init PORTC
BANKSEL ANSEL
CLRF ANSEL ;digital I/O
BANKSEL TRISC
MOVLW 0Ch ;Set RC<3:2> as inputs
MOVWF TRISC ;and set RC<5:4,1:0>
;as outputs
BCF STATUS,RP0 ;Bank 0
CLRWDT ;Clear WDT and
;prescaler
BANKSEL OPTION_REG
MOVLW b'00000111' ;Select TMR0,
;prescale, and
;clock source
MOVWF OPTION_REG ;
BANKSEL INTCON
MOVLW 0xA0
MOVWF INTCON ;Global interrupt and TMR0 interrupt enabled
movlw .10
movwf d1
Loop
nop
GOTO Loop
ORG 0x2100 ; data EEPROM location
DE 1,2,3,4 ; define first four EEPROM locations as 1, 2, 3, and 4
END ; directive 'end of program'
Jag är fullt medveten om att det är i alla fall ett par ställen i denna korta kod som man kan skriva betydligt enklare och snyggare. Tex där jag tänder och släcker dioden i ISR:en.
Så om någon har förslag på lösning till simulator problemet så mottages det tacksamt.
Ska prova mer i helgen.
MVH Peter
Ps, ush vad fult det blir med inklistrad kod, Ds.
Re: Simulatorn i MPLAB, TMR0 räknar inte.
Kopierade din kod i ett test-projekt.
Visar TMR0 i watch.
Kör animate (med kortaste step-tid).
TMR0 räknar upp långsamt.
Fungerar alltså.
Visar TMR0 i watch.
Kör animate (med kortaste step-tid).
TMR0 räknar upp långsamt.
Fungerar alltså.
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: Simulatorn i MPLAB, TMR0 räknar inte.
Irriterande problem.
Har testat mer nu och när jag kör animate eller stegar med step in så räknar inte tmr0 upp någonting. Jag har både uppe fönstret "file registers" och lagt till den på "Watch" men det händer inget.
Men kör jag "run" i simulatorn så hamnar jag likförbenat i ISRen med en halv sekunds intervall. Vilket var ungefär det jag siktade på. Känns riktigt skumt.
Kan det vara så att jag lyckats få en bugg i MPLAB. hmm
MVH Peter
Har testat mer nu och när jag kör animate eller stegar med step in så räknar inte tmr0 upp någonting. Jag har både uppe fönstret "file registers" och lagt till den på "Watch" men det händer inget.
Men kör jag "run" i simulatorn så hamnar jag likförbenat i ISRen med en halv sekunds intervall. Vilket var ungefär det jag siktade på. Känns riktigt skumt.
Kan det vara så att jag lyckats få en bugg i MPLAB. hmm
MVH Peter
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: Simulatorn i MPLAB, TMR0 räknar inte.
Kom precis på att det kan ha varit i samma veva som jag tryckte Clear memory i menyn, alltså:
Debugger -> Clear Memory -> All memory
Kan det ha nåt med saken att göra?
Jag tycker inte det. Har "Build All" flera ggr efter det och det är samma problem i alla fall. Men i den fysiska PICen så funkar det precis som jag vill.. Lite segt att inte simulatorn är med på noterna.
Debugger -> Clear Memory -> All memory
Kan det ha nåt med saken att göra?
Jag tycker inte det. Har "Build All" flera ggr efter det och det är samma problem i alla fall. Men i den fysiska PICen så funkar det precis som jag vill.. Lite segt att inte simulatorn är med på noterna.
Re: Simulatorn i MPLAB, TMR0 räknar inte.
Konstigt då det funkar för sodjan och han brukar veta vad han gör. Har du testat exakt på samma sätt som honom?
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: Simulatorn i MPLAB, TMR0 räknar inte.
Koden är identisk. Copy paste helt enkelt. Det är juh om det är någon icke kodrelaterad grej i MPLAB men det låter konstigt. De andra registren som jag har i watchfönstret ändras som de ska. Tex PORTC, OPTION_REG och INTCON.
Funderar på att ominstalera MPLAB, vi får se om jag orkar ikväll.
Funderar på att ominstalera MPLAB, vi får se om jag orkar ikväll.
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: Simulatorn i MPLAB, TMR0 räknar inte.
Snacka om déjà vu.
När jag satt och funderade på vad som kunde vara fel så började det gnaga en lite känsla att jag varit med om detta förr. Så jag letade bland mina gamla inlägg här på forumet.
Se på tusan:
http://elektronikforumet.com/forum/view ... 15#p443715
Tråden handlade om något annat men TMR0 räknade inte upp för mig i Simulatorn, Sodjan bad mig posta kod, han kollade och det funkade för honom. PRECIS som nu.
Detta är alltså två år senare, annan dator, annan MPLAB version...
Då verkar vi ha kommit fram till att MPLAB helt enkelt bråkade med mig.
Lutar väl åt en ominstalation.
PS Tack Sodjan för att du hjälpt mig med exakt samma problem 2 ggr. =)
När jag satt och funderade på vad som kunde vara fel så började det gnaga en lite känsla att jag varit med om detta förr. Så jag letade bland mina gamla inlägg här på forumet.
Se på tusan:
http://elektronikforumet.com/forum/view ... 15#p443715
Tråden handlade om något annat men TMR0 räknade inte upp för mig i Simulatorn, Sodjan bad mig posta kod, han kollade och det funkade för honom. PRECIS som nu.
Detta är alltså två år senare, annan dator, annan MPLAB version...
Då verkar vi ha kommit fram till att MPLAB helt enkelt bråkade med mig.
Lutar väl åt en ominstalation.
PS Tack Sodjan för att du hjälpt mig med exakt samma problem 2 ggr. =)
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: Simulatorn i MPLAB, TMR0 räknar inte.
Nu har jag ominstalerat MPLAB och det blev ingen skillnad...
TMR0 står still men jag hamnar ändå i ISRen.
Tröttsamt..
TMR0 står still men jag hamnar ändå i ISRen.
Tröttsamt..
Re: Simulatorn i MPLAB, TMR0 räknar inte.
Ja, där ser man.
Det enda jag gjorde för att det inte skulle ta så jäkla lång tid
var att öka animate-speed till max. Då räknade TMR0 upp med
ett seg per 10 sekund ungefär. Med standard/default animate-speed
skulle det ta massor av tid.
Om man kör "run" och sedan "Halt" (eller vad det kallas) så hoppar
TMR0 fram så långt som den då har hunnit.
När du kör "animate", går markören genom koden och fastnar i
loopen alls ?
Jag gjorde ingenting med koden (fast den genererar massor av "col 0"
warningar, så klart).
För att kolla lite, bara som en test, sätt ner TMR0 prescaler lågt för att
få mer speed på det hela.
Har du testat att sätta ett breakpoint inne i ISR'en och sedan köra "Run" ?
EDIT: Jag körde också "Release" instället för "Debug" som jag tror var valt
som default i mitt test-projekt. Jag fick också välja rätt tool-chain (MPASM
istället för HiTech) men annars så assemblerar det ju inte alls...
Det enda jag gjorde för att det inte skulle ta så jäkla lång tid
var att öka animate-speed till max. Då räknade TMR0 upp med
ett seg per 10 sekund ungefär. Med standard/default animate-speed
skulle det ta massor av tid.
Om man kör "run" och sedan "Halt" (eller vad det kallas) så hoppar
TMR0 fram så långt som den då har hunnit.
När du kör "animate", går markören genom koden och fastnar i
loopen alls ?
Jag gjorde ingenting med koden (fast den genererar massor av "col 0"
warningar, så klart).
För att kolla lite, bara som en test, sätt ner TMR0 prescaler lågt för att
få mer speed på det hela.
Har du testat att sätta ett breakpoint inne i ISR'en och sedan köra "Run" ?
EDIT: Jag körde också "Release" instället för "Debug" som jag tror var valt
som default i mitt test-projekt. Jag fick också välja rätt tool-chain (MPASM
istället för HiTech) men annars så assemblerar det ju inte alls...
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: Simulatorn i MPLAB, TMR0 räknar inte.
Tack för svar Sodjan.
Jag ska kolla de sakerna som du gjort som jag inte har koll på.
Det jag har gjort är just att sätta BreakPoint i ISR:en och när jag kör "Run" så hamnar den där, fastnar på BreakPointen.
Jag är ganska säker på att jag har kört RUN och sedan HALT och att TMR0 stått kvar på noll, men det ska testas under dagen. (Sitter inte vid labbdatorn nu)
Det låter så sanslöst otroligt att jag skulle ha stött på en bugg 2 ggr i MPLAB, jag är ganska säker att det är mina ringa kunskaper som ställer till bekymmer.
Errormedd. ska jag ta itu med när jag fått koll på detta.
MVH Peter
PS. Det jag ska ge mig på när tid ges är ShiftRegister (för att användas med 7seg disp) och PIR i relation till en PIC. Ds
Jag ska kolla de sakerna som du gjort som jag inte har koll på.
Det jag har gjort är just att sätta BreakPoint i ISR:en och när jag kör "Run" så hamnar den där, fastnar på BreakPointen.
Jag är ganska säker på att jag har kört RUN och sedan HALT och att TMR0 stått kvar på noll, men det ska testas under dagen. (Sitter inte vid labbdatorn nu)
Det låter så sanslöst otroligt att jag skulle ha stött på en bugg 2 ggr i MPLAB, jag är ganska säker att det är mina ringa kunskaper som ställer till bekymmer.
Errormedd. ska jag ta itu med när jag fått koll på detta.
MVH Peter
PS. Det jag ska ge mig på när tid ges är ShiftRegister (för att användas med 7seg disp) och PIR i relation till en PIC. Ds
Re: Simulatorn i MPLAB, TMR0 räknar inte.
> Kan det vara så att jag lyckats få en bugg i MPLAB. hmm
> MPLAB: 8.76.00.00
Jag kör 8.76.00.00
Varför ser inte jag samma "bug" ??
> MPLAB: 8.76.00.00
Jag kör 8.76.00.00
Varför ser inte jag samma "bug" ??
Re: Simulatorn i MPLAB, TMR0 räknar inte.
> Det jag har gjort är just att sätta BreakPoint i ISR:en och när jag kör "Run" så hamnar den där, fastnar på BreakPointen.
Japp, det betyder ju att Timer0 räknar som den ska.
Japp, det betyder ju att Timer0 räknar som den ska.
Re: Simulatorn i MPLAB, TMR0 räknar inte.
Nu testade jag i MPLAB v8.63. Om jag ändrar prescalern till '001' istället för '111' (har inte datblad till hands men jag gissar att 111 = 1:256 och 001 = 1:2) så räknar TMR0 upp på var tredje kodrad eller så.
Sen ställde jag om prescale till 111 och inget händer (troligtvis tar det så lång tid innan TMR0 stegas), men jag ställde istället om simulatorklockan till 500MHz istället för 20MHz, och inget hände ändå. Kanske låser MPLAB processorn på 20MHz som är max, jag vet inte, men det jag lyckats ta reda på med det här korta testet är att TMR0 stegas inte över huvud taget förrän man ställt in prescale.
Hur som helst. När koden kommit till "Loop" så klickade jag Project -> Stopwatch och nollställde den, satte en breakpoint i ISR och tryckte F9 ("run"). När koden hamnar i ISR så har 63739 instruktioner körts. Med 1:256 prescale blir det 248 instruktioner för varje TMR0-ökning.
Om du håller inne F8 (step) vid "Loop" 248 gånger, ökas TMR0 då?
Sen ställde jag om prescale till 111 och inget händer (troligtvis tar det så lång tid innan TMR0 stegas), men jag ställde istället om simulatorklockan till 500MHz istället för 20MHz, och inget hände ändå. Kanske låser MPLAB processorn på 20MHz som är max, jag vet inte, men det jag lyckats ta reda på med det här korta testet är att TMR0 stegas inte över huvud taget förrän man ställt in prescale.
Hur som helst. När koden kommit till "Loop" så klickade jag Project -> Stopwatch och nollställde den, satte en breakpoint i ISR och tryckte F9 ("run"). När koden hamnar i ISR så har 63739 instruktioner körts. Med 1:256 prescale blir det 248 instruktioner för varje TMR0-ökning.
Om du håller inne F8 (step) vid "Loop" 248 gånger, ökas TMR0 då?