Отговори на тема  [ 16 мнения ]  Отиди на страница 1, 2  Следваща
PIC16F874 и избор на ADC канал 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение PIC16F874 и избор на ADC канал
До сега не ми се е случвало,ама днеска стана : Използвам на PIC16F874 3 от всичките канали на АЦП-то.Закачил съм едно LCD и гледам какво има на всеки канал.Да обаче когато единия канал се свърже към маса и на един от другите се подаде напрежение,на LCD- то показва,че на канала който е към маса има напрежение.Измервам с уреда и осцилоскопа на извода на PIC-а този които е към маса - 0V,на другия някакво напрежение си има.Размених каналите - отново се получи същото 8O Промених времето между стартиранията на каналите на АЦП-то до 1 секунда - няма промяна.Почвам да се съмнявам че ПИК-а е дефектен.Ако на някой му се е случвало подобно нещо - да сподели.В тази жега трети час се мъча с това и накрая ще хвана големия чук и .... но уви,чука няма да реши въпроса :( .


Пон Авг 20, 2007 2:11 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Фев 01, 2007 4:04 am
Мнения: 1539
Мнение 
Пускаш АЦП-то, избираш канала, после изчакваш > 30us и тогава стартираш преобразуването.
Както знаеш ,ацп-то е едно и му трябва време да си презареди капацитетите при превключване м/у каналите. Но може и някакви вътрешни утечки да се получават. Или да текат тоци през масата и да вдигат потенциала (Rout на пиновете е около 100ома).


Пон Авг 20, 2007 2:43 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
То с това съм наясно.Оказа се че точно този пик иска да се гаси и пуска АЦП-то преди всяка смяна наканала- така се реши въпроса.


Пон Авг 20, 2007 2:57 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Фев 01, 2007 4:04 am
Мнения: 1539
Мнение 
Явно някое капацитетче си остава заредено и му е трябва "хардресет".
Аз доколкото знам АЦП-то на пиковете е с превключваеми кондензатори, та явно и от там тия магарии.


Пон Авг 20, 2007 3:04 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение 
Мммне, не ми се е случвало точно това, ако пина е висящ се случва, но щом си го дал на маса не би трябвало да има. Кои са тия входове.


Пон Авг 20, 2007 7:09 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Изводите са RA0/RA1.Изводите не са висящи - свързани са през резистори към маса/захранване,след което си ки включих към буферите.Критично е времето докато се освести АЦП-то между измерването и превключването на каналите.Стана,ама много време изгубих с това.


Пон Авг 20, 2007 9:30 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Фев 01, 2007 4:04 am
Мнения: 1539
Мнение 
Няколко дена ръчкане по схемата може да спести цял час четене на даташити! :wink:


Пон Авг 20, 2007 11:04 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Окт 10, 2004 9:55 am
Мнения: 1718
Мнение Ох
ji4ka написа:
Няколко дена ръчкане по схемата може да спести цял час четене на даташити! :wink:

Не го приемай лично , но схемата си е схема какво общо има със софта.
Да не би да имаш в предвид , първо да прочетеш даташиита и после да пишеш коректно програмата.
ADC -тата на PIC са бавни заради вътрешните капацитети просто им трябва закъснение за да работи нормално , ако не ти е нужна голяма скорост не е проблем .

_________________
Избийте баламите и тарикатите сами ще умрат!
Няма невъзможни работи - има много трудни работи!
----------------------------------------------------------------------------------
"Я в Москве с киркой уран найду, при такой повышенной зарплате" !


Вто Авг 21, 2007 12:32 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Фев 01, 2007 4:04 am
Мнения: 1539
Мнение Re: Ох
plameniv написа:
Не го приемай лично , но схемата си е схема какво общо има със софта.
Да не би да имаш в предвид , първо да прочетеш даташиита и после да пишеш коректно програмата.

Ами нещо такова. Проблема е ,че като не върви схемата както трябва, обикновено не се знае дали е програмата или хардуера (схемата/чипа). Така ,че щеш-нещеш ръчкаш и двете. Специално за АЦП-то на пиковете доста подробно е описано и с формули ,че трябва да се изчаква при превключване между каналите. Така ,че който е чел внимателно винаги има едно наум при такива конфигурации.
Не назидавам никого, случва се и на най-добрите. Понякога човек трябва да изгуби няколко часа за да му се "набие" поуката в главата. Някой му викат "жизнен опит" (experience)и просто е неизбежно. :)
В случая може и чипа да не е бил наред,не споря.


