fratello Postat Septembrie 10, 2020 Partajează Postat Septembrie 10, 2020 Va salut ! Intrucat ambele dozatoare de sapun lichid din dotare au cedat inexplicabil si incercarile de reparare nu au dat rezultat, m-am gandit sa-mi fac propria schema, cu PIC 12F675. Schema e simpla , dar nu reusesc sa implementez corect functia SLEEP, a.i. PIC-ul sa aiba consum minim posibil in perioada de repaus ... Atasez codul (scris in PicBasic Pro) poate cineva cu cunostinte mai bune decat ale mele (care sunt, din pacate, sumare :( ) ma poate indrepta in directia corecta. Va multumesc anticipat ! @ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_ON DEFINE OSCCAL_1K 1 DEFINE OSC 4 CMCON = 7 TRISIO = %00011000 GPIO = %00000000 IOC = %00010000 INTCON = %00001000 OPTION_REG = 0 WPU = %00100110 VRCON = 0 ANSEL = %00111000 ADCON0 = %10001101 DataW var word last_b_level var byte b_level var byte b_cnt var byte b_act var byte wakeup var gpio.4 Clear GPIO.0 = 0 Pauseus 100 ' Wait for channel to setup ;============================================================================ Main: INTCON.0 = 0 ADCON0.1 = 1 ' Start conversion While ADCON0.1=1:Wend ' Wait for conversion DataW.HighByte=ADRESH ' Read variable from ADC and save DataW.LowByte=ADRESL if DataW < 600 then b_level=1 if b_level=last_b_level then b_cnt=b_cnt+1 pauseus 50 if b_cnt > 10 then b_act = 1 'TO AVOID FALSE READING endif last_b_level=b_level endif if b_act = 1 then GPIO.0 = 1 PAUSE 4000 GPIO.0 = 0 b_act=0 last_b_level=0 b_cnt=0 ENDIF @ SLEEP PAUSE 100 goto main Nota : am incercat n-variante pe langa aceasta, dar fara rezultatul scontat... Link spre comentariu
Bandi Szasz Postat Septembrie 10, 2020 Partajează Postat Septembrie 10, 2020 Salut, Nu prea le am cu Basic-ul penrtu ca eu folosesc mikroC insa in sleep se intra cu o comanda asm si anume 'sleep', poti incerca asa: asm sleep end asm Mai precis ce se intampla in cazul tau ? Pentru a obtine cel mai mic consum trebuie oprite si perifericele folosite cum ar fi ADC-ul altfel aceste periferice raman pornite chiar si cu CPU in sleep si vor consuma. Link spre comentariu
UDAR Postat Septembrie 10, 2020 Partajează Postat Septembrie 10, 2020 Nu știu dacă asta e cauza dar în datasheet scrie că înainte de a șterge GPIF trebuie citit (sau scris ) GPIO Link spre comentariu
fratello Postat Septembrie 10, 2020 Autor Partajează Postat Septembrie 10, 2020 Multumesc pentru raspuns. Comanda este corecta. @ Sleep Problema este ca, oricum (oriunde in program) as introduce aceasta comanda, PIC-ul nu mai executa nimic ! Am folosit cu succes comanda intr-un montaj cu PIC16F1827, dar in acest -atat de simplu- montaj nu functioneaza. Link spre comentariu
Voltus Postat Septembrie 10, 2020 Partajează Postat Septembrie 10, 2020 Cand uC intra in sleep el va fi trezit de WatchDog timer pe care l-ai dezactivat . Link spre comentariu
UDAR Postat Septembrie 10, 2020 Partajează Postat Septembrie 10, 2020 Păi în cazul ăsta s-ar putea să fie ce am zis - practic nu mai iese din SLEEP pentru că GPIF nu este șters. Nu vreau să insist dar merită să încerci , înainte de INTCON.0 = 0 scrie ceva de genul orice = GPIO Link spre comentariu
fratello Postat Septembrie 10, 2020 Autor Partajează Postat Septembrie 10, 2020 WDT trebuie OFF cand se foloseste functia Sleep ! Cel putin asa se afirma pe forumul dedicat .... Link spre comentariu
bercioiu Postat Septembrie 10, 2020 Partajează Postat Septembrie 10, 2020 Parca si intreruperea pe pin il trezeste, eu imi aduc aminte ca facusem o telecomanda si dupa ce trimiteam comanda, intra in sleep, iar penru a-l "trezi", foloseam IOC. Link spre comentariu
Bandi Szasz Postat Septembrie 10, 2020 Partajează Postat Septembrie 10, 2020 Este corect ce zice UDAR, flag-ul de IOC (in cazul de fata GPIF ) trebuie sters inainte si dupa ce iese din sleep. Daca te ajuta o bucatica de cod de la mine care foloseste sleep: void main() { OSCCON = 0x72; OPTION_REG.F7 = 0; TRISA = 0x8; ANSELA = 0x00; TRISC = 0x36; ANSELC = 0x00; LATA = 0x00; PORTC = 0x00; WPUC = 0x16; WPUA = 0x8; RF_Init(); IOCCN = 0x16; INTCON.F3 = 1; INTCON.F7 = 0; while(1) { _asm sleep; IOCCF = 0; INTCON.F0 = 0; if (Button(&PORTC, 1, 1, 0)) { LED_STATUS = 1; RFM69_Send(BTN1_CODE_H, BTN1_CODE_L); } else if (Button(&PORTC, 2, 1, 0)) { LED_STATUS = 1; RFM69_Send(BTN2_CODE_H, BTN2_CODE_L); } else if (Button(&PORTC, 4, 1, 0)) { LED_STATUS = 1; RFM69_Send(BTN3_CODE_H, BTN3_CODE_L); } LED_STATUS = 0; } } Link spre comentariu
fratello Postat Septembrie 10, 2020 Autor Partajează Postat Septembrie 10, 2020 "A/D Operation During SLEEP The A/D converter module can operate during SLEEP. This requires the A/D clock source to be set to the internal RC oscillator. When the RC clock source is selected, the A/D waits one instruction before starting the conversion. This allows the SLEEP instruction to be executed, thus eliminating much of the switching noise from the conversion. When the conversion is complete, the GO/DONE bit is cleared, and the result is loaded into the ADRESH:ADRESL registers. If the A/D interrupt is enabled, the device awakens from SLEEP. If the A/D interrupt is not enabled, the A/D module is turned off, although the ADON bit remains set." Cum aplic asta in practica ??? Link spre comentariu
Bandi Szasz Postat Septembrie 10, 2020 Partajează Postat Septembrie 10, 2020 (editat) Pai cum scrie acolo si anume, prin "ANSEL" selectez oscilatorul dedicat adica "FRC" prin bitii 4-6 dupa care dai drumu la intreruperea A/D prin "PIE1" bit 6. Dupa care dai drumu la conversie prin "ADCON0.1 = 1" iar in loc de "While ADCON0.1=1:Wend" inserezi un Sleep, PIC-ul va sta in sleep pana cand se termina conversia A/D iar cand acesta se termina PIC-ul va fi trezit de intreruperea A/D si vei putea citii rezulatul. Daca vrei acest lucru strict pentru reducerea de consum mare chestie nu faci, conversia A/D nu dureaza foarte mult si PIC-ul oricum nu iese din sleep instant ci are nevoie de un anumit timp pana reporneste oscilatorul principal si alte chestii... foarte multa economie nu faci PIC-ul nu consuma exagerat de mult poate 1-2mA in rest tine foarte mult de hardware (exclus regulatoare generice gen 7805 si cele similare). Mai exact ce anume detecteaza ADC-ul ? Poate ai putea scapa de ADC cu un op-amp low-power (consum de cateva nA) prin care poti decide daca vrei sa trezesti PIC-ul sau nu, la intrare poti pune un filtru R/C sa elimini zgmotul introdus de senzor. Editat Septembrie 10, 2020 de Bandi Szasz Link spre comentariu
fratello Postat Septembrie 11, 2020 Autor Partajează Postat Septembrie 11, 2020 (editat) Multumesc. ADC-ul trebuie sa detecteze intreruperea razei incidente IR pe fotodioda. M-am gandit ca e mai simplu asa, dar sunt deschis si la alte sugestii... LE : Am gasit o schema cu op-amp, dedicata scopului ... Editat Septembrie 11, 2020 de fratello Link spre comentariu
Bandi Szasz Postat Septembrie 11, 2020 Partajează Postat Septembrie 11, 2020 (editat) Daca esti dispus la alte circuite hai sa o luam pas cu pas: 1. Pentru alimentare ce folosesti si cam ce durata de viata ti-ar placea sa obtii ? 2. Pragul de detectie este fixa ? (din cod vad ca comaparai cu 600 adc), pentru nu cred ca merita pus PIC doar pentru ADC cu prag fix cel putin nu daca vrei sa obtii un consum cat de mic. Schema gasita pare ok, se pot face diferite inbunatatiri, MCP6001 are consum de 100uA pe cand un AZV331 are consum de 40uA (cu 50% mai mic). AZV331 are un Input Bias Current de 10nA pe cand tu pe acel potentiometru de 10k la o alimentare de 5V risipesti 0.5mA deci ai putea schimba acel potentiometru cu unu-l mult mai mare pentru a reduce cat mai mult pierderile. Editat Septembrie 11, 2020 de Bandi Szasz Link spre comentariu
fratello Postat Septembrie 11, 2020 Autor Partajează Postat Septembrie 11, 2020 (editat) Multumesc mult pentru suport !!! 1. Alimentare : 4,5 sau 6 volti, din baterii alcaline. Pot folosi doar 3 baterii, pentru a ma incadra in tensiunea acceptata de AZW331. AZW331 e perfect, vad ca e disponibil la tme. Pot folosi schema din catalog ? 2. Pragul de detectie ... este necunoscut : voi folosi hardware-ul existent in actualul dozator ( emitator/receptor IR). IMPORTANT ! Din cauza configuratiei existente, actionarea pompei trebuie sa se faca LA INTRERUPEREA razei IR incidenta pe senzor. Scuze ca deviem de la caracterul topicului ... daca se considera necesar, se poate muta topicul. Multumesc. Editat Septembrie 11, 2020 de fratello Link spre comentariu
nico_2010 Postat Septembrie 11, 2020 Partajează Postat Septembrie 11, 2020 (editat) Interesant subiectul, mai ales ca am si eu un dozator care nu mai functioneaza. Astept cu nerabdare rezultatul final. Fratello, ai ridicat schema electronica? Te-ai lamurit ce este integratul SO-8, ca eu nu am reusit (ar trebui sa-l dezlipesc, insa nu am timp de niciun fel) Editat Septembrie 11, 2020 de nico_2010 Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum