Simulatorn i MPLAB, TMR0 räknar inte.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Simulatorn i MPLAB, TMR0 räknar inte.

Inlägg av PopUnoNkoK »

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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Simulatorn i MPLAB, TMR0 räknar inte.

Inlägg av sodjan »

PIC-modell ?
MPLAB version ?

Posta gärna en liten demo som visar problemet så att den
intresserade kan testa själv.
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: Simulatorn i MPLAB, TMR0 räknar inte.

Inlägg av PopUnoNkoK »

Ush, då måste jag juh visa min "fulkod". =)

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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Simulatorn i MPLAB, TMR0 räknar inte.

Inlägg av sodjan »

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å.
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: Simulatorn i MPLAB, TMR0 räknar inte.

Inlägg av PopUnoNkoK »

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
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: Simulatorn i MPLAB, TMR0 räknar inte.

Inlägg av PopUnoNkoK »

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.
hummel
Inlägg: 2545
Blev medlem: 28 november 2009, 10:40:52
Ort: Stockholm

Re: Simulatorn i MPLAB, TMR0 räknar inte.

Inlägg av hummel »

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?
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: Simulatorn i MPLAB, TMR0 räknar inte.

Inlägg av PopUnoNkoK »

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.
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: Simulatorn i MPLAB, TMR0 räknar inte.

Inlägg av PopUnoNkoK »

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. =)
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: Simulatorn i MPLAB, TMR0 räknar inte.

Inlägg av PopUnoNkoK »

Nu har jag ominstalerat MPLAB och det blev ingen skillnad...
TMR0 står still men jag hamnar ändå i ISRen.

Tröttsamt..
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Simulatorn i MPLAB, TMR0 räknar inte.

Inlägg av sodjan »

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...
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: Simulatorn i MPLAB, TMR0 räknar inte.

Inlägg av PopUnoNkoK »

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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Simulatorn i MPLAB, TMR0 räknar inte.

Inlägg av sodjan »

> 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" ??
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Simulatorn i MPLAB, TMR0 räknar inte.

Inlägg av sodjan »

> 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.
bos
Inlägg: 2314
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: Simulatorn i MPLAB, TMR0 räknar inte.

Inlägg av bos »

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å?
Skriv svar