HEX-ASM, porovnani cisel, analog

Nevíte o prográmku na převod z HEX do ASM?

Jeste otazka porovnani cisel z analogu. Delal jsem to tak ze jsem cislo odecet a pak testoval příznak CY. Ale asi mi to nejak blbne.

Při testování z dvou analogu se mi ta cisla nazvajem ovlivnují. Kdyz menim napeti na jednom tak se mi soucastne zmeni stav i na tom druhem. nevim proc… Kdyby nekdo vedel jak poradit?

[code]
INCLUDE <P12F675.INC>
__CONFIG _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF

CAS equ 22h
TMP equ 23h
CIT0 equ 25h ; citac
CIT1 equ 26h ; citac
CIT2 equ 27h ; citac

org	00h
goto	INIT

org	04h		; ulozeni hlavnich registru
NOP

;*****************************************************
;*****************************************************
INIT
BSF STATUS,RP0 ; kalibrace vnitrniho oscilatoru
CALL 3FFh
MOVWF OSCCAL
BCF STATUS,RP0
CLRF GPIO
MOVLW B’00000111’ ; typ komparatoru (vypnut)
MOVWF CMCON
BSF STATUS,RP0 ; I/O
MOVLW B’00001111’
MOVWF TRISIO
BCF STATUS,RP0

	MOVLW	B'10000001'	; inicializace A/D prevodniku

	MOVWF	ADCON0
	BSF		STATUS,RP0
	MOVLW	B'01010011'
	MOVWF	ANSEL
	BCF		STATUS,RP0

START ;MOVLW B’11111111’ ; nastaveni casove prodlevy
;MOVWF CIT0
;MOVWF CIT1
;MOVLW 1 ; 1 = 200 ms
;MOVWF CIT2

STARTA
; DECFSZ CIT0,1 ; cekani urcenou dobu
; GOTO STARTA
; DECFSZ CIT1,1
; GOTO STARTA
; DECFSZ CIT2,1
; GOTO STARTA

CALL KLID

	clrf	ADRESH
	
	MOVLW	B'10000011'	; zapnuti prevodu u GP0
	MOVWF	ADCON0
	BTFSC	ADCON0,1	; pocka na konec prevodu
	GOTO	$-1	
	
	BCF		STATUS,C	;vymazani priznaku

	MOVLW	ADRESH
	IORLW	B'0111100'
	SUBLW	B'1111111'
	
	BTFSS	STATUS,C
	;BTFSS	ADRESH,1		
	GOTO	$+3
	BCF		GPIO,5
	GOTO	DAL
	BSF		GPIO,5
	
	BCF		STATUS,C	;vymazani priznaku

	CALL	KLID

DAL clrf ADRESH
MOVLW B’10000111’ ; zapnuti prevodu u GP1
MOVWF ADCON0
BTFSC ADCON0,1 ; pocka na konec prevodu
GOTO $-1

	MOVLW	ADRESH
	IORLW	B'0111100'
	SUBLW	B'1111111'
	
	BTFSS	STATUS,C		
	;BTFSS	ADRESH,1
	GOTO	$+3
	BCF		GPIO,4
	GOTO	START
	BSF		GPIO,4

	GOTO	START		

;----------------------------------podprogramy
KLID CALL PAUZE
CALL PAUZE
CALL PAUZE
CALL PAUZE
CALL PAUZE
RETURN

PAUZE MOVLW 20
cekej movwf CAS
cek1 decfsz CAS,f
goto cek1
return

END[/code]

to je program snad to nekdo pochopi

Máš chybu v přesunu

MOVLW ADRESH IORLW B'0111100' SUBLW B'1111111'

a musíš mít

MOVF ADRESH,w IORLW B'0111100' SUBLW B'1111111'

dáváš do W adresu registru a ne jeho obsah, konkrétně 0x1E

Myslím, že druhý problém je v datasheetu popsán jako ACQUISITION TIME. Po ukončení převodu GP0 je nutno přepnout na GP1. Ale pak je nutno vyčkat nějakou dobu, než se kondenzátor vzorkovacího obvodu nabije. Pokud začneš převod bezprostředně, pak je napětí vzorkovacího kondenzátoru ještě závislé na předchozím stavu. Po přepnutí na jiný kanál musíš tedy vložit prodlevu před novým vzorkováním. Délka je závislá na vstupních impedancích, požadovaném rozlišení apod. Bavíme se o časech desítek mikrosekund. Více najdeš v datasheetu.

HEX na ASM převedeš i MPLABem.
Tohle je tvůj program převedený z HEX:

