| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| PIC16F874 и избор на ADC канал http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=4661 |
Страница 1 от 2 |
| Автор: | Ки4о [ Пон Авг 20, 2007 2:11 pm ] |
| Заглавие: | PIC16F874 и избор на ADC канал |
До сега не ми се е случвало,ама днеска стана : Използвам на PIC16F874 3 от всичките канали на АЦП-то.Закачил съм едно LCD и гледам какво има на всеки канал.Да обаче когато единия канал се свърже към маса и на един от другите се подаде напрежение,на LCD- то показва,че на канала който е към маса има напрежение.Измервам с уреда и осцилоскопа на извода на PIC-а този които е към маса - 0V,на другия някакво напрежение си има.Размених каналите - отново се получи същото |
|
| Автор: | ji4ka [ Пон Авг 20, 2007 2:43 pm ] |
| Заглавие: | |
Пускаш АЦП-то, избираш канала, после изчакваш > 30us и тогава стартираш преобразуването. Както знаеш ,ацп-то е едно и му трябва време да си презареди капацитетите при превключване м/у каналите. Но може и някакви вътрешни утечки да се получават. Или да текат тоци през масата и да вдигат потенциала (Rout на пиновете е около 100ома). |
|
| Автор: | Ки4о [ Пон Авг 20, 2007 2:57 pm ] |
| Заглавие: | |
То с това съм наясно.Оказа се че точно този пик иска да се гаси и пуска АЦП-то преди всяка смяна наканала- така се реши въпроса. |
|
| Автор: | ji4ka [ Пон Авг 20, 2007 3:04 pm ] |
| Заглавие: | |
Явно някое капацитетче си остава заредено и му е трябва "хардресет". Аз доколкото знам АЦП-то на пиковете е с превключваеми кондензатори, та явно и от там тия магарии. |
|
| Автор: | ToHu [ Пон Авг 20, 2007 7:09 pm ] |
| Заглавие: | |
Мммне, не ми се е случвало точно това, ако пина е висящ се случва, но щом си го дал на маса не би трябвало да има. Кои са тия входове. |
|
| Автор: | Ки4о [ Пон Авг 20, 2007 9:30 pm ] |
| Заглавие: | |
Изводите са RA0/RA1.Изводите не са висящи - свързани са през резистори към маса/захранване,след което си ки включих към буферите.Критично е времето докато се освести АЦП-то между измерването и превключването на каналите.Стана,ама много време изгубих с това. |
|
| Автор: | ji4ka [ Пон Авг 20, 2007 11:04 pm ] |
| Заглавие: | |
Няколко дена ръчкане по схемата може да спести цял час четене на даташити! |
|
| Автор: | plameniv [ Вто Авг 21, 2007 12:32 am ] | |||||||||
| Заглавие: | Ох | |||||||||
Не го приемай лично , но схемата си е схема какво общо има със софта. Да не би да имаш в предвид , първо да прочетеш даташиита и после да пишеш коректно програмата. ADC -тата на PIC са бавни заради вътрешните капацитети просто им трябва закъснение за да работи нормално , ако не ти е нужна голяма скорост не е проблем . |
||||||||||
| Автор: | ji4ka [ Вто Авг 21, 2007 12:55 am ] | |||||||||
| Заглавие: | Re: Ох | |||||||||
Ами нещо такова. Проблема е ,че като не върви схемата както трябва, обикновено не се знае дали е програмата или хардуера (схемата/чипа). Така ,че щеш-нещеш ръчкаш и двете. Специално за АЦП-то на пиковете доста подробно е описано и с формули ,че трябва да се изчаква при превключване между каналите. Така ,че който е чел внимателно винаги има едно наум при такива конфигурации. Не назидавам никого, случва се и на най-добрите. Понякога човек трябва да изгуби няколко часа за да му се "набие" поуката в главата. Някой му викат "жизнен опит" (experience)и просто е неизбежно. В случая може и чипа да не е бил наред,не споря. |
||||||||||
| Автор: | Predator_MF [ Вто Авг 21, 2007 6:51 am ] | |||||||||
| Заглавие: | ||||||||||
Я сподели с кой компилатор го правиш това...и "магическите" редове код |
||||||||||
| Автор: | Ки4о [ Вто Авг 21, 2007 8:18 am ] |
| Заглавие: | |
Пиша на тайнствения и магически асемблер,щото 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 noptest 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-то.Ако някой държи да тества- ще му зипна проекта и ще му го пратя - ама да каже.Ама си мисля че не бъркам в програмата
|
|
| Автор: | Predator_MF [ Вто Авг 21, 2007 9:31 am ] |
| Заглавие: | |
Ами нередното, което виждам в момента е, че спираш ADC при смяна на канал и после го пускаш отново, явно изчакваш някакво време, но не е добра идеята. Иначе ADCON0 и ADCON1 са ти верни...и последователността на четене ми се види вярна...пробва ли да пуснеш симулатор ? |
|
| Автор: | Ки4о [ Вто Авг 21, 2007 10:03 am ] |
| Заглавие: | |
Спирането го направих поради причината,че като мръдне стойността на единия канал (промени се в голям диапазон от 0 до максимум) се променя и стойността на другия канал.Не ми се струва редно да се прави,ама... За симулатор - ако говориш за Протеус - не,не съм,тествам си на реална платка. |
|
| Автор: | zmej [ Вто Авг 21, 2007 3:34 pm ] |
| Заглавие: | |
И аз я ядох тая манджа вкиснала преди няколко години... С всички 16F87х/87хА... Никакво чакане не помогна, дори стигнах до безумието да си вържа директно един от аналоговите крака на маса и преди да меря който и да е друг, минавах през него уж да "разреди капацитетите" (с всичките изчаквания, нулиране на регистри и не знам още какво му баях). Не стана. Проблемът бе решен, като пусках по едно 'фалшиво' мерене на входа, който исках да меря (мерих го два последователни пъти, ама първия не взимах резултат). Не се бях сетил да изключвам АЦП-то, можеше и по-лесно да стане... Бтв тогава отбелязах още един проблем - в ниски нива (не мога да кажа колко % от обхвата по спомени) пикльото мереше нелинейно - с грешка около 3%. Интересното беше, че смущаваше аналоговата част (ОР07, R 1.5k и C-някакъв, не си спомням какъв). Мерих директно с мултицета на крака на пика. Като извадех процесора от цокъла, мултицетчето си мереше перфектно - абсолютно линейно, като го вкарвах в цокъла измерването се оцапваше |
|
| Автор: | Ки4о [ Вто Авг 21, 2007 4:01 pm ] |
| Заглавие: | |
А някой да има тези наблюдения за 18 серия ?Мисля да сменя 16F874 със 18F4550,но в момента имам такъв но в TQFP корпус.Та преди да съм купил в DIP да питам някой има ли такива впечатления,за да знам да се набутвам ли или да маам с този. |
|
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|