AC/DrieC
Den Dries www.hulens.be
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%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Je moet na het instellen van ADCON0 wel wachten tot de aquisition time voorbij is...
(~12µS, zie datasheet -> A/D CONVERSION REQUIREMENTS)
AC/DrieC
Den Dries www.hulens.be
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%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
AC/DrieC
Den Dries www.hulens.be
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%)]
AC/DrieC
Den Dries www.hulens.be
AC/DrieC
Den Dries www.hulens.be
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)
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
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?
AC/DrieC
Den Dries www.hulens.be
Neen, trisio register staat juist 
heb met lagere weerstandswaarde geprobeert en dit werkt, maar de weerstanden die ik eerst gebruikte zouden ook moeten werken.
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.
AC/DrieC
Den Dries www.hulens.be
ANSEL 01100001 sorry, heb nu ook eerst TRISO gezet en hierna ANSEL (wat eigenlijk logisch is) Maar het heeft niet geholpen 
AC/DrieC
Den Dries www.hulens.be
Hmm morgen eens nieuwe controller proberen want ze hebben maar 1 poort, of is andere pin ook goed ?
Bedankt!