[code] Line Address Opcode Disassembly

  1   000     2805  GOTO 0x5                               
  2   001     3FFF  ADDLW 0xff                             
  3   002     3FFF  ADDLW 0xff                             
  4   003     3FFF  ADDLW 0xff                             
  5   004     0000  NOP                                    
  6   005     1683  BSF 0x3, 0x5                           
  7   006     23FF  CALL 0x3ff                             
  8   007     0090  MOVWF 0x10                             
  9   008     1283  BCF 0x3, 0x5                           
 10   009     0185  CLRF 0x5                               
 11   00A     3007  MOVLW 0x7                              
 12   00B     0099  MOVWF 0x19                             
 13   00C     1683  BSF 0x3, 0x5                           
 14   00D     300F  MOVLW 0xf                              
 15   00E     0085  MOVWF 0x5                              
 16   00F     1283  BCF 0x3, 0x5                           
 17   010     3081  MOVLW 0x81                             
 18   011     009F  MOVWF 0x1f                             
 19   012     1683  BSF 0x3, 0x5                           
 20   013     3053  MOVLW 0x53                             
 21   014     009F  MOVWF 0x1f                             
 22   015     1283  BCF 0x3, 0x5                           
 23   016     2035  CALL 0x35                              
 24   017     019E  CLRF 0x1e                              
 25   018     3083  MOVLW 0x83                             
 26   019     009F  MOVWF 0x1f                             
 27   01A     189F  BTFSC 0x1f, 0x1                        
 28   01B     281A  GOTO 0x1a                              
 29   01C     1003  BCF 0x3, 0                             
 30   01D     301E  MOVLW 0x1e                             
 31   01E     383C  IORLW 0x3c                             
 32   01F     3C7F  SUBLW 0x7f                             
 33   020     1C03  BTFSS 0x3, 0                           
 34   021     2824  GOTO 0x24                              
 35   022     1285  BCF 0x5, 0x5                           
 36   023     2827  GOTO 0x27                              
 37   024     1685  BSF 0x5, 0x5                           
 38   025     1003  BCF 0x3, 0                             
 39   026     2035  CALL 0x35                              
 40   027     019E  CLRF 0x1e                              
 41   028     3087  MOVLW 0x87                             
 42   029     009F  MOVWF 0x1f                             
 43   02A     189F  BTFSC 0x1f, 0x1                        
 44   02B     282A  GOTO 0x2a                              
 45   02C     301E  MOVLW 0x1e                             
 46   02D     383C  IORLW 0x3c                             
 47   02E     3C7F  SUBLW 0x7f                             
 48   02F     1C03  BTFSS 0x3, 0                           
 49   030     2833  GOTO 0x33                              
 50   031     1205  BCF 0x5, 0x4                           
 51   032     2816  GOTO 0x16                              
 52   033     1605  BSF 0x5, 0x4                           
 53   034     2816  GOTO 0x16                              
 54   035     203B  CALL 0x3b                              
 55   036     203B  CALL 0x3b                              
 56   037     203B  CALL 0x3b                              
 57   038     203B  CALL 0x3b                              
 58   039     203B  CALL 0x3b                              
 59   03A     0008  RETURN                                 
 60   03B     3020  MOVLW 0x20                             
 61   03C     00A2  MOVWF 0x22                             
 62   03D     0BA2  DECFSZ 0x22, F                         
 63   03E     283D  GOTO 0x3d                              
 64   03F     0008  RETURN[/code]                                 

[/code]

aha, díky moc to bude asi ono, ze mi to ovlivnovalo i druhej kanal … diky :slight_smile:

Máš tam čekací smyčku 500us, to jako nestačí AD převod?
Podle mě jsi měl chybu v tom, jak jsem psal dříve. A pak tam máš ještě jednu chybu, a to

[code]
BCF STATUS,C ;vymazani priznaku
CALL KLID

DAL clrf ADRESH
MOVLW B’10000111’ ; zapnuti prevodu u GP1
MOVWF ADCON0 [/code]

A měl by jsi mít

[code]
BCF STATUS,C ;vymazani priznaku

DAL CALL KLID

clrf ADRESH
MOVLW B’10000111’ ; zapnuti prevodu u GP1
MOVWF ADCON0[/code]

Protože za určitých podmínek ti CALL KLID přeskočí a tím nedodržíš čas potřebný k nabití vzorkovacího kondiku.

