Många fina svar nu. Tusen tack.
Liten sammanfattning utan att behöva svara er alla personligen.
Jag vill lära mig ALLT! =) Men jag vill åxå att projektet ska gå framåt i praktiken så det blir att kompromissa ibörjan. Tanken är alltså att använda en mic för att i början bara detektera ett högt ljud av något slag. Handklappning eller luftpistolskott mm. Precisionen i detta för jag "utvärdera" senare. Tex om kulan hinner väldigt olika långt med samma inställning. Allstå så att det blir svårt att få ett upprepbart resultat.
Jag har nu börjat med ADCn.
Jag har förövrigt bytt till en annan processor då jag upptäkte att den tidigare inte hade en ADC.
Bytt från 12f629
TILL
12F683
Jag har fått ADCn att fungera i praktiken med en LDR. När jag lyser på motståndet tänds en LED i ett par sekunder och slocknar sen. (Om jag inte lyser på motståndet fortfarande det vill säga.) Jag kan även ändra i koden så att det krävs mer eller mindre ljus för att "trigga" lysdioden.
I praktiken är det bra, det var dit jag ville komma med mitt första test.
MEN jag är inte alls nöjd med "siffrorna" bakom det som händer.
När jag mäter spänningen som går in på PICen så krävs det ca 3,6v för att trigga så att LEDen tänds. Trots att koden ser ut så här.
Kod: Markera allt
START
BANKSEL GPIO ;
CLRF GPIO ;Init GPIO
MOVLW b'110' ;Set GP<0> to Analog
BANKSEL CMCON0
MOVWF CMCON0 ;Set GP<1,2>digital I/O
MOVLW b'000001'
BANKSEL TRISIO
MOVWF TRISIO
BANKSEL ANSEL
MOVWF ANSEL
BANKSEL ADCON0
MOVLW B'10000001' ;<7> Right Justified, <0> ADC On
MOVWF ADCON0
BCF GPIO,1 ;Släck Diod
Här har jag alltså satt mina 10 bitars ADC "Right Justified" vilket innebär (om jag förstått allt rätt) att de 8 bitarna i "ADRESL" fylls med de första 8 bitarn i 10bitars värdet medan de 2 resterande bitarna läggs i "ADRESH" registret.
Jag har även satt "VCFG" biten till att använda VDD som referens, vilket i detta fall innebär ca 4.8v
Sedan ser koden ut så här:
Kod: Markera allt
START1
CLRF GPIO
BSF ADCON0,GO ;take an ADC reading
WAITADC
BTFSC ADCON0,GO ; poll for reading to complete
GOTO WAITADC ; if not done, keep polling
MOVLW B'00000011' ; place in compare register
SUBWF ADRESL,C ; compare instruction
BTFSC STATUS,C ; if ADC reading is more than "compare register", "signal" has been detected
GOTO NEXT ; if "signal" has been detected, to go NEXT routine
GOTO START1 ; if not, start from beginning of program
Här jämför jag alltså registret "ADRESL" med binära talet '00000011' (.3) LEDen triggas om "ADRESL" är högre än b'00000011'.
Om jag delar VDD (4.8v) med 10 bitar (1023) så får jag ca 0.0047v om jag gångrar det med 3(som jag jämför med) får jag 0.014v.
Alltså att det bara ska krävas 0.014v för att trigga LEDen. Men det krävs alltså ca 3.6v.
Är det någon som ser vart jag uppenbarligen tänkt fel eller gjort fel?
Tacksam för all hjälp jag hittils fått och hjälpen jag hoppningsvis kommer att få. =)
MVH Peter
Koden i sin helhet:
Kod: Markera allt
;******************************************************************************
; This file is a basic code template for object module code *
; generation on the PIC12F683. This file contains the *
; basic code building blocks to build upon. *
; *
; 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: P12F683.INC *
; *
;******************************************************************************
; *
; Notes: *
; *
;******************************************************************************
;------------------------------------------------------------------------------
; PROCESSOR DECLARATION
;------------------------------------------------------------------------------
LIST P=12F683 ; list directive to define processor
#INCLUDE <P12F683.INC> ; processor specific variable definitions
;------------------------------------------------------------------------------
;
; CONFIGURATION WORD SETUP
;
; The 'CONFIG' directive is used to embed the configuration word within the
; .asm file. The lables following the directive are located in the respective
; .inc file. See the data sheet for additional information on configuration
; word settings.
;
;------------------------------------------------------------------------------
__CONFIG _FCMEN_ON & _IESO_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
errorlevel -302
;------------------------------------------------------------------------------
; VARIABLE DEFINITIONS
;------------------------------------------------------------------------------
; example of using Shared Uninitialized Data Section
INT_VAR UDATA_SHR
W_TEMP RES 1 ; variable used for context saving
STATUS_TEMP RES 1 ; variable used for context saving
d1 RES 1
d2 RES 1
d3 RES 1
c1 RES 1 ;Till ADC delayen
;------------------------------------------------------------------------------
; EEPROM INITIALIZATION
;
; The 12F683 has 256 bytes of non-volatile EEPROM, starting at address 0x2100
;
;------------------------------------------------------------------------------
DATAEE CODE 0x2100
DE "MCHP" ; Place 'M' 'C' 'H' 'P' at address 0,1,2,3
;------------------------------------------------------------------------------
; RESET VECTOR
;------------------------------------------------------------------------------
RESET_VECTOR CODE 0x0000 ; processor reset vector
GOTO START ; go to beginning of program
;------------------------------------------------------------------------------
; INTERRUPT SERVICE ROUTINE
;------------------------------------------------------------------------------
INT_VECTOR CODE 0x0004 ; 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
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
;------------------------------------------------------------------------------
; MAIN PROGRAM
;------------------------------------------------------------------------------
MAIN_PROG CODE
START
BANKSEL GPIO ;
CLRF GPIO ;Init GPIO
MOVLW b'110' ;Set GP<0> to Analog
BANKSEL CMCON0
MOVWF CMCON0 ;Set GP<1,2>digital I/O
MOVLW b'000001'
BANKSEL TRISIO
MOVWF TRISIO
BANKSEL ANSEL
MOVWF ANSEL
BANKSEL ADCON0
MOVLW B'10000001' ;<7> Right Justified, <0> ADC On
MOVWF ADCON0
BCF GPIO,1 ;Släck Diod
;------------------------------------------------------------------------------
; PLACE USER PROGRAM HERE
;------------------------------------------------------------------------------
MainCode
START1
CLRF GPIO
BSF ADCON0,GO ;take an ADC reading
WAITADC
BTFSC ADCON0,GO ; poll for reading to complete
GOTO WAITADC ; if not done, keep polling
MOVLW B'00000011' ; place in compare register
SUBWF ADRESL,C ; compare instruction
BTFSC STATUS,C ; if ADC reading is more than "compare register", "signal" has been detected
GOTO NEXT ; if "signal" has been detected, to go NEXT routine
GOTO START1 ; if not, start from beginning of program
NEXT
NOP
BANKSEL GPIO
BSF GPIO,1
CALL Delay
CALL Delay
CALL Delay
CALL Delay
CALL Delay
CALL Delay
CALL Delay
CALL Delay
BCF GPIO,1
GOTO START1
;------------------------------------------------------------------------------
; SubRoutines
;------------------------------------------------------------------------------
Delay
movlw 0x03
movwf d1
movlw 0x18
movwf d2
movlw 0x02
movwf d3
Delay_0
decfsz d1, f
goto $+2
decfsz d2, f
goto $+2
decfsz d3, f
goto Delay_0
;6 cycles
goto $+1
goto $+1
goto $+1
RETURN
END ; directive 'end of program'
EDIT: Nu ser koden mycket finare ut än tidigare. Måste kolla varför så att den alltid kan se ut så här när jag postar.