Вто Авг 21, 2007 12:55 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Ки4о написа:
Изводите са RA0/RA1.Изводите не са висящи - свързани са през резистори към маса/захранване,след което си ки включих към буферите.Критично е времето докато се освести АЦП-то между измерването и превключването на каналите.Стана,ама много време изгубих с това.

Я сподели с кой компилатор го правиш това...и "магическите" редове код :)


Вто Авг 21, 2007 6:51 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Пиша на тайнствения и магически асемблер,щото Hi-Tech религията не ми позволява да пиша на С за 16 серия (немам компилатор) :)

Ей го на парчето код:

list p=16F874

Clock_Freq EQU d'18000000'
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_ENABLE_OFF & _LVP_OFF & _DEBUG_OFF & _CPD_OFF

#include <P16F874.INC>
errorlevel 1

w_temp equ 20h
status_temp equ 21h
LCD_DATA equ 22h
LCD_POZ equ 23h
TEMP equ 24h
TEMP_KEY equ 25h
temp EQU 26h
binh_reg equ 27h
binl_reg equ 28h
tenk_reg equ 29h
thous_reg equ 2Ah
hund_reg equ 2Bh
tens_reg equ 2Ch
ones_reg equ 2Dh
LCD11 equ 30h ; LCD буфер ред 1, символ 1
LCD12 equ 31h ; LCD буфер ред 1, символ 2
LCD13 equ 32h ; LCD буфер ред 1, символ 3
LCD14 equ 33h ; LCD буфер ред 1, символ 4
LCD15 equ 34h ; LCD буфер ред 1, символ 5
LCD16 equ 35h ; LCD буфер ред 1, символ 6
LCD17 equ 36h ; LCD буфер ред 1, символ 7
LCD18 equ 37h ; LCD буфер ред 1, символ 8
LCD21 equ 38h ; LCD буфер ред 2, символ 1
LCD22 equ 39h ; LCD буфер ред 2, символ 2
LCD23 equ 3Ah ; LCD буфер ред 2, символ 3
LCD24 equ 3Bh ; LCD буфер ред 2, символ 4
LCD25 equ 3Ch ; LCD буфер ред 2, символ 5
LCD26 equ 3Dh ; LCD буфер ред 2, символ 6
LCD27 equ 3Eh ; LCD буфер ред 2, символ 7
LCD28 equ 3Fh ; LCD буфер ред 2, символ 8;

;*****************************************************************************

RA EQU 3 ;RED ANODE
GA EQU 7 ;GREEN ANODE

;*****************************************************************************
;LCD related
E EQU 2 ;LCD enable signal
RW EQU 1 ;LCD R/W signal
RS EQU 0 ;LCD register select

;*****************************************************************************
org 00h ; set reset vector
goto MAIN
;*****************************************************************************
org 04h
IRQ

movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
bcf STATUS,RP0 ; ensure file register bank set to 0
movwf status_temp ; save off contents of STATUS register
bcf INTCON,GIE
;------------------------------------------------------------------------------

goto ISR
ISR_RETURN
nop
;-------------------------------------------------------------------------------
bcf STATUS,RP0 ; ensure file register bank set to 0
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 content
bsf INTCON,1
retfie ; return from interrupt
;*********************************************************************************


MAIN
clrf PCLATH
CLRF w_temp
CLRF status_temp
CLRF LCD_DATA
CLRF LCD_POZ
CLRF binh_reg
CLRF binl_reg
CLRF tenk_reg
CLRF thous_reg
CLRF hund_reg
CLRF tens_reg
CLRF ones_reg


