Felsökningstips för PIC?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Felsökningstips för PIC?

Inlägg av PHermansson »

Skulle behöva lite felsökningstips att använda när man arbetar med PIC-processorer. Jag använder för tillfället Mplab och assembler och skriver ett program för justerbar PWM-styrning av några lysdioder. För att kolla att det fungerar som det ska använder jag PIC Simulator IDE för att simulera. Jag har kommit så långt att jag inte får några varningar i Mplab och i simulatorn fungerar det som det ska, ändra switchens läge så ändras ljusnivån på dioden. Sedan matar jag in programmet i den verkiga kretsen, ändrar switchen och i 90% av fallen slocknar dioden och förblir släckt tills jag startar om Pic'en. I 10% av fallen blir ljusstyrkan starkare... Ljusstyrkan ska ju långsamt minska...
Antingen skulle jag behöva hjälp att titta på koden och se om jag gjort nått misstag, eller så skulle jag behöva några generella felsökningstips.
Bilr ganska frustrerad på sånt här :/
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Du har ju gjort ganska mycket själv redan, så det ska väl vara OK
att posta koden... :-)

> ändra switchens läge så ändras ljusnivån på dioden.

Vilken switch ?

> eller så skulle jag behöva några generella felsökningstips.

En enkel lösning är att lägga till lite extrakod som
tänder/släcker ljusdioder på strategiska ställen i koden.
Jag brukar lägga til kod som "togglar" en pinne snabbt
så att jag kan kolla på oscilloskopet vad som händer...
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Inlägg av PHermansson »

Switchen är en tvåvägsomkopplare som drar ett av två ben höga. Tanken är att rotera färgen på ett par RGB-dioder när switchen sluts och att man typ kan ändra färg framåt och bakåt med respektive läge.
Koden känns kanske till viss del igen från tidigare inlägg, vet att jag inte ändrat 1 och 0 till w och f överallt men det ska väl inte ha någon betydelse?

Kod: Markera allt

;**********************************************************************
;   This file is a basic code template for object module code         *
;   generation on the PIC12F675. This file contains the               *
;   basic code building blocks to build upon.  As a project minimum   *
;   the 12F675.lkr file will also be required for this file to        *
;   correctly build. The .lkr files are located in the MPLAB          *
;   directory.                                                        *
;                                                                     *
;   If interrupts are not used all code presented between the         *
;   code section "INT_VECTOR and code section "MAIN" can be removed.  *
;   In addition the variable assignments for 'w_temp' and             *
;   'status_temp' can be removed.                                     *
;                                                                     *
;   Refer to the MPASM User's Guide for additional information on     *
;   features of the assembler and linker (Document DS33014).          *
;                                                                     *
;   Refer to the respective PIC data sheet for additional            *
;   information on the instruction set.                               *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Filename:	    xxx.asm                                           *
;    Date:                                                            *
;    File Version:                                                    *
;                                                                     *
;    Author:                                                          *
;    Company:                                                         *
;                                                                     * 
;                                                                     *
;**********************************************************************
;                                                                     *
;    Files required:                                                  *
;                    12F675.lkr                                       *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Notes:                                                           *
;                                                                     *
;                                                                     *
;                                                                     *
;                                                                     *
;**********************************************************************

	list      p=12f675           ; list directive to define processor
	#include <p12f675.inc>        ; processor specific variable definitions

	errorlevel  -302              ; suppress message 302 from list file

	__CONFIG   _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT  

; '__CONFIG' directive is used to embed configuration word within .asm file.
; The lables following the directive are located in the respective .inc file.
; See data sheet for additional information on configuration word settings.



;***** VARIABLE DEFINITIONS (examples)

; example of using Shared Uninitialized Data Section
INT_VAR		UDATA_SHR	0x20   
w_temp		RES     1		; variable used for context saving 
status_temp	RES     1		; variable used for context saving
counter		RES 	1	;Main counter
led1		RES 	1	;Led counters
led2		RES		1
led3		RES		1
led1orig	RES 	1	;Led counters
led2orig	RES		1
led3orig	RES		1


    #define     green      	GPIO,0	;Led output pins
	#define     blue      	GPIO,1
    #define     red      	GPIO,2

;**********************************************************************
RESET_VECTOR	CODE	0x000		; processor reset vector
		goto    main              ; go to beginning of program


INT_VECTOR	CODE	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


