Hallo.
Hulp nodig.
Ik probeer al een aantal dagen pic 16f877a te laten ontwaken via adc.
Maar krijg het niet voor elkaar.
Gebruik mikro basic pro.
program ontwaak_slaap
dim i as byte
temp as word
main:
cmcon = %00000111
adcon1 = %00001110
adc_init()
trisa = %00000001
trisb = %00000000
porta = %00000000
portb = %00010000
i = 0
begin:
while true
temp = adc_read(0)
if temp > 512 then
portb = %00000010
else portb = %00000001
end if
if temp > 1000 then
goto slaap
end if
wend
slaap:
portb = %00000100
asm
sleep
end asm
portb = %00000000
delay_ms(1000)
goto begin
end.nu is het zo dat je een functie hebt om je adc te lezen.
ADC_read()
Maar volgens data sheet, moet ik dit uit voeren.
The A/D module can operate during Sleep mode. This
requires that the A/D clock source be set to RC
(ADCS1:ADCS0 = 11). When the RC clock source is
selected, the A/D module waits one instruction cycle
before starting the conversion. This allows the SLEEP
instruction to be executed which eliminates all digital
switching noise from the conversion. When the conversion
is completed, the GO/DONE bit will be cleared and
the result loaded into the ADRES register. If the A/D
interrupt is enabled, the device will wake-up from
Sleep. If the A/D interrupt is not enabled, the A/D module
will then be turned off, although the ADON bit will
remain set.
When the A/D clock source is another clock option (not
RC), a SLEEP instruction will cause the present conversion
to be aborted and the A/D module to be turned off,
though the ADON bit will remain set.
Turning off the A/D places the A/D module in its lowest
current consumption state.
Maar krijg het niet voor elkaar.
Graag wat hulp hierbij.
Fuzzbass
Mijn echte naam: Joris | Mijn elektronica website: Fuzzcraft.com
Nou het gaat erom dat als de pic in sleep gaat,
de pic ook weer wakker moet worden.
dit wil ik via adc doen.
volgens data sheet kan dit ook.
Maar in de librarie van mikro basic pro.
gebruik je adc_read() om je porta uit te lezen.
Als ik nu naar de data sheet kijk dan moet ik gelijk
na het het setten van de go/done bit
naar sleep gaan om weer te kunnen ontwaken.
Maar nu ga ik er van uit dat in de adc_read() al de
go/done verwerkt zit.
dus denk ik dat het niet gaat werken.
of zie ik het verkeert.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Je kunt gewoon de AD registers direct uitlezen, stelt niet echt veel voor.
Het is gebruikelijker om een timer interrupt te gebruiken voor A/D. (Je wilt tenslotte meestal toch samplen op een vaste sample frequentie)
Maar als je wilt kun je inderdaad het GO bit gebruiken voor interrupt. Of een sleep dan nog zin heeft is de vraag, omdat de MCU meestal wakker zal zijn om de A/D te verwerken...
In de datasheet staat hoe je de A/D converter rechtstreeks kunt benaderen...
ik had er verder geen bedoeling bij.
Maar zat even de wake-up functies te proberen.
had al het een en ander geprobeert
wake-up bij timer.
wake-up bij pin verandering.(portB)
maar blijf dus nu hangen bij wake-up via adc.
hoop vanavond nog even wat te proberen.
wil deze code proberen.
program MyProject
dim temp as word
main:
Trisa = %00000001
porta = %00000001
trisb = %00000000
portb = %00000000
begin:
while true
adcon1 = %10000000
adcon0 = %11000001
pir1.6 = 1
pie1.6 = 1
intcon.6 = 1
intcon.7 = 1
adcon0.2 = 1
delay_ms(20)
if adcon0.2 = 1then
goto slaap
end if
wend
slaap:
portb = %00000010
asm
sleep
end asm
temp = adc_read(0)
pir1.6 = 1
portb = %00000000
goto begin
end.Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Dit wordt nooit uitgevoerd, na 20mS is de A/D conversie al heeeel lang klaar...
if adcon0.2 = 1 then
goto slaap
end if
Verder is het handiger de bitnamen ipv de bitnummers te gebruiken, dan weet je ook wat er gebeurt (ADCON0.2 kent geen mens, terwijl ADCON0.GO direct duidelijk is)
Verder is het handiger de bitnamen ipv de bitnummers te gebruiken, dan weet je ook wat er gebeurt (ADCON0.2 kent geen mens, terwijl ADCON0.GO direct duidelijk is)
Ja, dat doe ik ook normaal
Maar had ergens gelezen dat ADCON0.GO niet herkent word door
mikro basic pro.
Vandaar dat ik even over gestapt ben op nummers voor de zekerheid.
Ik zal die delay maar weg halen dan?
Oh ja.
wat ik nog niet snap is hoe ontwaakt hij nu.
Komt het door een verandering van je input.
of als de conversie klaar is.
code aan gepast
program MyProject
dim temp as word
main:
Trisa = %00000001
porta = %00000001
trisb = %00000000
portb = %00000000
begin:
while true
ADCON1 = %10000000
ADCON0 = %11000001
PIR1.ADIF = 1
pie1.ADIE = 1
INTCON.PEIE = 1
INTCON.GIE = 1
ADCON0.GO = 1
if ADCON0.GO = 1 then
goto slaap
end if
wend
slaap:
portb = %00000010
asm
sleep
end asm
temp = adc_read(0)
PIR1.ADIF = 1
portb = %00000000
goto begin
end.Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Als de ADIF flag geset wordt.
Met sleep wordt dat eigenlijk nooit gebruikt voor A/D, wel in de interrupt routine.
Je moet trouwens wel de INTCON.GIE op 0 zetten, anders valt 'ie nooit in slaap...
[Bericht gewijzigd door Arco op (27%)]
Hallo.
Deze code gaat niet lukken.
De pic gaat niet in sleep.
Ook niet als ik de intcon.gie op 0 zet.
mocht iemand nog goede ideeen hebben!!
Ga van het weekend weer even verder zoeken.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
ja denk ook dat, dat het is
Want ik zie portb heel even op lichten.
Is er ook een manier om het langer te laten duren.
De sleep periode dan.
Of is het zo dat als de input porta.0
0 of 5 vdc is hij wel langer in sleep blijft.
dacht zoiets gelezen te hebben.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Ik geloof dat RB0 daarvoor gebruikt kan worden. De SLEEP wordt bij A/D alleen gebruikt om een storingsvrije A/D meting te krijgen. (De meeste digitale boel staat dan uit)
Zo gauw A/D conversie klaar is, wordt sleep weer verlaten, dus maar heel kort.
Met RB0 kun je in SLEEP blijven tot de pin van toestand verandert. (Wel INTCON.INTE op 1 zetten)
Ja, wat betreft interupt on pin change.
Ben ik wel van op de hoogte.
Ga me er nog wel even in verdiepen van het weekend.
(wat betreft sleep en adc)
wil het nu ook weten ook hoe het allemaal precies werkt.
In ieder geval bedankt tot dus ver.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Interrupt on pin change is weer wat anders, die zitten op RB4...RB7.
Of je die ook met SLEEP kunt gebruiken weet ik niet zeker, RB0 is de normale externe interrupt pin.