;*******************************************************************************
INIT_F874
BANKSEL INTCON
CLRF INTCON
BANKSEL PIE1
CLRF PIE1
BANKSEL PIR1
BCF PIR1,TMR1IF ;CLEAR FLAG
BANKSEL T1CON
MOVLW B'00110100' ;00110100
MOVWF T1CON ;1:8 Prescaler
BANKSEL PIE2
CLRF PIE2
;*************************************************************************
banksel PORTA
clrf PORTA
banksel ADCON1
movlw B'10000010' ;all ia ANALOG on PORTA !!!
movwf ADCON1 ;all DIGITAL on PORTE
banksel ADCON0
movlw B'10000100' ;Fos/32,CH0,OFF ADC
movwf ADCON0
banksel TRISA
movlw B'00011111'
movwf TRISA ;all input
;**************************************************************************
banksel PORTB
clrf PORTB
banksel TRISB
movlw B'01100001'
movwf TRISB
banksel OPTION_REG
movlw B'01000110' ;1:128 Prescaler
movlw OPTION_REG ;enable PB0 IRQ !
banksel PORTB
clrf PORTB
;***************************************************************************
banksel PORTC
clrf PORTC
banksel TRISC
movlw 0x00
movwf TRISC ;all outputs
;***************************************************************************
banksel PORTD
clrf PORTD
banksel TRISD
movlw 0x00
movwf TRISD ; all OUTPUT
;***************************************************************************
banksel PORTE
clrf PORTE
BANKSEL TRISE
movlw 0x00
movwf TRISE ; all OUTPUT
clrf PORTE
;***************************************************************************
movlw 0x00
movwf TMR0

;***************************************************************************
banksel INTCON
movlw B'11100100' ;Disable PORTB IRQ EN TMR1 IRQ
movwf INTCON
;***************************************************************************
bsf FLAG,RA
CALL DELAY_10
CALL DELAY_10
CALL DELAY_10
CALL DELAY_10
CALL LCDInit
call DISPLAY_1ROW
call DISPLAY_2ROW
banksel ADCON1
movlw B'10000010' ;all ia ANALOG on PORTA !!!
movwf ADCON1 ;all DIGITAL on PORTE
BANKSEL ADCON0
MOVLW B'10000001' ;ADC on,CH0
MOVWF ADCON0

again
CALL DELAY_10
BANKSEL ADCON0
MOVLW B'10000001' ;ADC on,CH0
MOVWF ADCON0
CALL DELAY_10
CALL DELAY_10
bsf ADCON0,GO_DONE ;start conversion
nop
test
BTFSC ADCON0,GO_DONE
GOTO test

MOVLW 0x1E
MOVWF FSR
MOVF INDF,0
MOVWF binh_reg

MOVLW 0x9E
MOVWF FSR
MOVF INDF,0
MOVWF binl_reg
call conv_16bin_bcd
movf thous_reg,0
addlw H'30'
movwf LCD14
movf hund_reg,0
addlw H'30'
movwf LCD15
movf tens_reg,0
addlw H'30'
movwf LCD16
movf ones_reg,0
addlw H'30'
movwf LCD17
call DISPLAY_1ROW
BANKSEL ADCON0
MOVLW B'10000000' ;ADC off
MOVWF ADCON0
CALL DELAY_10
BANKSEL ADCON0
MOVLW B'10001001' ;ADC on,CH1
MOVWF ADCON0
CALL DELAY_10
CALL DELAY_10
bsf ADCON0,GO_DONE ;start conversion
nop
test_1
BTFSC ADCON0,GO_DONE
GOTO test_1
MOVLW 0x1E
MOVWF FSR
MOVF INDF,0
MOVWF binh_reg
MOVLW 0x9E
MOVWF FSR
MOVF INDF,0
MOVWF binl_reg
call conv_16bin_bcd
movf thous_reg,0
addlw H'30'
movwf LCD23
movf hund_reg,0
addlw H'30'
movwf LCD24
movf tens_reg,0
addlw H'30'
movwf LCD25
movf ones_reg,0
addlw H'30'
movwf LCD26
call DISPLAY_2ROW
BANKSEL ADCON0
MOVLW B'10000000' ;;ADC off
MOVWF ADCON0
goto again

