Hallo mede CO'ers,
Ik ben bezig met een projectje in Picbasic (voltmeter voor een simpele voeding) maar ik kom er nog niet helemaal uit hoe ik de config fuses van deze PIC in moet stellen.
Ik krijg bij het compileren direct een error over de INTRC_OSC_NOCLKOUT fuse, waardoor hij ook niet wil compileren. Als ik hem weglaat compileert hij wel. Vervolgens kies ik in IC-prog de interne oscillator en programmeer ik de pic. Programma staat er netjes in, niets mis mee.
Alleen zodra ik de schakeling aanzet (pic aan een lcd, verder niets) gebeurt d'r niks. Dit is de code (waar hoogstwaarschijnlijk de fout in zit, ben zowiso al een Picbasic noob... Maak ik het mezelf ook nog moeilijk met de ADIN...
device 16f819
CONFIG WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
declare adin_stime 50
dim adwaarde as word
TRisa = %00000001
adcon1 = %10000000
adwaarde = adin 0
clear
Delayms 500
cls
while 1 = 1
print at 1, 1, "AD-Waarde:"
print at 2, 1, dec adwaarde, " "
wend
endIk ga zometeen ff een simpele hello-world erin zetten, kijken of dat verschil gaat maken...
EDIT: Krijg zelfs dat niet aan de praat 
Alvast bedankt!
moet er niet iets bij over het crystal?
xtal = 20
voor een 20mhz crystal
want zonder INTRC_OSC_NOCLKOUT gaat ie volgens mij over op het externe crystal.
zet er eens een crystal van 4mhz aan, en zet xtal = 4 in je code.
werkt het dan?
Deze PIC heeft toch een interne oscillator? Die wilde ik ook graag gebruiken. Ik zet in de config van IC-prog de interne oscillator aan. Maar ik zal eens proberen met een kristal eraan, misschien scheelt dat ook voor de metingen... 
EDIT: Ik heb hem aan de praat met het Xtal! Ik ga nu ff klooien met de ADC's, hebben jullie nog tips voor me? Ik verwacht dat bovenstaande code niet volledig foutloos is.
Dank Riktw!
[Bericht gewijzigd door fritsuitoosterstreek op (29%)]
Nu is verder mijn vraag, ik krijg geen waarde op m'n scherm voor de ADC (op porta.0), hij blijft op nul staan (natuurlijk ook als ik er een spanning aanleg). Kan iemand mij uitleggen (of heeft een linkje naar een mooie tutorial) hoe ik precies met ADIN moet werken? Wat in m'n code staat heb ik rechtstreeks uit de Help van Proton...
Alvast bedankt, hopelijk zit ik al een beetje in de goede richting.
Hoezo is het raar? Als INTRCblabla geen geldige fuse is dan werkt het niet. Wat je moet doen is uitzoeken hoe de fuses heten. De fuse plugin kan dat en er zal vast wel ergens een bestandje zijn waar dat in staat.
Hoe ADIN werkt staat helemaal uitgelegd in de handleiding van picbasic. Er zal wel iets staan van ADIN [PORT]. In port geef je aan welke van de AD poorten je uit leest. Je kan natuurlijk alleen de poorten uit lezen die ingesteld zijn als analoge poort. En hoe je dat doet staat allemaal in de datasheet.
Is het ook mogelijk dat het niet werkt omdat ik alleen de AD0 poort aansluit, maar geen vref? Ik word totaal niet wijzer uit de handleiding van Proton, is er toevallig een duidelijkere papieren versie van?
Volgens mij is het niet zo simpel dat je gewoon bijvoorbeeld ADIN PORTA.0 doet want de handleiding vertelt hele andere verhalen (die ik opvolg, maar een AD-waarde van 0 tot gevolg heeft)
timmie
niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide
dit zijn mogelijkheden voor de interne oscilator:
INTRC_CLKOUT
INTRC_IO (dit is de vervanger van INTRC_OSC_NOCLKOUT)
ADIN 0 neemt een sample van AD0. ADIN 1 doet een sample van AD1. Waar AD0/1 zitten is afhankelijk van de pic, meestal op de A poorten.
Of een Vref nodig is is afhankelijk van je instellingen. Die instellingen staan in de datasheet van de pic en NIET in de handleiding van picbasic.
Bij jou programma heb je de clockbron niet opgegeven. Daarom werkt het niet. Je code ziet er goed uit, hoewel ik niet weet of adcon1 goed staat.
De clockbron heb ik nu wel opgegeven in de vorm van een 4 Mhz kristal. Het programma loopt ook prima want ik krijg gewoon op de eerste regel van het LCD "AD Waarde" en op de tweede regel de waarde "0"
Hoe kan ik vinden wat er in ADCON1 moet komen te staan? Wat er nu staat is bijna klakkeloos overgenomen uit de handleiding. Ik ga de datasheet eventjes uitpluizen kijken of ik daar wat uit kan halen...
[Bericht gewijzigd door fritsuitoosterstreek op (20%)]
High-Voltage
Het probleem bij een maatschappelijke samenleving is dat je geen "normale" uitzondering kan zijn...
De reden waarom het niet werkt (eigenlijk werkt het wel, alleen niet zoals jij wil) is simpel. Laat ik even jouw programma vertalen naar mensentaal, dan zie je direct waar je een kameel geschoten hebt.
Declareer een variabele;
Zet de instelling voor poort A en de AD converter juist;
Lees een AD waarde in en sla die op in de eerder gemaakte variabele;
Wis nu alle variabelen;
Oneindige lus
Geef de variabele weer;
/Onendige lus
Zow, daar moet het mee lukken 
Edit:
De juiste instellingen van ADCON0 en ADCON1 vind je terug in het hoofdstuk over de AD converter (datasheet). Even dat hoofdstuk doornemen zodat je weet hoe dat beest werkt. Op het einde staan dan de registers met een behoorlijke omschrijving van de verschillende bits.
[Bericht gewijzigd door High-Voltage op (23%)]
Ik zie het nu ook! Dankjewel... eigenlijk wel een beetje een inkoppertje... maarja, ik ben nu weer wat verder, ik heb ook de instellingen voor ADCON1 gevonden, scheelt ook weer, want nu haalt hij de referentie van de VDD en VSS (deedtie eerst niet dus ik had geen meetwaarden).
Ik ben weer een hele stap dichterbij!
EDIT: ik krijg nu waardes van 0 tot 255 dus het is super voormekaar...
EDIT2: en nu de volgende vraag, hoe doe ik een simpele deling op deze waarde? Zo ongeveer? :
adwaarde = adin 0 / 8.54
Dat zou de deling ongeveer moeten worden...
[Bericht gewijzigd door fritsuitoosterstreek op (20%)]
Kick;
Ik heb de deling er op deze manier ingezet, maar ik krijg nogsteeds de waarden tussen 0 en 255, niet de goede uitlezing... Moet de ADIN 0 tussen haakjes ofzo?
hadv
Just find out what you like and let it kill you
Ik zou in ieder geval haakjes proberen.
Anders eerst de waarde in de variabele zetten en daarna, dus in een aparte instructie, de deling uitvoeren. variabele = variabele / getal.
High-Voltage
Het probleem bij een maatschappelijke samenleving is dat je geen "normale" uitzondering kan zijn...
Merk ook op dat je hier met een 8 bit processortje te doen hebt. Als je dus een groot getal na de komma wil, dan zal je dat bakken rekenwerk kosten. Delen door een komma getal is sowieso vragen om problemen.
Je zou met floats kunnen werken, maar ik zou eens eerst uitpluizen hoe nauwkeurig de berekening écht moet zijn.
Ik kan de deling ook anders formuleren, iets zoals *100 en dan delen door 854. Het gaat erom dat de waarde van 0-255 omgezet word in ongeveer 0-30 (volt)
Je kunt floats gebruiken maar dat vreet geheugenruimte.
Zorg voor een passende weerstandsdeler en referentie, werk intern in mV en beperk het gebruik van floats.
High-Voltage
Het probleem bij een maatschappelijke samenleving is dat je geen "normale" uitzondering kan zijn...
Inderdaad, in milivolten werken, dan kom je ruw weg met de volgende berekening: Spanning = AD_Waarde * 117.
Je schrijft dan enkel maar de tienduizend- en duizendtallen naar je display (of als je achter de komma wil werken ook nog de honderd- en tientallen eventueel).
Wil je je berkening nauwkeuriger hebben, dan moet je nog een kleine correctie bijvoegen van 5mV per acht AD stappen. Dus voor 255 moet je dan 31*5=155mV bijvoegen. Bij volledige uitlezing zit je dan op 255*117+155 = 29990mV. Lijkt me zat nauwkeurig genoeg...
Edit:
De laatste berekening is in feite al té nauwkeurig. Als je eeen 8 bit AD converter neemt heb je een 20mV per AD stap (Vref = 5V). Je hebt op zn minst een 1/6 deler nodig zodat de werkelijke fout 120mV is.
[Bericht gewijzigd door High-Voltage op (17%)]
device 16f819
CONFIG WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
xtal 4
declare adin_stime 50
dim ADC1 as float
dim Spanning as float
TRisa = %00000001
adcon1 = %10000000
clear
Delayms 500
cls
while 1 = 1
ADC1 = adin 0
Spanning = ADC1 * 117
print at 1, 1, "Spanning:"
print at 2, 1, dec spanning / 1000, " "
wend
endDit is nu m'n code. Ik krijg nu met een spanningsvariatie van 0 tot 29.6 volt (=hetzelfde als 0 tot 250 in de ADC-waarde) 3 getallen op m'n display. Respectievelijk 0.116, 0.233 en 0.350. Met andere woorden, ik begrijp d'r niks van. Hoe kan het dat hij op deze manier gaat delen, het lijkt alsof de ADC waarde nu nog maar varieert tussen de 0 en 3
. Ik heb nu wel floats erin staan, maar dat maakt niets uit. Als ze gedefineerd zijn als Word dan krijg ik hetzelfde probleem...
EDIT: ik heb als spanningsdeler een meerslagenpot erin zitten dus daarmee kan ik kalibreren...
Heeft iemand nog tips?
High-Voltage
Het probleem bij een maatschappelijke samenleving is dat je geen "normale" uitzondering kan zijn...
Vervang die eerste regel op je display eens door de rauwe AD waarde, dan weet je of die juist zit...
Dus:
print at 1,1, @ADC1En gooi die floats er maar (snel!) terug uit 
Op 14 september 2009 15:50:21 schreef fritsuitoosterstreek:
Ik heb nu wel floats erin staan, maar dat maakt niets uit. Als ze gedefineerd zijn als Word dan krijg ik hetzelfde probleem...
Je gebruikt geen floats, bespaar op je RAM.
Idd altijd kijken naar rauwe waarden.
Voordat ik deze andere waarden erin zette had ik de rauwe waardes erop geprint staan en die klopten gewoon, van 0 tot 255. Maar ik zal het nog wel eens proberen 
Frits Kieftenbelt
Ohm sweet Ohm | www.picbasic.nl
Frits, je moet die waarden niet gaan delen en zeker niet als FLOAT declareren.
Ik heb nu weinig tijd, maar kijk zelf even hoe ik het gedaan heb bij de 0...10V uitlezing van de DAC.
De spanning staat in BYTE(!) variabele 'Spanning', maar de spanning wordt tóch weergegeven met twee cijfers na de komma, zonder gebruik te maken van FLOAT.
Hieruit moet jij ook jouw info kunnen halen.
Krijg het nog niet aan de gang, niet met floats, niet met words en niet met bytes.
Maar Frits, zoals jij het doet (met kleinere delingen vermenigvuldigingen) zou dat het verschil kunnen maken? Ik ga dat even proberen 