ADC problem z MPASM & PIC12F675

E

eem2am

Guest
Zdravo,

Pišem v MPASM za PIC12F675.

Moja številka temelji kazen, ampak ne dela pravilno.

Jaz sem z ADC, tako da se glasi analogni inputi za AN0 in AN1 v zanki.

Npr .... V bistvu nekako podobno ... ..

-----------------------
Ponavljanje:

Preberite AN0
Preberite AN1

Goto Zanka
-----------------------

Kakorkoli že, kaj se dejansko zgodi, je, da če je analogna konverzija v ADRESH vrednost večja od 0x7F za AN0 obravnavi, nato GPIO2 vzame veliko .... Če je nižje, GPIO2 sprejme nizko

In če je analogna konverzija vrednost v ADRESH večja nato 0x7F za AN1 obravnavi, nato GPIO4 vzame veliko .... Če je nižje, GPIO4 sprejme nizko
---------------------
Vendar, da se odčitki so vedno vzeta iz AN1, in čeprav sem spremeniti kanal AN0 je še samo zapisano AN1.

Poznam AN0 kanal deluje, kot sem to delo v različnih košček kode.

Torej, ne kateri koli bralec vedeti, zakaj ne morete spremeniti kanale iz AN1 za AN0 in preberite analognih vhodnih obstaja v mojem zanko?

Tukaj je moja koda ...
... ... ... ....

Koda:;******************************************; PIC12F675

; MPASM sestavljavcu

; MPLAB 8,10; Programer = Pickit2

; Uporaba različica 2.11.00

; Device datoteke Različica 1.12.00

; OS Verzija 2.20.01; Notranji oscilator na 4MHz

;--------------------------------------

; PIN usage

; AN0 = analogni input;

; AN1 = analogni input;

; RA2 = digitalni izhod;

; RA4 = digitalni izhod;

; RA5 = digitalni vhod;

;--------------------------------------# vključujejo <p12f675.inc>

LIST P = PIC12F675__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BODEN_OFF & _CPD_OFF)cnt0 equ 0x20

cnt1 equ 0x21

cnt2 equ 0x22

cnt3 equ 0x23ccd0 equ 0x24val0 equ 0x25

VAL1 equ 0x26ded0 equ 0x27

DED1 equ 0x28BANK0 makro

BCF STATUS, RP0

endmBANK1 makro

BSF STATUS, RP0

endmFET_ON makro

BSF GPIO, 2

endmFET_OFF makro

BCF GPIO, 2

endmOmogočajo makro

BSF GPIO, 4

endmOnemogoči makro

BCF GPIO, 4

endmENABLE_ADC makro

BSF ADCON0, 0

nop

endmDISABLE_ADC makro

BCF ADCON0, 0

nop

endmADC_CH0 makro

BCF ADCON0, 3

nop, nop, da bi se izognili RMW problem

BCF ADCON0, 2

nop

endmADC_CH1 makro

BCF ADCON0, 3

nop, nop, da bi se izognili RMW problem

BSF ADCON0, 2

nop

endmDO_ADC makro

BSF ADCON0, 1

nop

endmorg 0

Goto StartStart:FET_OFF

OnemogočitiBANK1; Nastavitev Ansel register (sklop Analogni / digi pristaniščih

; .. ustanovila AD pretvorbo ura)

movlw 0x63

movwf Ansel; Razvrsti primerjalni referenčni ven, čeprav

i dont želite uporabiti primerjalni

movlw 0x00

movwf Vrčonmovlw 0x2B

movwf TRISIOBANK0

; Onemogoči prekinja kot ne želim, da jih uporabljajo

BCF INTCON, GIE

BCF PIR1, ADIF; Razvrsti primerjalni ven čeprav i dont

; želite uporabiti.

movlw 0x06

movwf CMCON; Primerjalni ref morajo biti omogočeni

; čeprav i dont želite uporabiti primerjalni

BANK1

BSF Vrčon, VREN; Omogoči primerjalni ref

BANK0; Nastavitev ADCON0 = Ljust; Vdd = ref; xx; CHS = 00; GODONE; Onemogoči

movlw 0x00

movwf ADCON0ENABLE_ADCFET_OFF

Onemogočiti; VVVVVVVVVVVVVVVVVVVVV

* PROGRAM MAIN LOOP *

zanke:;...........................

; Ali ADC na kanalu 0

BCF PIR1, ADIF

nop

DISABLE_ADC

ADC_CH0; Spremeni ADC kanal

ENABLE_ADCklic ADC_channel_changeover_delay

