PIC16F88-AD převodník-změna napětí způsobí přeblikávání LED

moj odhad je, ze v casovani prevodu. Nastavil som to teraz, aby to odvodzovalo od vnutorneho RC clena a ide to :slight_smile:

Ale este by som sa rad pristavil na stranke c. 116 datasheet 16F88-CZ.

[code]Registr 12-2:ADCON0 – řídící registr AD převodníku (adresa: 1Fh, jen PIC16F88)

bit 7-6 ADCS1:ADCS0: Volba zdroje časování pro AD převodník

pro ADCS2 = 0
00 =Fosc/2
01 =Fosc/8
10 =Fosc/32
11 =FRC (časování je odvozeno od vnitřního RC oscilátoru AD převodníku)

pro ADCS2 = 1
00 =Fosc/4
01 =Fosc/16
10 =Fosc/64
11 =FRC (časování je odvozeno od vnitřního RC oscilátoru AD převodníku)

bit 5-3 CHS2:CHS0: volba analogového vstupu pro AD převodník, bit ADCS2 je v registru ADCON1
000 =1. vstup AD převodníku na vývodu AN0
001 =2. vstup AD převodníku na vývodu AN1
010 =3. vstup AD převodníku na vývodu AN2
011 =4. vstup AD převodníku na vývodu AN3
100 =5. vstup AD převodníku na vývodu AN4
101 =6. vstup AD převodníku na vývodu AN5
110 =7. vstup AD převodníku na vývodu AN6
[/code]

Ked si 3-5b nastavim na 001, tak mi do AD prevodu berie LEN vstup AN1, alebo oboje - AN0,AN1 ??

CHS2 - CHS0 slouží k výběru kanálu. Nejde měřit současně na více kanálech. :blush:

Tak som to pochopil aj ja, ale nejako sa mi to nechce zhodovat s realitou :smiley:
Jeden potenciometer reaguje vpohode s jednou diodou, ale ked otacam druhym, tak reaguju obe a to netusim ze preco. Pripajam schemu aj program. Dakujem.

[code]LIST P=16F88
#include <p16f88.inc>

C1 EQU 21h
ON EQU 22h

#DEFINE LED1 PORTB,4
#DEFINE LED0 PORTB,2

_INTOSC_OSC_NOCLKOUT EQU H’3FFC’

ORG 0x2007 ; adresa konfiguracie PIC16F88
DW _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_IO

ORG 0
GOTO START

ORG 4
GOTO START

START
BANKSEL STATUS
CLRF STATUS

BANKSEL OSCCON
BSF OSCCON,IRCF2 ;KMITOCET 8 Mhz
BSF OSCCON,IRCF1
BSF OSCCON,IRCF0

MOVLW B’00000111’ ;Pin RA0/AN0 analogovy vstup
MOVWF ANSEL

MOVLW B’00000000’
MOVWF OPTION_REG

CLRF ADRESL ;vymazanie registrov prevodu
BANKSEL ADRESH
CLRF ADRESH

BANKSEL TRISB
MOVLW B’00000000’
MOVWF TRISB ;B-port ako vystupny
MOVLW B’10100111’
MOVWF TRISA

BANKSEL PORTB

CLRF PORTB
CLRF PORTA

BANKSEL ADCON1
MOVLW B’01000000’ ;radenie sprava, casovanie AD /2 od takt.fr. uC , AVdd-AVss
MOVWF ADCON1

BANKSEL ADCON0

PROGRAM
MOVLW B’11000001’ ; 1. VSTUP
MOVWF ADCON0

BSF ADCON0,2
BTFSC ADCON0,2 ;cakanie na ukoncenie prevodu
GOTO $-1

MOVFW ADRESH ;Adresl do pracovneho reg.
MOVWF ON

INCF ON
DECFSZ ON
GOTO $+2
GOTO $+4
MOVFW ON
BSF LED0
CALL CAKAJ
BCF LED0
MOVLW .255
CALL CAKAJ

MOVLW B’11001001’ ; 2.VSTUP
MOVWF ADCON0

BSF ADCON0,2
BTFSC ADCON0,2 ;cakanie na ukoncenie prevodu
GOTO $-1

MOVFW ADRESH ;Adresl do pracovneho reg.
MOVWF ON
BCF LED0

INCF ON
DECFSZ ON
GOTO $+2
GOTO $+4
MOVFW ON
BSF LED1
CALL CAKAJ
BCF LED1
MOVLW .255
CALL CAKAJ

GOTO PROGRAM

CAKAJ
MOVWF C1
DECFSZ C1
GOTO $-1
RETURN

END[/code]

problem mas tady, prepocitej si bity

bit 5-3 CHS2:CHS0: volba analogového vstupu pro AD převodník, bit ADCS2 je v registru ADCON1 000 =1. vstup AD převodníku na vývodu AN0 001 =2. vstup AD převodníku na vývodu AN1 010 =3. vstup AD převodníku na vývodu AN2 011 =4. vstup AD převodníku na vývodu AN3 100 =5. vstup AD převodníku na vývodu AN4 101 =6. vstup AD převodníku na vývodu AN5 110 =7. vstup AD převodníku na vývodu AN6

misto zapisu B’11010001 skus psat BSF ADCON0,CHSX (X = 0-2)

oj, nie nie, to som si este menil schemu a skusal ine porty, ci nahodou nie je chyba tam. A som tu hodil uz prepisany program a staru schemu. Uz som to v tom kode zmenil :slight_smile:

Nevidite tam nikto nejaku chybu, alebo nejaku pricinu preco by to nemalo fungovat spravne ?? :frowning:

