moj odhad je, ze v casovani prevodu. Nastavil som to teraz, aby to odvodzovalo od vnutorneho RC clena a ide to
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.
Tak som to pochopil aj ja, ale nejako sa mi to nechce zhodovat s realitou
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
Nevidite tam nikto nejaku chybu, alebo nejaku pricinu preco by to nemalo fungovat spravne ??
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 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. 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.
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.
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
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.