D0_ADC

jajce:

btfsc ADCON0, 1

Goto jajce

;............................

movf ADRESH, 0

movwf val0movlw 0x7F

subwf val0, 0

btfsc STATUS, C

FET_OFF

movlw 0x7F

subwf val0, 0

btfss STATUS, C

FET_ON

;............................;............................;----------------------------

; Ali ADC na kanal 1

BCF PIR1, ADIF

nop

DISABLE_ADC

ADC_CH1; Spremeni ADC kanal

ENABLE_ADC

klic ADC_channel_changeover_delay

DO_ADC

pes:

btfsc ADCON0, 1

Goto pes

;............................

movf ADRESH, 0

movwf VAL1movlw 0x7F

subwf VAL1, 0

btfsc STATUS, C

Onemogočiti

movlw 0x7F

subwf val0, 0

btfss STATUS, C

Omogočajo;----------------------------

Goto zanka

; * END OF MAIN PROGRAM LOOP *

;^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ADC_channel_changeover_delay:

movlw 0x0F

movwf ccd0

FFF:

decfsz ccd0, 1

Goto FFF

retlw 0x00konec
 
živjo,

Le mogel pogledati kodo, ki je v zelo majhno zanko obravnavo dveh ADC in stikalni vaše pristanišč ustrezno, vendar s samo zamudo pri čemer 50us, kako lahko "videli" kaj se pravzaprav dogaja?

 
Hvala wp100,

Vidim kaj se dogaja z mojim Voltmeter sondiranje pristaniščih GPIO2 in GPIO4.

Rezultati na teh pristaniščih je odvisna od tega, ali je ADC odčitki od kanalov 0 in 1 je bila večja ali manjša od 0x7F (meni ADRESH only)

Žal, ADC modul le bere iz kanala 1 in nikoli več stikala za kanal 0

 
Ja, so se vaša koda logika spet videti globo, vendar ne spot koli napaki.

Ne morem dejansko vodijo svojo kodo kot moj dev krovu je dol v trenutku.

Misli vrača korak in poskusite z ADC samo 0 in nato ADC 1, če to dela v tem programu koda - misliš svoje samo eno od teh frustrirajuće neumno eden linijske napak si ne vidim v tem trenutku.good luck
 
Hvala wp100, pravzaprav sem copy / paste napaka na
13. vrstico navzgor od dna ...." val0 "je treba" VAL1 ", ampak tudi s tem popraviti še vedno
doesnt delo.

v bistvu vse i morate storiti, je, da se lahko preklopite ADC kanalov.

tukaj je popravljena koda, ki
doesnt dela (Navada preklop kanalov ADC)

Code:
; PIC12F675
; MPASM sestavljavcu
; MPLAB 8,10

; Programer = Pickit2
; Uporaba različica 2.11.00
; Device datoteke Različica 1.12.00
; OS Verzija 2.20.01

; Notranji oscilator na 4MHz
;--------------------------------------
; PIN usage
; AN0 = analogni input;
; AN1 = analogni input;
; RA2 = digitalni izhod;
; RA4 = digitalni izhod;
; RA5 = digitalni vhod;
;--------------------------------------

# vključujejo <p12f675.inc>
LIST P = PIC12F675

__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BODEN_OFF & _CPD_OFF)

cnt0 equ 0x20
cnt1 equ 0x21
cnt2 equ 0x22
cnt3 equ 0x23

ccd0 equ 0x24

val0 equ 0x25
VAL1 equ 0x26

ded0 equ 0x27
DED1 equ 0x28

; *** IZJAVLJAM MAKRO'S ***
BANK0 makro
BCF STATUS, RP0
endm

BANK1 makro
BSF STATUS, RP0
endm

FET_ON makro
BSF GPIO, 2
endm

FET_OFF makro
BCF GPIO, 2
endm

Omogočajo makro
BSF GPIO, 4
endm

Onemogoči makro
BCF GPIO, 4
endm

ENABLE_ADC makro
BSF ADCON0, ADON
nop
endm

DISABLE_ADC makro
BCF ADCON0, ADON
nop
endm

ADC_CH0 makro
BCF ADCON0, CHS1
nop, nop, da bi se izognili RMW problem
BCF ADCON0, CHS0
nop
endm

ADC_CH1 makro
BCF ADCON0, CHS1
nop, nop, da bi se izognili RMW problem
BSF ADCON0, CHS0
nop
endm

DO_ADC makro
BSF ADCON0, 1
nop
endm
; *** MAKRO
je  zdaj označeno ***

