PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
PopUnoNkoK
Inlägg: 789 Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå
Inlägg
av PopUnoNkoK » 1 april 2009, 11:22:04
v-g:
Det var PEIE som var problemet. Tusen tack. Det står inget om den i Tmr0 kapitlet förutom att den är med i "bit-tabellen" för INTCON.
Sodjan: Du har helt rätt att sättet att skriva som du tipsade om känns renare och mer lättläst, i alla fall för mig. Så nu ser det ut så här.
Kod: Markera allt
; configure interrupts
bsf INTCON, GIE
bsf INTCON, T0IE
bsf INTCON, PEIE
Tack för hjälpen "yet again"...
MVH Peter F
sodjan
EF Sponsor
Inlägg: 43251 Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Inlägg
av sodjan » 1 april 2009, 11:35:14
PEIE ska inte behövas för Timer *0*.
Jag kollade just detta tidigare, men eftersom jag tolkade det
som att PEIE inte hade med detta att göra så skrev jag inget
om det...
> förutom att den är med i "bit-tabellen" för INTCON.
Och där är den gråmarkerad och "Shaded cells are not used for Timer0."
Märkligt. Kan vara en bugg i MPSIM...
PopUnoNkoK
Inlägg: 789 Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå
Inlägg
av PopUnoNkoK » 1 april 2009, 11:39:09
Förmodligen har du rätt Sodjan, för nu fungerar det inte igen... Jag stegade innan jag skrev det förra inlägget och såg hur TMR0 stegade upp till FF och sedan hamnade jag i ISR. Sedan skrev jag förstås inlägget och var glad som en lärka. Nu när jag testar igen så står TMR0 still och pga det hamnar jag aldrig i ISR:en... Jag har inte ändrat något sedan det fungerade...
Verkar nästan vara en bugg i MPLAB, men jag vill inte säga det riktigt för det är såååå mycket annat som jag inte har koll på som det kan vara...
MVH Peter F
sodjan
EF Sponsor
Inlägg: 43251 Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Inlägg
av sodjan » 1 april 2009, 11:41:12
> Nu när jag testar igen så står TMR0 still
OK, det har ju inte direkt med interruptet att göra.
Sätt watch på STATUS och kolla att TMR0 inte är avstängd o.s.v.
PopUnoNkoK
Inlägg: 789 Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå
Inlägg
av PopUnoNkoK » 1 april 2009, 11:56:46
Nu blir det så där jobbigt igen.
Jag vet inte hur man använder Watch i MPLAB (Låter som en trevlig funktion)
, hittar det inte, MEN jag har uppe File Registers fönstret och ser Status minnet.
När jag läster i databladet hittar jag dock inte vilken bit i status registret som skulle påverka Tmr0 eller Timers i allmänhet.
Status registret ändras lite när jag stegar igenom början av koden (Banksel osv) men när jag är nere i Mainloopen så är det bara bit 3 & 4 som är "set". "00011000".
Inner bär någon av dessa bitar att Timern är avstängd?
MVH Peter F
sodjan
EF Sponsor
Inlägg: 43251 Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Inlägg
av sodjan » 1 april 2009, 11:59:46
Glöm STATUS, jag menade OPTION...
PopUnoNkoK
Inlägg: 789 Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå
Inlägg
av PopUnoNkoK » 1 april 2009, 12:11:33
Detta är värdet som ligger i Option Reg helatiden (förutom första snutten innan jag ställt in Timern).
"00001000"
Bit 7&6 (borde) inte spela någon roll.
Bit 5 t0CS är "0" vilket innebär internal instruction cycle clock vilket är det jag vill ha.
Bit 4 (borde) inte spela någon roll.
Bit 3 PSA är "1", jag vill inte ha någon prescaler.
Bit 2-0 (borde) inte spela någon roll då jag inte använder prescaler till Trm0.
Är det något mer jag har missat?
När jag väljer att inte använda prescalern så sätter man juh den till WatchDog timern men den är avstängd i __configbitarna, kan det ställa till bekymmer?
MVH Peter F
sodjan
EF Sponsor
Inlägg: 43251 Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Inlägg
av sodjan » 1 april 2009, 12:20:05
Kan du posta ett aktuellt kodexempel som jag kan köra i MPSIM ?
PopUnoNkoK
Inlägg: 789 Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå
Inlägg
av PopUnoNkoK » 1 april 2009, 12:24:35
Absolut
Kod: Markera allt
;************************************************************************
; *
; Filename: MA_L6-Flash_LED-50p-int-1Hz.asm *
; Date: 23/11/08 *
; File Version: 1.0 *
; *
; Author: David Meiklejohn *
; Company: Gooligum Electronics *
; *
;************************************************************************
; *
; Architecture: Midrange PIC *
; Processor: 12F629 *
; *
;************************************************************************
; *
; Files required: none *
; *
;************************************************************************
; *
; Description: Lesson 6 exercise 1c *
; *
; Demonstrates use of Timer0 interrupt to perform a background task *
; *
; Flash an LED at exactly 1 Hz (50% duty cycle). *
; *
;************************************************************************
; *
; Pin assignments: *
; GP2 - flashing LED *
; *
;************************************************************************
processor 16f628a
include <p16f628a.inc>
;**** CONFIGURATION
__config _INTOSC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _LVP_OFF
errorlevel -302 ; no "register not in bank 0" warnings
errorlevel -312 ; no "page or bank selection not needed for this device" messages
;=====================================================================
; File register use
;=====================================================================
cblock H'20'
; variables used for context saving
cs_W
cs_STATUS
TidTagning1
TidTagning2
TidTagning3
S1Cnt ; Servo 1 Uptime
S2Cnt ; Servo 2 Uptime
DownCnt ; Nere tid
LEDCnt ; Led för testing
S1TIME
S2TIME
LEDTIME
DOWNTIME
Outputs ; Output storage
flagga ;flagga för att välja vilken kod som ska utföras vid interrupt
endc
; pin assignments
S1 equ B'0000001' ; Mask for LED1
S2 equ B'0000010' ; Mask for LED2
LED equ B'0000010' ; Mask for LED3
;***** VARIABLE DEFINITIONS
;************************************************************************
goto Start
;***** INTERRUPT SERVICE ROUTINE
ISR ORG 0004h
; save context
movwf cs_W ; save W
movf STATUS,w ; save STATUS
movwf cs_STATUS
; service Timer0 interrupt
; TMR0 overflows every 60 clocks = 60 us
; (only Timer0 interrupts are enabled)
;
movlw .256-.60+.3 ; add value to Timer0
banksel TMR0 ; for overflow after 60 counts
addwf TMR0,f
bcf INTCON,T0IF ; clear interrupt flag
;-------- tidtagningen -------------
decfsz TidTagning1,f ; decrement interrupt count
goto puls
movlw .255
movwf TidTagning1
decfsz TidTagning2,f ; decrement interrupt count
goto puls
; incf S1TIME,1 ; decrement interrupt count
movlw .255
movwf TidTagning2
;decfsz TidTagning3,f ; decrement interrupt count
;movlw .255
;movwf TidTagning3
;goto puls
;incf S1TIME,1 ; decrement interrupt count
puls
btfss flagga, 0
goto down
ettan ; count for Servo 1time
;banksel S1Cnt
decfsz S1Cnt,f ; decrement interrupt count
goto isr_end ; when count = 0 (every 40 interrupts = 10 ms)
movfw S1TIME ; reload count
movwf S1Cnt
; toggle LED every 500 ms
;decfsz cnt_10ms,f ; decrement 10 ms period count
;goto isr_end ; when count = 0 (every 50 times = 500 ms)
;movlw .50 ; reload count
;movwf cnt_10ms
call S1sub
bsf flagga, 0
goto isr_end
tvaan
goto isr_end
down ; count for down time
;banksel S1Cnt
decfsz DownCnt,f ; decrement interrupt count
goto isr_end ; when count = 0 (every 40 interrupts = 10 ms)
movfw DOWNTIME ; reload count
movwf DownCnt
call LEDsub
bcf flagga, 0
goto isr_end
isr_end ; restore context then return
movf cs_STATUS,w ; restore STATUS
movwf STATUS
swapf cs_W,f ; restore W
swapf cs_W,w
retfie
;***** MAIN PROGRAM
Start
;---------------------------------------------------------------------
; Set up I/O
;---------------------------------------------------------------------
banksel TRISB ;
clrw ; Make all PORTB bits output
movwf TRISB ;
movlw B'00000010' ; Setup PORTA
movwf TRISA ;
banksel PORTA ; Back to bank 0
MOVLW 0x07 ;Turn comparators off and
MOVWF CMCON ;enable pins
errorlevel +302
; configure Timer0
movlw b'00001000' ; timer mode (T0CS = 0),
Banksel OPTION_REG ; no prescaling (PSA = 1)
movwf OPTION_REG ; -> increment TMR0 every 1 us
banksel PORTA ; Back to bank 0
;---------------------------------------------------------------------
; Initialize memory
;---------------------------------------------------------------------
movlw B'00000001' ; Startvärdet ska vara 1 för att dungera?
movwf Outputs ; to off
;movlw B'00000000' ;
movwf flagga ;flaggan till noll
movlw .17
movwf S1TIME
movwf S2TIME
movlw .255
movwf LEDTIME
movwf DOWNTIME
movwf TidTagning1
movwf TidTagning2
movwf TidTagning3
movfw S1TIME ; Initialize the counters
movwf S1Cnt ;
movfw S2TIME
movwf S2Cnt
movfw LEDTIME
movwf LEDCnt
; configure interrupts
bsf INTCON, GIE
bsf INTCON, T0IE
bsf INTCON, PEIE
;***** Main loop
loop
btfsc PORTA,1
goto loop
PBnere btfss PORTA,1
goto PBnere
bsf PORTB, 1
incf S1TIME,1 ; decrement interrupt count
goto loop
;=====================================================================
; Subroutines
;=====================================================================
SendOut
movf Outputs,W ; Pick up the output word
movwf PORTB ; And send it to the world
return
;---------------------------------------------------------------------
; LED code
;---------------------------------------------------------------------
LEDsub
movlw LED ; Toggle LED bit by
xorwf Outputs,F ; XORing with current state
call SendOut ; Set outputs
return
;---------------------------------------------------------------------
; Servo Two code
;---------------------------------------------------------------------
S2sub
movlw S2 ; Hämta masken
xorwf Outputs,F ; XORing with current state
call SendOut ; Set outputs
return
;---------------------------------------------------------------------
; Servo One code
;---------------------------------------------------------------------
S1sub
movlw S1 ; Hämta masken
xorwf Outputs,F ; XORing with current state
call SendOut ; Set outputs
return
Break
nop
return
END
Men nu får man juh skämmas för att koden inte ser så strukturerad ut...
Jag blir lätt så ivrig...
Tack för att du testar den i en annan MPLAB.
MVH Peter F
sodjan
EF Sponsor
Inlägg: 43251 Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Inlägg
av sodjan » 1 april 2009, 12:33:35
Funka direkt. TMR0 räknade upp till FF och man hamnar i ISR'en...
Kör MPLAB 8.10...
TMR0 räknade upp ett "steg" för varje tryck på F7 ("step into").
PopUnoNkoK
Inlägg: 789 Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå
Inlägg
av PopUnoNkoK » 1 april 2009, 12:38:14
Hmmm.. Jag då får vi väl anta att koden stämmer... Jag kör MPLAB 8.20, skulle kunna vara något problem där men det känns trots allt lite långsökt. Jag är naiv och vill tro att Microchip kan sina saker...
Ser dock att det finns en version 8.30, kanske man ska ge den ett försök...
Tack för att du testade
sodjan
EF Sponsor
Inlägg: 43251 Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Inlägg
av sodjan » 1 april 2009, 12:48:07
Fungerade lika bra i 8.30, slängde just in den...
PopUnoNkoK
Inlägg: 789 Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå
Inlägg
av PopUnoNkoK » 1 april 2009, 14:19:42
Nu har jag också uppgraderat till 8.30 och då fungerar det, i alla fram till och med nu. Jag väntade ett tag med att skriva detta svar så att jag har testkört det i ca en timme och det fungerar fint (än i alla fall).
Jag har blivit lite skeptisk.
Tack för hjälpen...
MVH Peter F
v-g
EF Sponsor
Inlägg: 7875 Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce
Inlägg
av v-g » 1 april 2009, 17:43:32
Jag har också varit med om att simuleringen inte stämmer, men kan tyvärr inte minnas i vilket fall/version detta skedde.