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 :/
Felsökningstips för PIC?
- PHermansson
- EF Sponsor
- Inlägg: 4340
- Blev medlem: 22 december 2004, 00:46:38
- Ort: Särestad Grästorp
- Kontakt:
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...
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...
- PHermansson
- EF Sponsor
- Inlägg: 4340
- Blev medlem: 22 december 2004, 00:46:38
- Ort: Särestad Grästorp
- Kontakt:
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?
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'