Hallo, ik gebruik de 16F870 als microcontroller. Nu wil ik graag de analoge ingangen uitlezen. Ik heb een deel van de code van iemand van dit forum gebruikt in mijn code.
De waarde die uitgelezen zou moeten worden van de adc zet ik in getal_l. Daarna roep ik de subroutine: binair_naar_dec aan. Deze zet getal_l op het display. Ik weet dat dit werkt want ik heb het getest.
Maar als ik de onderstaande code gebruik komt er alleen maar 000 op het display te staan. Blijkbaar gaat er iets fout.
Als iemand mij hiermee kan helpen dan zou dat geweldig zijn. Alvast bedankt.
init:
CLRF ADCON0 ; Clear ADC register
CLRF ADRESH ; Clear A/D High result register
MOVLW H'0E' ;
MOVWF ADCON1 ; RA0=AN0, LEFT justified, RA1-5=digital I/O, 8-bit resolution
CLRF ADRESL ; Clear A/D Low result register
bsf STATUS, RP0
movlw b'00000001'
movwf TRISA ; zet A0 als ingang (de rest zijn uitgangen)
clrf TRISB ; portb = uitgang
clrf TRISC ; portc = uitgang
bcf STATUS, RP0
call init_display
start:
movlw 0x80
call send_instruction
BSF ADCON0,GO ; Start A/D conversion (every 1.5sec)
POLL
BTFSC ADCON0,GO ; Check GO/DONE bit, skip if clear
GOTO POLL ; No, continue GO/DONE bit polling
MOVF ADRESH,W ; Yes, read 8 MSB's from conversion result
MOVWF getal_l ; Store into getal_l
call binair_naar_dec
goto start
Ik ben deze week ook nog met de 16F870 en ADC aan de gang geweest. Ik programeer in Basic, dus van asm weet ik niks. Maar kijk goed of je het register goed ingesteld hebt. Ik had dat eerst ook niet goed, en dan werkt het dus niet.
Succes
timmie
niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide
ik ben ook geen wonder in asm maar ik zie nergens dat jij je AD's aan zet
zie ook deze listing:
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : tim geerts *
'* Notice : Copyright (c) 2007 tim geerts *
'* : All Rights Reserved *
'* Date : 1-3-2007 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
device 16F876a
config lvp_off, xt_osc, wdt_off,lvp_off,debug_off, pwrte_on, boden_off, cpd_off
xtal 4
;A/D conversie instellingen
declare ADin_res 8
Adcon0 = %01000 01
adcon1 = % 0000000
declare adin_stime 100
;poortregisters
trisa = %00000011
adcon1 = %00000000
;variabele
dim guppie as byte
; PWM instellingen
ccp1con = %000011
ccp1_pin portc.2
while 1=1
guppie = adin 0
Hpwm 1, guppie, 5000
wend
basz
Low cost Mantis CNC bouwebeschrijving zie www.basmolkenboer.nl
@ToCa zou jij je hele ASM bestand hier eens neer willen gooien? Ik wil ook nog eens een keer gaan expirimenteren en tot nu toe heb ik nog niet echt werkende voorbeelden gevonden
edit: mailen mag ook als je wil
adres staat wel in mijn profiel, alvast bedankt!
[Bericht gewijzigd door basz op ]
Ik zal hem morgen even omzetten naar een stuk code wat alleen bestaat uit de ADC en een display-aantsturing. En ik moet er nog wat commentaar bij zetten.
Op dit moment zit er al veel bij wat niet van toepassing is daarvoor.
Turbokeu
Golden Member
I love watching conspiracy theorists use the airtight logic of the argument from incredulity: "Well I don't understand how it works so it can't be real!!!"
Bovenstaande code komt uit het voorbeeld dat ik aangaf in dit topic.
Daar stond ook de initialisatie van de ADC in.
CD 
Ik ben nog even bezig. Ik heb nu alleen dat in ADRESL en in ADRESH dezelfde waarde staat. En dat terwijl het toch een 1-bits ADC is. Dan zou ik het lage gedeelte van de bits in ADRESL moeten krijgen en de andere twee bits in ADRESH. Dit doet hij blijkbaar niet. Moet ik nog ergens zeggen dat hij het in 10-bits moet doen?
Ik zit nog steeds met hetzelfde probleem. Ik het met een potmeter een spanningsdeler gemaakt die een spanning geeft van 0-5V. Deze heb ik op RA0 aangesloten. Op ADRESH staat bij 5V: 255. Dit verloop is lineair. Dus bij 1V krijg ik ongeveer 51. Dit klopt als het een 8-bits ADC zou zijn.
Ik zou volgens mij met een 10-bits ADC 1/5/1024=205 moeten krijgen.
Ik loop hier compleet op vast. Volgens mij moet ik hem nog in 10-bits mode zetten. Maar ik heb geen idee hoe.
Dus als iemand misschien een voorbeeld heeft van een werkende 10-bits adc dan zou dat geweldig zijn, dan kan ik verder.
Turbokeu
Golden Member
I love watching conspiracy theorists use the airtight logic of the argument from incredulity: "Well I don't understand how it works so it can't be real!!!"
Op 9 maart 2007 19:05:32 schreef ToCa:
MOVLW H'0E' ;
MOVWF ADCON1 ; RA0=AN0, LEFT justified, RA1-5=digital I/O, 8-bit resolution
Zie datasheet voor config van ADCON1.
CD 
Daar heb je gelijk in. Hij staat blijkbaar in 8-bit. Maar ik vraag me af hoe ik hem dan in 10-bit krijg. Dat lukt me namelijk niet. Ik heb ook al heel vaak die datasheet doorgebladerd maar ik kan het echt niet vinden.
De frustratie begint al aardig toe te slaan. Ik begrijp het principe wel. De vraag is alleen hoe ik het moet doen
ADRESH en ADRESL staan in verschillende banken.
Doe je geen bankswitch dan lees je 2 maal hetzelfde adres uit.
Dat klopt, dat heb ik toevallig net ook uitgevonden. Maar dan zou het toch niet zo moeten zijn dat dat ik precies 0-255 kan regelen met de potmeter op ADRESH? Dus 5 volt geeft precies 255. Hij zou pas bij 1,245 volt 255 aanmoeten geven op ADRESH.
Dat doet hij dus al niet. Dat vind ik zo raar. Vandaar dat ik het gevoel heb dat hij in 8-bit mode staat. Ik weet niet of dat uberhaupt kan maar dan zou ik hem in 10-bit mode moeten zetten.
Hij kan niet in '8 bit mode' .
Hij kan uitsluitend op left justified of right justified worden ingesteld.
Jij hebt hem left justified staan dus de 2 LSB bits komen in ADRESL.
Bij 1V zou er 205 moeten uitkomen.
Dat is binair 0011001101
De achterste twee bits staan in ADRESL. Die moet je niet vergeten!
Dus ADRESH: 00110011 ADRESL:01
[Bericht gewijzigd door Zonnepaneeltje op ]
Dat dacht ik dus ook. Ik snap er echt geen moer meer van. Ik begrijp dat 10 bits niet in 8 bits past. Dat hij daarvoor die andere byte nodig heeft. Daar horen 2 bits van gebruikt te worden. Maar het is logisch dat als hij bij 5V precies 255 heeft dat hij dan niet verder zal gaan. Ik begin nu aan de PIC te twijfelen.
In de code die ik nu heb, gebruik ik ADRESL ook.
Dat hoop ik ook nog steeds te krijgen. Maar ik regel de potmeter ff af met een multimeter zodat daar 1V op staat. Dan zou er in adresh 204 moeten staan en 0 in adresL. Dat is niet het geval. Er staat namelijk 51
. Daardoor krijg ik het gevoel dat er iets niet goed is.
Het klopt allemaal, alleen je telt vanaf links en je moet vanaf rechts tellen.
nog een keer: 205 = 0011001101
ADRESH: 00110011 ADRESL: 01
Jij kijkt alleen naar ADRESH en daarmee ken je de verkeerde waardes toe aan de bits.
bit 9 = 0
bit 8 = 0
bit 7 = 1 --128
bit 6 = 1 --64
bit 5 = 0
bit 4 = 0
bit 3 = 1 --8
bit 2 = 1 --4
bit 1 = 0
bit 0 = 1 --1
[Bericht gewijzigd door Zonnepaneeltje op ]
Schaam schaam. Je hebt helemaal gelijk. Het is makkelijker om hem op right justified te stellen. Dan is het een stuk logischer moet ik zeggen. Nu geeft hij veel betere waarden aan
. Heel erg bedankt voor de hulp en nog veel meer geduld.