Hallo allemaal,

Mijn eerste PIC-project is inmiddels gelukt (functiescanner voor een 6 kanaals deurzender).
Het geheel werkt op een 9 volts batterij en trekt in rust zo'n 15 mA. De oplaadbare batterij heeft een capaciteit van 150 mAh dus na 10 uur is de batterij al leeg.

Nu heb ik gelezen dat je de pic in een "sleep" toestand kan brengen waardoor hij nog maar enkele microamperes trekt. Dit zou de levenduur van de batterij aanzienlijk vergroten alvorens weer opgeladen te worden.

Mijn programma heb ik in JAL geschreven en als je daar het commando sleep geeft dan gebeurt dat ook. Echter om hem weer uit de sleep-toestand te halen heb ik er voor gekozen om RB4 als ingang te gebruiken (de enige overigens) omdat deze uitmaakt van de groep interrupt on change.

Na enig gezoek en gegoogle ben ik er wel achter dat er nog een bit of register moet worden gezet om van deze functie gebruik te kunnen maken, maar ben er nog steeds niet achter hoe ik dat in JAL moet realiseren.

Wie kan mij helpen om mijn PIC weer uit zijn slaap te halen ?

Groetjes
Ed

:'( boehoe kan nu niemand mij helpen, of is mijn vraag zo stom dat niemand wil reageren ?

Je stelt een vraag waarop je zelf al antwoord gegeven hebt, namelijk RB4 activeren. Afhankelijk van de status van RB4 deze IO poort hoog of laag maken.

Je hebt gelijk als dat het enige was, maar dat werkt dus niet. Blijkbaar moet er nog iets anders gedaan worden om de pic te vertellen dat ie ook door die verandering op RB4 wakker moet worden. Het commando SLEEP geven en daarna RB4 wijzigen is dus niet de volledige oplossing alleen weet ik niet wat het ontbrekende stukje is, alleen maar dat er een ontbrekend stukje is.

Weet jij dat misschien ?

Hij reageert alleen maar door een interrupt call op Rb4 om uit sleep te gaan niet gewoon een hoog/laag overgang

Ok, dus ik moet de pic vertellen dat ik RB4 als interrupt ga gebruiken. Hoe vertel ik hem dat ?

Na lezen, lezen en nog eens lezen van de datasheet (maar nog helemaal niet begrijpen) zal register INTCON bit 3 op 1 gezet moeten worden. INTCON bevindt zich in bank 0 op 0Bh en in bank 1 op 8Bh. Moet ie dan in bank 0, bank 1 of in beide banken gezet worden ?

Kan dit in JAL of moet ik dan een stukje assembler in mijn programma opnemen ?

Na een hoop gezoek, gelees en geexperimenteer ben ik er uiteindelijk achter hoe je in JAL de SLEEP functie kunt gebruiken en dmv verandering van een ingang RB4 t/m RB7 weer kan wakker maken. Voor diegene na mij die hier naar zoekt bij deze dan wat ik heb gevonden en misschien kan gebruiken.

Alvorens een interrupt te kunnen gebruiken dient de Global Interrupt Enable bit op 1 te worden gezet (GIE). In dit geval dient ook het RB Port Change Interupt Enable op 1 te worden gezet (RBIE). Er moet een Interupt Service Routine Procedure te worden gedeclareerd waar heen wordt gesprongen als het interrupt plaats vindt en tot slot moet daarna de RB Interrupt Flag weer op 0 te worden gezet om een volgende interrupt afhandeling mogelijk te maken (RBIF).

Het voorbeeld programmatje laat een led 10 keer knipperren als de PIC uit de SLEEP wordt gehaald.

-- --------------------------------------------------
-- Voorbeeld programma in JAL
-- om stroomverbruik te minimaliseren
-- door middel van de sleep functie
-- --------------------------------------------------
include 16f84_20
include jlib
-- --------------------------------------------------
-- pin B4 is de enige ingang
-- bij port change interrupt wordt er alleen naar
-- ingangen van B4 t/m B7 gekeken
-- met pin A0 wordt een led aangestuurd
-- --------------------------------------------------
pin_b0_direction = output
pin_b1_direction = output
pin_b2_direction = output
pin_b3_direction = output
pin_b4_direction = input
pin_b5_direction = output
pin_b6_direction = output
pin_b7_direction = output
pin_a0_direction = output
-- --------------------------------------------------
-- interrupt mogelijkheden aanzetten
-- --------------------------------------------------
intcon_gie  = high -- global interrupt enebale
intcon_rbie = high -- RB port change interrupt enable
-- --------------------------------------------------
-- hoofdprogramma
-- --------------------------------------------------
forever loop
	sleep
	end loop
-- --------------------------------------------------
-- interrupt service routine
-- --------------------------------------------------
procedure inter is
	pragma interrupt
	for 10 loop
		pin_a0 = high
		delay_500ms ( 1 )
		pin_a0 = low
		delay_500ms ( 1 )
		end loop
	intcon_rbif = low
	end procedure

Helaas in mijn speciefieke project had ik er nog niet veel aan want ik had als voeding een 9 volts batterij met een 7805 spanningsregelaar en die spanningsregelaar bleek nog de meeste energie te vreten. Dan maar 4 oplaadbare penlights (4 x 1,2V = 4,8V) dan zou het moeten lukken.