Tak sem hod aktualni kod

[code]LIST P=16F88
#include <p16f88.inc>

C1 EQU 21h
C2 EQU 22h
ON EQU 23h

#DEFINE LED1 PORTB,4
#DEFINE LED0 PORTB,2

_INTOSC_OSC_NOCLKOUT EQU H’3FFC’

ORG 0x2007 ; adresa konfiguracie PIC16F88
DW _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_IO

ORG 0
GOTO START

ORG 4
GOTO START

START
BANKSEL STATUS
CLRF STATUS

BANKSEL OSCCON
BSF OSCCON,IRCF2 ;KMITOCET 8 Mhz
BSF OSCCON,IRCF1
BSF OSCCON,IRCF0

MOVLW B’00000011’ ;Pin RA0/AN0 analogovy vstup
MOVWF ANSEL

MOVLW B’00000000’
MOVWF OPTION_REG

CLRF ADRESL ;vymazanie registrov prevodu
BANKSEL ADRESH
CLRF ADRESH

BANKSEL TRISB
MOVLW B’00000000’
MOVWF TRISB ;B-port ako vystupny
MOVLW B’10100011’
MOVWF TRISA

BANKSEL PORTB

CLRF PORTB
CLRF PORTA

BANKSEL ADCON1
MOVLW B’01000000’ ;radenie sprava, casovanie AD /2 od takt.fr. uC , AVdd-AVss
MOVWF ADCON1

BANKSEL ADCON0

PROGRAM

CALL PREVOD1
CALL PREVOD2
GOTO PROGRAM

CAKAJ
MOVWF C1
DECFSZ C1
GOTO $-1
RETURN

PREVOD1

MOVLW B’11000101’ ; 1. VSTUP
MOVWF ADCON0

BTFSC ADCON0,2 ;cakanie na ukoncenie prevodu
GOTO $-1

MOVFW ADRESH ;Adresl do pracovneho reg.
MOVWF ON

INCF ON
DECFSZ ON
GOTO $+2
GOTO $+4
MOVFW ON
BSF LED0
CALL CAKAJ
BCF LED0
MOVLW .255
CALL CAKAJ

RETURN

PREVOD2

MOVLW B’11001101’ ; 2.VSTUP
MOVWF ADCON0

BTFSC ADCON0,2 ;cakanie na ukoncenie prevodu
GOTO $-1

MOVFW ADRESH ;Adresl do pracovneho reg.
MOVWF ON

INCF ON
DECFSZ ON
GOTO $+2
GOTO $+4
MOVFW ON
BSF LED1
CALL CAKAJ
BCF LED1
MOVLW .255
CALL CAKAJ

RETURN

END[/code]

Zkus tohle.

Opraveno zapnutí AD :blush: thx** jankop**
AD.asm (1.82 KB)

Nějak to nechci celé studovat, ale nezdá se mi tohle:

[code]PREVOD1
MOVLW B’11000101’ ; 1. VSTUP
MOVWF ADCON0

PREVOD2
MOVLW B’11001101’ ; 2.VSTUP
MOVWF ADCON0 [/code]
Podle datasheetu nesmíš startovat převod AD současně se zapnutím převodníku, což ty děláš.

Mělo by to vypadat takto:

[code]PREVOD1
MOVLW B’11000001’ ; 1. VSTUP
MOVWF ADCON0
BSF ADCON0,2

PREVOD2
MOVLW B’11001001’ ; 2.VSTUP
MOVWF ADCON0
BSF ADCON0,2 [/code]
Netvrdím ovšem, že tam nejsou další chyby.

Tak toho jsem si ani nevšiml.:frowning: Předtím to měl tuším dobře, tak nevím, proč to pořád mění.

Jo, koukal jsem dopředu a měl to už i dobře. :smiley:

Jen doplnim, pred nastavenim GO se ma pockat pozadovany cas Tacq, ja cekam cca 20-40uS, nijak sem to neskoumal jestli je to opravdu nutny , jen koukam do DS “These steps should be followed for doing an A/D conversion”

Nutné to bude: citace z datasheetu

ten prilozeny asm som skusal, ziaden efekt, robi to to iste co doteraz. Ano, mal som AD spustany osobitne a teraz som to skusal spustat naraz, ale neovplyvnilo ho to nijako.
A ten cas na pockanie do dalsieho AD prevodu tam je, kym urobi ten PWM.

Že tomu programu nerozumím, mě nepřekvapuje, jsem mladej a nezkušenej. Dokonce ani neznám instrukci MOVFW, kterou v programu všichni používáte. :blush:

ja ji nepouzivam, raci pouziju MOVF ON,W . MOVFW = vem File registr a zapis do Work registru ,
mas pockat Tacq po vyberu kanalu pred spustenim A/D prevodniku

bcf ADCON0,CHS0 ; vstup AD0 call cekej_Tacq ; cca min 20uS bsf ADCON0,GO ;zapnuti AD prevodu
pokud uz to fungovalo s jednim kanalem tak se k tomu vrat , prt na 2 kalnaly , roschot 1st kanal s 1st potakem , pak roschot 2nd kanal s 2nd potakem, oba dva v samostatnym podprogramu a pak to spoj
me osobne se tam nak nezamlouva to jakoby " PWM "

Já ji nepoužívám. Co jsem začal s 18F, tak tam to nejde :frowning:

A existuje vůbec taková instrukce MOVFW, prohlédl jsem několik instrukčních sad a nikde ji nemohu najít.
Všude je jen MOVLW nebo MOVWF.