MOVLW B'10000011' ; zapnuti prevodu u GP0 MOVWF ADCON0 BTFSC ADCON0,1 ; pocka na konec prevodu GOTO $-1
Tady se přepíná kanál a okamžitě se začíná měřit. A to samé je pro druhý kanál. Ukaž mi, kde je to zpoždění 500us? Opravdu mě to zajímá.

[code]CALL KLID

  clrf   ADRESH
  
  MOVLW   B'10000011'   ; zapnuti prevodu u GP0
  MOVWF   ADCON0
  BTFSC   ADCON0,1   ; pocka na konec prevodu
  GOTO   $-1    [/code]

před kazdým měřením máš CALL KLID. Při 4Mhz to je 500us

Aha, já tě špatně pochopil. MUSI SE čekat po přepnutí!!! Já jsem ještě 2 kanaly nepoužíval, jen jeden, ponaučení pro příště :blush:

Takže když chci měřit na druhém, tak ho musím přepnout, pak počkat, dle datasheetu cca 20us a teprve pak spustit AD převod?

Ano, musí se čekat po přepnutí. Z toho a datasheetu plyne:

  1. Zapnutí převodníku bitem ADCON je nutné provést před povelem ADCON<GO/DONE> pro start převodu, nelze je provést současně. Není nutná prodleva, ale nelze to provést jednou instrukcí.
  2. Přepnutí kanálu bity ADCONCHS1:CHS0 je nutné provést před povelem ADCON<GO/DONE>, aby se vzorkovací kondenzátor stačil nabít. Nutná prodleva cca 20us, detaily v datasheetu.

Tak už je mi to jasné. Hlavně že mám doma knihu Mikrokontroléry PIC16F87X a tam si to stačilo přečíst.

Příznakový/řídící bit GO/DONE by neměla do urovně "1" nastavovat stejná instrukce, která zapíná modul A/D převodníku 

Tak jestli jsem vas dobre pochopil tak by to melo bejt nejak takhle?

	LIST P=12F675, R=DEC
	INCLUDE <P12F675.INC>
	__CONFIG _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF


CAS		equ	22h

	org	00h
	goto	INIT

	org	04h		; ulozeni hlavnich registru
	NOP
;*****************************************************
;*****************************************************
INIT	
		BSF	STATUS,RP0	; kalibrace vnitrniho oscilatoru
		CALL	3FFh
		MOVWF	OSCCAL
		BCF	STATUS,RP0
		CLRF	GPIO
		MOVLW	B'00000111'	; typ komparatoru (vypnut)
		MOVWF	CMCON		
		BSF	STATUS,RP0	; I/O
		MOVLW	B'00001111'
		MOVWF	TRISIO
		BCF	STATUS,RP0

		MOVLW	B'10000001'	; inicializace A/D prevodniku

		MOVWF	ADCON0
		BSF	STATUS,RP0
		MOVLW	B'01010011'
		MOVWF	ANSEL
		BCF	STATUS,RP0


START		CLRF	ADRESH
		BCF	STATUS,C	;vymazani priznaku
		MOVLW	B'10000001'	; nastaveni kanalu
		MOVWF	ADCON0
		CALL	PAUZE
		BSF	ADCON0,1	; zapnuti prevodu
		BTFSC	ADCON0,1	; pocka na konec prevodu
		GOTO	$-1	
		
		BCF	STATUS,C	;vymazani priznaku

		MOVF    ADRESH,w
        	IORLW   B'0111100'
        	SUBLW   B'1111111'
		
		BTFSS	STATUS,C		
		GOTO	$+3
		BCF	GPIO,5
		GOTO	DAL
		BSF	GPIO,5
		

DAL		CLRF	ADRESH
		BCF	STATUS,C	; vymazani priznaku
		MOVLW	B'10000101'	; nastaveni GP1
		MOVWF	ADCON0
		CALL	PAUZE
		BSF	ADCON0,1	; zapnuti prevodu
		BTFSC	ADCON0,1	; pocka na konec prevodu
		GOTO	$-1	
		
		MOVF    ADRESH,w
        	IORLW   B'1111110'
        	SUBLW   B'1111111'
		
		BTFSS	STATUS,C		
		GOTO	$+3
		BCF		GPIO,4
		GOTO	START
		BSF		GPIO,4

		GOTO	START		

;----------------------------------podprogramy

PAUZE	BCF	STATUS,C
	MOVLW	20
cekej	movwf	CAS
cek1	decfsz	CAS,f	
	goto	cek1
	return

END

      

fuguje to tak by to melo byt spravny :smiley:
Diky vsem :slight_smile: