Hallo iedereen,

Ik zit met het volgende probleem:
Ik wil met een pic12f675 de analoge waarde uitlezen op AN0( pin7 ).

Maar dit wil maar niet lukken. Om te testen lees ik de MSF bit uit ADRESH en kijk ik of dit 1 of 0 is. Ik leg dan ook 0 of 5V aan AN0 wanneer ik 5v aanleg zou de MSB 1 moeten zijn, bij 0v zou dit 0 moeten zijn. Maar dit is altijd 0 volgens mijn programma. Ziet iemand een fout in mijn code ?


Init					; Initialisatie
	
	banksel 0x80			;Switch to Bank1
	
	movlw	B'11011111'		 ;set internal clock(bit5=0)
	movwf	OPTION_REG	
	clrf	VRCON			;Vref Off (power off the comparator voltage, saves power)


	movlw	B'01100001'		; voor ADC
	movwf	ANSEL


	movlw	B'11100001'		;5,0 = input, rest = output ( voor analoge waarde in te lezen )
	movwf	TRISIO			

	banksel 0x00			;BANK 0
	clrf	GPIO			;Clear Port
	movlw	0x07			;stond op 07		
	movwf	CMCON		;Comparator Off

	
	GOTO 	Start




Start
	BCF		GPIO,2		;Alarm uit
	BTFSS	GPIO,5		;Wachten tot knop ingedrukt is
	GOTO	Start		;Zoniet terug naar start
adc						;als ingedrukt, naar volgende stap

	;testen of adc gedaan heeft
	movlw	B'00000011'		;analoog reg instellen, conversie starten, an0 uitlezen (pin7)
	movwf	ADCON0
waitadc
	BTFSC	ADCON0,1		;wachten tot conversie voltooid is
	GOTO	waitadc
hier
	BCF		STATUS,0		;carry clearen
;	movlw	ADRESH
;	subwf	h'96',0  ;150 - adresh
;	BTFSC	STATUS,0
	BTFSC	ADRESH,7		;kijken of MSB 1 is
	GOTO	fout
juist	
	BSF		GPIO,2	 ; juist	
	goto 	juist

fout
	BSF		GPIO,4	;fout
	goto	fout

[Bericht gewijzigd door Henry S. op (0%)]

De 12F627 bestaat niet, en de 16F627 heeft geen A/D converter???

12F675 bedoel ik :(

kan mod mijn titel aanpassen ?

Dank u !

pic12f675 is dat toch?

edit: Sorrie, je was me voor

[Bericht gewijzigd door Iemand op (44%)]

Je moet na het instellen van ADCON0 wel wachten tot de aquisition time voorbij is...
(~12µS, zie datasheet -> A/D CONVERSION REQUIREMENTS)

Dat was ik vergeten, ik heb even een delay ertussen gezet maar hij doet het nog niet :(


Init					; Initialisatie
	
	banksel 0x80			;Switch to Bank1
	
	movlw	B'11011111'		 ;set internal clock(bit5=0)
	movwf	OPTION_REG	
	clrf	VRCON			;Vref Off (power off the comparator voltage, saves power)


	movlw	B'01100001'		; voor ADC
	movwf	ANSEL


	movlw	B'11100001'		;5,0 = input, rest = output ( voor analoge waarde in te lezen )
	movwf	TRISIO			

	banksel 0x00			;BANK 0
	clrf	GPIO			;Clear Port
	movlw	0x07			;stond op 07		
	movwf	CMCON		;Comparator Off

	
	GOTO 	Start




Start
	BCF		GPIO,2		;Alarm uit
	BTFSS	GPIO,5		;Wachten tot knop ingedrukt is
	GOTO	Start		;Zoniet terug naar start
adc						;als ingedrukt, naar volgende stap

	;testen of adc gedaan heeft
	movlw	B'00000011'		;analoog reg instellen, conversie starten, an0 uitlezen (pin7)
	movwf	ADCON0
	movlw	h'ff'			;even wachten
	movwf	delay2
	CALL 	loop2
waitadc
	BTFSC	ADCON0,1		;wachten tot conversie voltooid is
	GOTO	waitadc
hier
	BCF	STATUS,0		;carry clearen

	BTFSC	ADRESH,7		;kijken of MSB 1 is
	GOTO	fout
juist	
	BSF		GPIO,2	 ; juist	
	goto 	juist

fout
	BSF		GPIO,4	;fout
	goto	fout


loop2
	nop
	decfsz	delay2,1
	goto	loop2
	return


END		

[Bericht gewijzigd door Henry S. op (0%)]

Je moet het 'GO' bit pas zetten NA de delay, anders heeft 't geen nut...

Ah oke Ik ga dit testen als ik terug een werkende controller heb want heb deze opgeblazen door 2 pinnen kort te sluiten :(:(:(:(:( Zal code al even aanpassen. Alvast bedankt !

Zo dus?



	movlw	B'00000001'		;analoog reg instellen, an0 uitlezen (pin7)
	movwf	ADCON0
	movlw	h'ff'			;even wachten
	movwf	delay2
	CALL 	loop2

	BSF		ADCON0,1		;conversie starten

[Bericht gewijzigd door Henry S. op (1%)]

Hier een werkende ADC subroutine.
Het resultaat wordt weggeschreven naar de variabelen RESULTL en RESULTH. Zelf even een delay subroutinetje erbij zetten.


ADC 	BANK0
		movlw   b'10001001' 	; 1 = right justified, channel2, ADC on
		movwf	ADCON0		
						
		call	DELAY           ;delay for acquisition time 21 us.
		bsf	ADCON0, GO	;start AD conversion
WAIT	        btfsc	ADCON0, GO	;conversion is completed?
		GOTO 	WAIT		;no, wait some more
		bcf	PIR1, ADIF	;yes, reset AD vlag
		movlw	ADRESH		;haal ad waarde binnen	
		movwf	FSR		;en zet weg 
		movf	INDF,w		;
		movwf	RESULTH		;
		movlw	ADRESL		;indirect
		movwf	FSR		;adressing
		movf	INDF,w		;
		movwf	RESULTL		;

		RETURN
;*

[Bericht gewijzigd door Henry S. op (0%)]

Oke bedankt! Uit jou code kan ik uithalen dat die van mij nu ook moet werken :)

Nu zit ik met een nieuw probleem: De bedoeling is wanneer ik een spanning van 2 volt of hoger inlees wil ik een ledje laten branden. Maar wanneer ik 2V aan de ADC ingang hang zakt deze 2V naar 0.8V. De spanning van 2V maak ik door een spanningsdeler van 13K en 2K op 15V.

Weet iemand hoe het komt dat men spanning in elkaar zakt?

Door de interne weerstand waar de ADC mee meet wordt je 2K naar beneden getrokken. Blijkbaar dus naar 800Ohm. Of pak kleinere waarden voor de weerstaden, of gebruik een spanningsvolger (opamp met versterking 1)

Op 30 november 2009 16:40:08 schreef AC/DrieC:
Weet iemand hoe het komt dat men spanning in elkaar zakt?

Daar zit iets fout, de aanbevolen bronweerstand van de spanning voor de A/D is dacht ik 10k, daar voldoe jij aan.

Misschien vergeten de pin als input te zetten?

Neen, trisio register staat juist :(
heb met lagere weerstandswaarde geprobeert en dit werkt, maar de weerstanden die ik eerst gebruikte zouden ook moeten werken.

Dan heb je de poort nog op digitaal staan.
Even op analoog zetten in het ANSEL register.

ansel staat ook juist. Ik gebruik AN0 en ansel staat op 11100001.

ANSEL 01100001 (startpost) of ANSEL 11100001?

Maakt verder niet uit want de MSB wordt niet gebruikt, het is wel zo netjes die op 0 te houden.

Bovenstaande houdt wel in dat je Frc gebruikt, interne oscillator op 500kHz max.

Bijbehorende TRIS0 is xxxxxxx1.

Zet eerst TRIS0, daarna pas ANSEL.

ANSEL 01100001 sorry, heb nu ook eerst TRISO gezet en hierna ANSEL (wat eigenlijk logisch is) Maar het heeft niet geholpen :(

Andere poort geprobeerd, misschien is deze al mishandeld...

Hmm morgen eens nieuwe controller proberen want ze hebben maar 1 poort, of is andere pin ook goed ?

Bedankt!

Je hebt nog meer ADC pinnen, misschien lukt het daarmee, anders een andere uC.