; isr code can go here or be located as a call subroutine elsewhere
		;Check if timer0 interrupt
		btfss	INTCON, T0IF
		goto	iocint

		;Go directly to dec2 if led1 is zero
		decfsz	led1,1	;Decrease led counter 1
		goto	dec2	;Jump if not zero
		bcf		red		;Shut off led if zero
		;incf	led1
dec2	
		decfsz	led2,1	;Same as above
		goto 	dec3
		bcf		green
		;incf	led2
dec3
		decfsz	led3,1	;Same as above
		goto	decC
		bcf		blue
		;incf	led3
		
decC
		decfsz	counter,1		;Decrease maincounter
		goto	contRGB			;Jump if not zero
		call	setRGB			;Reset values if zero

contRGB
		bcf		INTCON, T0IF
		goto	endint

iocint
		btfss	INTCON, GPIF	;Check if IOC int
		goto 	endint			;If not, jump
		;An interrupt on change occured
		;movf	GPIO, w	
		bcf		INTCON, GPIF	;Clear IOC flag
		call	rgbChange		;IOC routine

endint
		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


; these first 4 instructions are not required if the internal oscillator is not used
MAIN    CODE
main
		call    0x3FF             ; retrieve factory calibration value
		bsf     STATUS,RP0        ; set file register bank to 1 
		movwf   OSCCAL            ; update register with factory cal value 
		bcf     STATUS,RP0        ; set file register bank to 0

		
; remaining code goes here
		;Setup port
		bcf		STATUS, RP0
		clrf	GPIO
		movlw	07h
		movwf	CMCON		;Comparators off
		bsf		STATUS,RP0
		clrf 	ANSEL		;No AD
		movlw	b'00111000'	;0:2=outputs, 3:5 inputs
		movwf	TRISIO
		bcf		STATUS,RP0

		;Enable Tmr0
		clrf	TMR0
		bsf		STATUS,RP0
		movlw	b'11001000'	; X,X,internal clock, low-high, prescaler 1:2
		movwf	OPTION_REG
		bcf		STATUS,RP0

		;Enable IOC on GPIO4:5
		BANKSEL	IOC
		BSF		IOC, IOC4
		BSF		IOC, IOC5

		;Enable Tmr0, GPIO and general interrupt
		BANKSEL	INTCON
		BSF		INTCON, T0IE
		BSF		INTCON, GPIE
		BSF		INTCON, GIE
		
		;Set up RGB values
		movlw	d'10'
		movwf	led1orig
		movwf	led2orig
		movwf	led3orig

		call 	setRGB

MainLoop
		; Just hang around and wait for an interrupt

		goto	MainLoop

rgbChange	; Comes here at IOC
		call	Delay_0_1s	;Debounce
		btfss	GPIO,4
		goto 	chgExit
		decf	led1orig, f
		decf	led2orig, f
		decf	led3orig, f
		call	Delay_0_1s
		goto	rgbChange
chgExit
		return

setRGB
		;Setup RGB-values, preload Tmr0
		;Set interval to 100uS
		;Internal oscillator, 4MHz. Tcyc=0,00000025s*4=0,000001s 
		
		movlw	d'20'	;Tmr0=20 gives 100uS between int's
		movwf	TMR0
		movlw	d'100'	;Main PWM counter
		movwf	counter
		movf	led1orig,0	;Led counters, PWM on/off is 40%
		movwf	led1	
		movf	led2orig,0
		movwf	led2
		movf	led3orig,0
		movwf	led3
		bsf		red		;All leds on
		bsf		green
		bsf		blue
		return

Delay_0_1s
; Delay = 0.1 seconds
; Clock frequency = 4 MHz

; Actual delay = 0.1 seconds = 100000 cycles
; Error = 0 %

	cblock
	d1
	d2
	endc

			;99998 cycles
	movlw	0x1F
	movwf	d1
	movlw	0x4F
	movwf	d2
Delay_0
	decfsz	d1, f
	goto	$+2
	decfsz	d2, f
	goto	Delay_0

			;2 cycles
	goto	$+1
	return 	


; initialize eeprom locations

EE		CODE	0x2100
		DE	0x00, 0x01, 0x02, 0x03



		END                       ; directive 'end of program'

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

Inlägg av sodjan »

Flytta ut "rgbChange" utanför ISR'en.
Sätt en flagga istället för "call rgbChange" i ISR'en, och ta hand om
det i "MainLoop" istället. Notera att rgbChange har låna delayer som
kommer att "stöka til det" för tmr0 interuptet...
Skriv svar