org 0
Goto Start

Start:

BANK1

; Nastavitev Ansel register (sklop Analogni / digi pristaniščih
; .. ustanovila AD pretvorbo ura)
movlw 0x63
movwf Ansel

movlw 0x2B
movwf TRISIO

BANK0
; Onemogoči prekinja kot ne želim, da jih uporabljajo
BCF INTCON, GIE
BCF PIR1, ADIF; zavijete primerjalni off
movlw 0x07
movwf CMCONBANK1
BCF Vrčon, VREN; onemogočiti primerjalni ref
BANK0

; Nastavitev ADCON0 = Ljust; Vdd = ref; xx; CHS = 00; GODONE; Onemogoči
movlw 0x00
movwf ADCON0

nop

ENABLE_ADC

FET_OFF
nop
Onemogočiti; VVVVVVVVVVVVVVVVVVVVV
* PROGRAM MAIN LOOP *
zanke:

;...........................
; Ali ADC na kanalu 0
BCF PIR1, ADIF
nop
DISABLE_ADC
ADC_CH0; Spremeni ADC kanal
ENABLE_ADC

klic ADC_channel_changeover_delay
D0_ADC
jajce:
btfsc ADCON0, 1
Goto jajce
;............................
movf ADRESH, 0
movwf val0

movlw 0x7F
subwf val0, 0
btfsc STATUS, C
FET_OFF
movlw 0x7F
subwf val0, 0
btfss STATUS, C
FET_ON
;............................

;............................

;----------------------------
; Ali ADC na kanal 1
BCF PIR1, ADIF
nop
DISABLE_ADC
ADC_CH1; Spremeni ADC kanal
ENABLE_ADC
klic ADC_channel_changeover_delay
DO_ADC
pes:
btfsc ADCON0, 1
Goto pes
;............................
movf ADRESH, 0
movwf VAL1

movlw 0x7F
subwf VAL1, 0
btfsc STATUS, C
Onemogočiti
movlw 0x7F
subwf VAL1, 0
btfss STATUS, C
Omogočajo;----------------------------
Goto zanka
; * END OF MAIN PROGRAM LOOP *
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^ADC_channel_changeover_delay:
movlw 0x0F
movwf ccd0
FFF:
decfsz ccd0, 1
Goto FFF
retlw 0x00

nemudoma:
movlw 0xFF
movwf cnt1
mog:
movlw 0xFF
movwf cnt1
Svinja:
decfsz cnt1, 1
Goto Monopolizirati
decfsz cnt0, 1
Goto mog
retlw 0x00

konec
[koda *]
 
Živjo,

Še vedno ni opazil nobene resnične napake potem ..Če menite, da ste preprosto odstranite le spodnjo kodo tako, če teče samo na ADC kanal 0 in potem vidim, da deluje, če je ok potem odstranite ADC Channel 0 kodo in potem poskusite le na kanal 1 in videti, če to deluje.

Upati je, da bi morala pokazati nekaj --

Le malo stvari lahko pomagajo s svojim kodiranja, omogoča lažje slediti, če imate Subwf val0, 0 je enostavno Napačno prebrati stvari - da je (in podobna navodila) ..val0, W ali F, namesto 0 ali 1, je manj nagnjena k napakam.

;----------------------------
; Ali ADC na kanal 1
BCF PIR1, ADIF
nop
DISABLE_ADC
ADC_CH1; Spremeni ADC kanal
ENABLE_ADC
klic ADC_channel_changeover_delay
DO_ADC
pes:
btfsc ADCON0, 1
Goto pes
;............................
movf ADRESH, 0
movwf VAL1

movlw 0x7F
subwf VAL1, 0
btfsc STATUS, C
Onemogočiti
movlw 0x7F
subwf val0, 0
btfss STATUS, C
Omogočajo

 
Če pogledamo kodo v Mplab - imate tri vrstice "DO_ADC" dejansko makro, in dva makro klici --

;...........................
; Ali ADC na kanalu 0
BCF PIR1, ADIF
nop
DISABLE_ADC
ADC_CH0; Spremeni ADC kanal
ENABLE_ADC

klic ADC_channel_changeover_delay
D0_ADC: **

Je to ** vrstico v stolpec 1?- Stavim, da je - potem gradi ok - ampak samo njeno uporabo, kakor je etiketa ne makro klic - vam promptnim napake v kodo ..Ne skrbi, vsi smo vse do podobnih napak<img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" />
 

Welcome to EDABoard.com

Sponsor

Back
Top