stimulus controller i mplab?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: stimulus controller i mplab?

Inlägg av sodjan »

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

Re: stimulus controller i mplab?

Inlägg av PopUnoNkoK »

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

Re: stimulus controller i mplab?

Inlägg av sodjan »

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

Re: stimulus controller i mplab?

Inlägg av PopUnoNkoK »

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.

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
Koden är ett hopkok av två tutorials och egenkod så den är inte särskilt snygg.

MVH Peter F
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: stimulus controller i mplab?

Inlägg av sodjan »

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

Re: stimulus controller i mplab?

Inlägg av PopUnoNkoK »

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

Re: stimulus controller i mplab?

Inlägg av sodjan »

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...
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: stimulus controller i mplab?

Inlägg av v-g »

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

Re: stimulus controller i mplab?

Inlägg av PopUnoNkoK »

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

Re: stimulus controller i mplab?

Inlägg av sodjan »

V-g svarade ju på just MPSIM problemet..... :-)
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: stimulus controller i mplab?

Inlägg av PopUnoNkoK »

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

Re: stimulus controller i mplab?

Inlägg av sodjan »

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

Re: stimulus controller i mplab?

Inlägg av PopUnoNkoK »

Jag får ett meddelande när jag trycker "build ALL".

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.
Men det är juh en "Banksel precis innan den raden. :?:

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

Re: stimulus controller i mplab?

Inlägg av sodjan »

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.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: stimulus controller i mplab?

Inlägg av v-g »

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 ;)
Skriv svar