stimulus controller i mplab?
Re: stimulus controller i mplab?
Notera att av olika anledningar (störningskänslighet m.m.) så är det
vanligast att knappar, givare, sensorer m.m har "låg" som aktiva nivå.
En anledning är att det gör det enklare att ansluta till utrustning med
olika matningsspänning, det är ju bara att lägga pull-up motståndet till 3.3V
eller 5V eller vad det nu är. GND är alltid GND oavsett matningsspänning.
Så "pull-up" är mycket vanligare än "pull-down". Många PIC processorer har
även inbyggda pull-up "motstånd" på sina pinnar som kan slås på vid
behov. Ersätter den externa motståndet. Jag skrev "motstånd" eftersom
det i just det fallet inte är *motstånd* utan en svagt ledande mosfet...
Kolla efter "WPU" ("Weak Pull-Up") i databladen.
vanligast att knappar, givare, sensorer m.m har "låg" som aktiva nivå.
En anledning är att det gör det enklare att ansluta till utrustning med
olika matningsspänning, det är ju bara att lägga pull-up motståndet till 3.3V
eller 5V eller vad det nu är. GND är alltid GND oavsett matningsspänning.
Så "pull-up" är mycket vanligare än "pull-down". Många PIC processorer har
även inbyggda pull-up "motstånd" på sina pinnar som kan slås på vid
behov. Ersätter den externa motståndet. Jag skrev "motstånd" eftersom
det i just det fallet inte är *motstånd* utan en svagt ledande mosfet...
Kolla efter "WPU" ("Weak Pull-Up") i databladen.
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: stimulus controller i mplab?
Jag provar att lägga till en följd fråga angående MPlab här istället för att starta en ny tråd.
Jag har problem att använda Breakpoints i en Interupt rutin.
Jag håller på att programmera en R/C Servokontroller och skulle vilja mäta olika tider med tidtagaruret i MPLAB Sim.
När jag flashar picken blinkar en diod för att kolla att interupt koden fungerar, men när jag kör den i simen så stannar den aldrig på min breakpoint i interupt rutinen.
Jag har sökt lite på internet och sett att fler har detta problem men jag har inte hittat någon bra lösning.
Ett tips vara att anropa en subrutin från interuptrutinen och sätta Breakpointen ute i subrutinen. Jag har provat detta också men det fungerar inte heller.
Någon som har något tips?
MVH Peter F
Jag har problem att använda Breakpoints i en Interupt rutin.
Jag håller på att programmera en R/C Servokontroller och skulle vilja mäta olika tider med tidtagaruret i MPLAB Sim.
När jag flashar picken blinkar en diod för att kolla att interupt koden fungerar, men när jag kör den i simen så stannar den aldrig på min breakpoint i interupt rutinen.
Jag har sökt lite på internet och sett att fler har detta problem men jag har inte hittat någon bra lösning.
Ett tips vara att anropa en subrutin från interuptrutinen och sätta Breakpointen ute i subrutinen. Jag har provat detta också men det fungerar inte heller.
Någon som har något tips?
MVH Peter F
Re: stimulus controller i mplab?
Nja, inte annat än att se till att BP'n verkligen ligger på en rad som faktiskt körs.
Jag känner inte till att det skulle vara något speciellt problem med BP i interrupt.
Har du stegat igenom och sett att du verkligen passerar raden med BP'en ?
Jag känner inte till att det skulle vara något speciellt problem med BP i interrupt.
Har du stegat igenom och sett att du verkligen passerar raden med BP'en ?
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: stimulus controller i mplab?
Jag har stegat steg för steg med "Step into" i 500 uSec utan att den ens är in i interupten. Den ligger bara och snurrar i huvudloopen. Trots detta fungerar det att styra servot vilket gör att jag vet att den är in i interupt rutinen.
Jag har även testat att ha Breakpointen på första raden i interrupt rutinen, den som sparar undan W temporärt medan man kör interrupten och sedan kört med simulatorn i 20 sekunder.
Det blir toksvårt att utveckla när man är amatör och inte kan köra i simulatorn och se vad som händer.
Jag lägger upp koden om någon vill titta men eftersom det fungerar i Picen så lär det väl kanske inte vara fel i koden.
Koden är ett hopkok av två tutorials och egenkod så den är inte särskilt snygg.
MVH Peter F
Jag har även testat att ha Breakpointen på första raden i interrupt rutinen, den som sparar undan W temporärt medan man kör interrupten och sedan kört med simulatorn i 20 sekunder.
Det blir toksvårt att utveckla när man är amatör och inte kan köra i simulatorn och se vad som händer.
Jag lägger upp koden om någon vill titta men eftersom det fungerar i Picen så lär det väl kanske inte vara fel i koden.
Kod: Markera allt
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
; general variables
sGPIO ; shadow copy of GPIO
cnt_t0 ; counts timer0 interrupts
; (decremented by ISR every 250 us)
cnt_10ms ; counts 10 ms periods
; (decremented by ISR every 10 ms)
S1Cnt ; Servo 1 Uptime
S2Cnt ; Servo 2 Uptime
DownCnt ; Nere tid
LEDCnt ; Led för testing
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
S1TIME equ D'25' ; Servo 1 tid
S2TIME equ D'25' ; Servo 2 tid
LEDTIME equ D'2' ; Led tid
DOWNTIME equ D'255' ;Låg tid
;************************************************************************
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
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)
movlw 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)
movlw 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'11001000' ; 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
movwf flagga ;flaggan till noll
movlw S1TIME ; Initialize the counters
movwf S1Cnt ;
movlw S2TIME
movwf S2Cnt
movlw LEDTIME
movwf LEDCnt
; configure interrupts
movlw 1<<GIE|1<<T0IE ; enable Timer0 and global interrupts
movwf INTCON
;***** Main loop
loop
btfsc PORTA,1
goto loop
bsf PORTB, 1
movlw d'15'
movwf S1TIME
;movwf PORTB ;
;call SendOut
;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
END
MVH Peter F
Re: stimulus controller i mplab?
Det ska inte vara någon skillnad på BP oavsett var de sitter.
Man om du aldrig kör ISR'en så spelar deet ju mindre roll...
Man om du aldrig kör ISR'en så spelar deet ju mindre roll...
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: stimulus controller i mplab?
Nu förstår jag inte...
Det är juh tider i ISRen jag vill testa, alltså ISR som "sköter" min PWM.
Menar du att det är något i koden som tyder på att det inte blir någon Interupt?
MVH Peter F
Det är juh tider i ISRen jag vill testa, alltså ISR som "sköter" min PWM.
Menar du att det är något i koden som tyder på att det inte blir någon Interupt?
MVH Peter F
Re: stimulus controller i mplab?
Du skrev:
> Jag har stegat steg för steg med "Step into" i 500 uSec utan att den ens är in i interupten.
Då kan en BP i ISR'ën aldrig triggas heller. Om du aldrig kommer dit...
> Jag har stegat steg för steg med "Step into" i 500 uSec utan att den ens är in i interupten.
Då kan en BP i ISR'ën aldrig triggas heller. Om du aldrig kommer dit...
Re: stimulus controller i mplab?
Det ska fungera. Jag kör nyaste MPLab (pga nyinstallation) och gör såhär:
Kör med MPLab Sim
Stimulus-->new stimulus
Sen väljer man en pinne i listan tex RA1
Under action tar man sen toggle eller vad man nu vill ha hög/låg. Sen är det bara att trycka på ">" som sitter till vänster om knappen.
OBS för att det ska fungera så måste själva rutinen stå och "snurra" någonstans, alternativt att man stegar och så vips så hoppar den (pga att den gör interupt
)
Är det såhär du gör eller hur gör du?
Kör med MPLab Sim
Stimulus-->new stimulus
Sen väljer man en pinne i listan tex RA1
Under action tar man sen toggle eller vad man nu vill ha hög/låg. Sen är det bara att trycka på ">" som sitter till vänster om knappen.
OBS för att det ska fungera så måste själva rutinen stå och "snurra" någonstans, alternativt att man stegar och så vips så hoppar den (pga att den gör interupt

Är det såhär du gör eller hur gör du?
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: stimulus controller i mplab?
Sodjan:
Du har helt rätt, jag ställde min fråga fel. Det jag menar är egentligen varför simulatorn inte är in i Interupt rutinen när den är det i Picen?
v-g: Jag har löst det problemet och är nu på ett nytt problem i Simulatorn, Jag ville inte starta en ny tråd när dessa två frågor har (i alla fall) lite med varandra att göra. Jag har fått det att fungera med hjälp av Sodjan. Jag gjorde precis som du skriver från början men hade (förståss) konfigurerat Ra1 fel. Tack för svaret i alla fall.
Nu har jag fått servot att svara på en knapp, men jag skulle verkligen vilja in i interupt rutinen för lite "tidtagning".
MVH Peter F
Du har helt rätt, jag ställde min fråga fel. Det jag menar är egentligen varför simulatorn inte är in i Interupt rutinen när den är det i Picen?
v-g: Jag har löst det problemet och är nu på ett nytt problem i Simulatorn, Jag ville inte starta en ny tråd när dessa två frågor har (i alla fall) lite med varandra att göra. Jag har fått det att fungera med hjälp av Sodjan. Jag gjorde precis som du skriver från början men hade (förståss) konfigurerat Ra1 fel. Tack för svaret i alla fall.
Nu har jag fått servot att svara på en knapp, men jag skulle verkligen vilja in i interupt rutinen för lite "tidtagning".
MVH Peter F
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: stimulus controller i mplab?
Hmmm nu känns Sodjan sådär lurig...
När jag läser v-g inlägg så svarar han på frågan om hur man kan simulera stimulus, likt en brytare som är kopplad till pinnen RA1. Det har jag gjort och det funkar bra.
Men nu är det juh en ISR som triggas av Timer0 som jag vill testa. Jag hittar ingenstans att jag kan ställa in det i stimulusfönstret. Jag tror inte heller att jag ska behöva det för jag har för mig att detta fungerade i början... Att jag alltså kunde ta tid på saker i Interrupten med hjälp av Breakpoints.
MVH Peter F

När jag läser v-g inlägg så svarar han på frågan om hur man kan simulera stimulus, likt en brytare som är kopplad till pinnen RA1. Det har jag gjort och det funkar bra.
Men nu är det juh en ISR som triggas av Timer0 som jag vill testa. Jag hittar ingenstans att jag kan ställa in det i stimulusfönstret. Jag tror inte heller att jag ska behöva det för jag har för mig att detta fungerade i början... Att jag alltså kunde ta tid på saker i Interrupten med hjälp av Breakpoints.
MVH Peter F
Re: stimulus controller i mplab?
> Men nu är det juh en ISR som triggas av Timer0 som jag vill testa.
Jaha.
> Jag hittar ingenstans att jag kan ställa in det i stimulusfönstret.
Det behövs inte. Ställ bara in TMR0 korrekt.
> Jag tror inte heller att jag ska behöva det för jag har för mig att detta fungerade i början...
Gjorde du rätt då, så gjorde det det...
Jaha.
> Jag hittar ingenstans att jag kan ställa in det i stimulusfönstret.
Det behövs inte. Ställ bara in TMR0 korrekt.
> Jag tror inte heller att jag ska behöva det för jag har för mig att detta fungerade i början...
Gjorde du rätt då, så gjorde det det...

-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: stimulus controller i mplab?
Jag får ett meddelande när jag trycker "build ALL".
Men det är juh en "Banksel precis innan den raden.
"Option" ligger ju både i bank 1 och 3 men när jag tar Banksel Option_reg istället för en specifik siffra borde det väl bli rätt
Sodjan: Jag har verkligen ingen aning om vad jag har ändrat sedan dess att jag tycks minnas att det fungerade.
MVH Peter F
Kod: Markera allt
Message[302] C:\DOCUMENTS AND SETTINGS\ANNI&PETTE\MY DOCUMENTS\PICPROGRAMMERING\MPLAB PROJECTS\SERVOSTYRNING\GOOLIGUM.ASM 179 : Register in operand not in bank 0. Ensure that bank bits are correct.

Kod: Markera allt
; configure Timer0
movlw b'11001000' ; timer mode (T0CS = 0),
banksel OPTION_REG ; no prescaling (PSA = 1)
movwf OPTION_REG ; -> increment TMR0 every 1 us <------------ detta är rad 179
banksel PORTA ; Back to bank 0
Sodjan: Jag har verkligen ingen aning om vad jag har ändrat sedan dess att jag tycks minnas att det fungerade.

MVH Peter F
Re: stimulus controller i mplab?
Det är alltså ett "meddelande", inte en "varning" eller ett "fel".
Du kan välja att strunta i det och många lägger in en rad som helt
undertrycker alla 302 meddelanden.
> "Option" ligger ju både i bank 1 och 3 men när jag tar Banksel Option_reg istället för en specifik siffra borde det väl bli rätt
Ja, det borde det. Men det har inget med 302 meddelandet att göra, det kommer i alla fall.
> movlw 1<<GIE|1<<T0IE
Jag tycker personligen att det där är svårt att läsa.
Varför inte göra
BSF INTCON, GIE
BSF INTCON, TOIE
istället ?
> Jag har verkligen ingen aning om vad jag har ändrat
Tja, bara at felsöka...
Sätt "watch" på rellevanta register (tmr0, intcon o.s.v) och kolla att faktiskt
t.ex T0IF sätts och att GIE och T0IE är satta o.s.v.
Du kan välja att strunta i det och många lägger in en rad som helt
undertrycker alla 302 meddelanden.
> "Option" ligger ju både i bank 1 och 3 men när jag tar Banksel Option_reg istället för en specifik siffra borde det väl bli rätt
Ja, det borde det. Men det har inget med 302 meddelandet att göra, det kommer i alla fall.
> movlw 1<<GIE|1<<T0IE
Jag tycker personligen att det där är svårt att läsa.
Varför inte göra
BSF INTCON, GIE
BSF INTCON, TOIE
istället ?
> Jag har verkligen ingen aning om vad jag har ändrat
Tja, bara at felsöka...

Sätt "watch" på rellevanta register (tmr0, intcon o.s.v) och kolla att faktiskt
t.ex T0IF sätts och att GIE och T0IE är satta o.s.v.
Re: stimulus controller i mplab?
Man kan säga som såhär, om du har timer1 rätt inställt såsom sodjan påpekar så behövs ingen stimulus alls, du kommer istället få en break så fort registret "slår runt". Detta är ännu enklare att simulera bara att sätta registret till FF eller och stega ett steg (förutsatt att du har 1:1 på pre/post scaler.
Såklart måste timern också vara startad
Om det inte fungerar så läs noga igenom manualen angående den timer det berör. Det enda JAG tycker är lite oklart är att man måste ha PEIE enablad för vissa timers ska fungera, detta är lätt att missa.
Ett bra tips är att du kollar i SLUTET av det timerkapitel du är intresserad av där står alla register som berör denna timer. Har hjälpt mig många gånger då texten är lätt att gå vilse i även om den är självklar när man väl förstår
Såklart måste timern också vara startad

Om det inte fungerar så läs noga igenom manualen angående den timer det berör. Det enda JAG tycker är lite oklart är att man måste ha PEIE enablad för vissa timers ska fungera, detta är lätt att missa.
Ett bra tips är att du kollar i SLUTET av det timerkapitel du är intresserad av där står alla register som berör denna timer. Har hjälpt mig många gånger då texten är lätt att gå vilse i även om den är självklar när man väl förstår