;------------------------------------------------
ISR

btfss INTCON,T0IF
goto ISR_OUT
banksel FLAG
btfss FLAG,RA
goto set_RA
bcf FLAG,RA
banksel PORTD
bcf PORTD,RA
banksel TMR0
movlw 0x00
movwf TMR0
bcf INTCON,T0IF
goto ISR_OUT
set_RA
bsf FLAG,RA
banksel PORTD
bsf PORTD,RA
banksel TMR0
movlw 0x00
movwf TMR0
bcf INTCON,T0IF
ISR_OUT
nop

goto ISR_RETURN
;--------------------------------
DELAY_10 ;10mS
BANKSEL TMR1H
MOVLW 0xA7
MOVWF TMR1H
MOVLW 0x01
MOVWF TMR1L
BANKSEL PIR1
BCF PIR1,TMR1IF
BANKSEL T1CON
BSF T1CON,0
T1_WAIT
BTFSS PIR1,TMR1IF
GOTO T1_WAIT
NOP
RETURN


END

Това е без програмата за управление на LCD-то.Ако някой държи да тества- ще му зипна проекта и ще му го пратя - ама да каже.Ама си мисля че не бъркам в програмата :-k


Вто Авг 21, 2007 8:18 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Ами нередното, което виждам в момента е, че спираш ADC при смяна на канал и после го пускаш отново, явно изчакваш някакво време, но не е добра идеята. Иначе ADCON0 и ADCON1 са ти верни...и последователността на четене ми се види вярна...пробва ли да пуснеш симулатор ?


Вто Авг 21, 2007 9:31 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Спирането го направих поради причината,че като мръдне стойността на единия канал (промени се в голям диапазон от 0 до максимум) се променя и стойността на другия канал.Не ми се струва редно да се прави,ама... За симулатор - ако говориш за Протеус - не,не съм,тествам си на реална платка.


Вто Авг 21, 2007 10:03 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Нед Ное 28, 2004 10:02 pm
Мнения: 141
Местоположение: София
Мнение 
И аз я ядох тая манджа вкиснала преди няколко години... С всички 16F87х/87хА...
Никакво чакане не помогна, дори стигнах до безумието да си вържа директно един от аналоговите крака на маса и преди да меря който и да е друг, минавах през него уж да "разреди капацитетите" (с всичките изчаквания, нулиране на регистри и не знам още какво му баях). Не стана. Проблемът бе решен, като пусках по едно 'фалшиво' мерене на входа, който исках да меря (мерих го два последователни пъти, ама първия не взимах резултат). Не се бях сетил да изключвам АЦП-то, можеше и по-лесно да стане... :oops:
Бтв тогава отбелязах още един проблем - в ниски нива (не мога да кажа колко % от обхвата по спомени) пикльото мереше нелинейно - с грешка около 3%. Интересното беше, че смущаваше аналоговата част (ОР07, R 1.5k и C-някакъв, не си спомням какъв). Мерих директно с мултицета на крака на пика. Като извадех процесора от цокъла, мултицетчето си мереше перфектно - абсолютно линейно, като го вкарвах в цокъла измерването се оцапваше 8O . Още по-интересното беше, че дори без резистор ефекта го имаше (вързвах изхода на операционния директно с входа на пика), макар и малко по-слаб. Накрая трябваше да му пиша 'линеаризираща процедура', оказа се, че проблемът го има на всички пикльовци, които бяхме накупили - устройствата бяха около 50-тина... :cry:


Вто Авг 21, 2007 3:34 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
А някой да има тези наблюдения за 18 серия ?Мисля да сменя 16F874 със 18F4550,но в момента имам такъв но в TQFP корпус.Та преди да съм купил в DIP да питам някой има ли такива впечатления,за да знам да се набутвам ли или да маам с този.


Вто Авг 21, 2007 4:01 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 16 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни