Myhayxx Postat Septembrie 6, 2014 Partajează Postat Septembrie 6, 2014 buna seara. vreau sa construiesc un programel care sa functioneze astfel: apas un buton care sa faca activa o iesire a microcontrolerului, apas acelasi buton care mai face activa o iesire dar doar pe perioada cat tin butonul apasat in tot acest timp prima iesire este activa in continuare, iar cand apas butonul a treia oara sa reseteze programul. eu am incercat ceva de genul acesta si functionea za pana la a doua apasare. mai departe nu stiu ce trebuie scris pentru a se reseta programul.. cand apas a treia oara butonul ar trebui sa reseteze programul dar nu face nimic char stare ; void main() { ADCON1 = 0x07; TRISA = 0; TRISB = 0XFF; TRISC = 0; TRISD = 0; TRISE = 0; PORTA = 0; PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0; INTCON = 0; while (1) { if (PORTB.B0) stare = 1; Delay_ms(10) ; if (PORTB.B0 && stare) { if (PORTD.B3 = 1); Delay_ms(500) ; while (1) { if (PORTB.B0) stare = 1; Delay_ms(10) ; if (PORTB.B0 && stare) { if (PORTD.B4 = 1); while (1) { if (PORTB.B0) stare = 1; else ((PORTD.B3=1)&&(PORTD.B4=0));}}}}}} Link spre comentariu
Liviu M Postat Septembrie 6, 2014 Partajează Postat Septembrie 6, 2014 while(1) e bucla infinita, odata ajuns acolo nu prea mai iesi (ma rog, cred ca se poate iesi cu break/goto, da' tu n-ai), asa ca nu ma mir ca nu merge. Incearca sa inlocuiesti while(1) cu while(oVariabilaSetataDeButoane), de exemplu. La ce e buna else ((PORTD.B3=1)&&(PORTD.B4=0)); ? Link spre comentariu
ventzel Postat Septembrie 7, 2014 Partajează Postat Septembrie 7, 2014 (editat) Fa o proba cu programu asta. Pe PORTB.B0 ai butonu, pe B1 ai prima iesire la apasarea butonului si pe B2 ai iesirea cand tii butonu apasat. La apasare lunga cand prima iesire ii activa face si a2a iesire activa si la apasare scurta aduce iesirile in 0. char stare=0, cnt_b=0, b_pr;void main(){TRISB=0b00000001; PORTB=0; while(1) { if(stare==0) { if(PORTB.B0==0) { b_pr=1; PORTB.B1=1;} else {if(b_pr==1) {b_pr=0; stare=1;} else {PORTB.B1=0; PORTB.B2=0;} } } else {PORTB.B1=1; if(PORTB.B0==0) {b_pr=1; cnt_b++; if(cnt_b>=200) {cnt_b=200; PORTB.B2=1;} } else { if((b_pr==1)&&(cnt_b<100)) {stare=0;} cnt_b=0; b_pr=0; PORTB.B2=0; } } delay_ms(2); }} Editat Septembrie 7, 2014 de ventzel Link spre comentariu
Myhayxx Postat Septembrie 7, 2014 Autor Partajează Postat Septembrie 7, 2014 Iti multumesc de ajutor dar nu functioneaza programul pe care mi l-ai scris. fara ca sa apas butonul este activa iesirea RB1. am pus un filmulet sa vezi cum se comporta programul scris de tine programul ar trebui sa funcioneze in felul urmator doar ca la a treia apasare a butonului sa se comporte ca butonul de RESET am incercat si cum mi-a explicat Liviu M dar nu am reusit Link spre comentariu
ventzel Postat Septembrie 7, 2014 Partajează Postat Septembrie 7, 2014 Pune pe switch sa ai RB0 pe pull-up sau daca vrei sa mearga cum ii acuma inlocuieste in program la fiecare if (PORTB.B0==0) cu if(PORTB.B0==1). Asta cred ca merge cum vrei. char stare=0, b_pr=0;void main(){ TRISB=0b00000001; PORTB=0; while(1) { if(stare==0) {PORTB.B1=0; PORTB.B2=0; if(PORTB.B0==0) { b_pr=1; PORTB.B1=1;} else {if(b_pr==1) {b_pr=0; stare=1;} } } else if(stare==1) {PORTB.B1=1; if(PORTB.B0==0) { b_pr=1; PORTB.B2=1; } else {PORTB.B2=0; if(b_pr==1) {b_pr=0; stare=2;} } } else {if(PORTB.B0==0) {b_pr=1; PORTB.B1=0; PORTB.B2=0;} else {if (b_pr==1) {b_pr=0; stare=0; } } } //delay_ms(2); }} Link spre comentariu
Myhayxx Postat Septembrie 7, 2014 Autor Partajează Postat Septembrie 7, 2014 ai dreptate. am modificat in soft cum mi-ai zis si functioneaza. multumesc de ajutor sunt cam incepator in ceea ce priveste programarea si de aceea nu ma prea descurc. Link spre comentariu
Vizitator iRoata Postat Septembrie 7, 2014 Partajează Postat Septembrie 7, 2014 Nu cumva utilitatea programelului ar fi pentru un sistem de inlocuire a cheii auto ? Si eu eram interesat intr-o vreme de ceva asemanator, insa facusem analogic; varianta cu MCU e mai faina. Daca e asa cum cred eu, atunci cele doua iesiri activate nu sunt suficiente, mai e necesara una care sa se activeze temporizat la 2-5s dupa a doua, adica pornirea auxiliarelor dupa ce a pornit motorul. Scuzele mele daca am fost inoportun. Link spre comentariu
Myhayxx Postat Septembrie 7, 2014 Autor Partajează Postat Septembrie 7, 2014 (editat) intr-adevar pentru asa ceva am nevoie insa nu pentru mine ci pentru un prieten. eu nu prea am incredere in montajul pe care vrea sa-l construiasca. parerea mea e ca daca e mai simplu e si mai sigur si mult mai usor de depanat plus ca intervine in instalatia electrica a masinii si ar mai fi de comentat.n-am stiut ca dupa pornirea motorului mai trebuie activat ceva, el doar atat mi-a cerut si i-am zis ca o sa-l ajut cu ce pot. Oricum i-am sugerat sa-si monteze un buton de urgenta care sa intrerupa alimentarea montajului in cazul in care stiu eu din ce motive ar putea ca programul scris in microcontroler sa o ia razna.. din curiozitate pentru cunostintele mele despre ce auxiliare este vorba dupa pornirea motorului..asa functioneaza sistemul la toate automobilele sau doar la cele mai noi? Editat Septembrie 7, 2014 de Myhayxx Link spre comentariu
Vizitator iRoata Postat Septembrie 7, 2014 Partajează Postat Septembrie 7, 2014 La toate automobilele e vorba de auxiliare, insa doar la astea noi sunt temporizate; auxiliarele sunt, spre exemplu, luminile, stergatoarele, instalatia audio, etc; toate se conecteaza cand pui contactul, dar se deconecteaza pe durata pornirii motorului pentru a se reconecta dupa ce acesta din urma a pornit; aici intervine si temporizarea respectiva, dupa ce motorul a pornit asteapta cca. 2s apoi reconecteaza consumatorii. Mai fiabil ar fi analogic, cu un buton cu doua pozitii si relee; exista ceva switch-uri rotative care corespund acestei aplicatii. Chinezii fac o chestie similara care corespunde cerintelor tale, insa nu stiu cat e de fiabila.... Link spre comentariu
ventzel Postat Septembrie 7, 2014 Partajează Postat Septembrie 7, 2014 (editat) Era bine sa zici de la inceput ce vrei sa faci cu butonu :P Cred ca pentru asta nu-i nevoie de 16F877, ii suficient un 12F629 sau chiar mai putin. Am facut cateva modificari dupa urmatoarea logica: 1-apesi butonu si ai alimentare principala si auxiliar 2-apesi butonu se intrerupe auxiliaru. Daca tii butonu in continuare apasat minim 200ms ai comanda pe electromotor + alimentarea principala 3-daca apasarea butonului ii mai scurta de 200ms se opreste tot si revine in starea initiala 4-daca continui sa tii butonu apasat mai mult de 10s se opreste tot si revine in starea initiala dupa ce butonu ii eliberat. 5-dupa eliberarea butonului in 3 secunde recupleaza auxiliaru. 6-daca apesi butonu iara opreste tot si revine in starea initiala. Schema si programu is in arhiva. Faceti o proba si sa nu-mi ziceti pe urma daca il folositi ca ati lasat masina in viteza si o pornit singura O protectie hardware ar fi si alimentarea releului care comanda electromotoru de pe iesirea releului care comanda alimentarea generala. cheie 1.zip PS: versiunea pentru 877 postata de mine initial are o gresala la prima apasare si oscileaza iesirea cat timp butonu ii apasat. Editat Septembrie 7, 2014 de ventzel Link spre comentariu
Vizitator iRoata Postat Septembrie 8, 2014 Partajează Postat Septembrie 8, 2014 @venzel: ai putea sa pui schema intr-un format accesibil ? (de ex. pdf, jpg, png) Multumesc ! Link spre comentariu
ventzel Postat Septembrie 8, 2014 Partajează Postat Septembrie 8, 2014 Schema completa cu partea de alimentare si iesiri pe relee nu am desenat inca da cam asta ii partea principala din simularea in Proteus: Link spre comentariu
Vizitator iRoata Postat Septembrie 8, 2014 Partajează Postat Septembrie 8, 2014 Multam fain ! Am sa incerc si eu sa o fac, sa vedem ce iese; oricum, in principiu e mai tentant decat analogic, iar o protectie hardware nu e greu de conceput. Link spre comentariu
ventzel Postat Septembrie 8, 2014 Partajează Postat Septembrie 8, 2014 Ar fi bine sa incerci inainte simularea in Proteus sa vezi ce face. Schema ar mai putea fi completata cu o conditionare venita de pe cutia de viteze daca ar exista contact de punct mort sau eventual de pe inchiderea centralizata sa actioneze electromotoru numa cand nu-i armata alarma. De pe immobilizer nu cred ca se poate conditiona ceva ca din ce stiu io ii activat numa in momentu cand pui contactu. Voi ce ati considera mai simplu/fiabil? Link spre comentariu
Vizitator iRoata Postat Septembrie 8, 2014 Partajează Postat Septembrie 8, 2014 Hmmm... eu ma gandisem la o altefle de conditionare ... Ceva cu un tag RF (modulele acelea au iesire I/O) sau, mai simplu, cu un card ce poate actiona un SW. Chestia cu immo e cam complexa, plus ca acolo sunt iesiri supravegheate, deci daca faci interventii aiurea se poate sa ai necazuri. Apoi mai era cu centralizata, numai ca... ce te faci daca esti in trafic/la semafor/in parcare/etc si vrei sa pornesti motorul cu usile incuiate ? (pe centralele cu alarma din comert nu exista iesire I/O libera si accesibila, doar pe cele scumpe, iar acelea au deja implementata functia de pornire de la distanta). Pe de alta parte, exista cititorul electronic de cheie aflat in contact, e suficient sa scoti chipul din cheie si sa faci un tag, dupa ce ai asezat bobina cititorului intr-un loc convenabil; in acest caz, masina porneste din buton dar daca nu are tag-ul in raza de citire a bobinei se opreste dupa un timp prestabilit sau (la cele mai vechi) nu porneste deloc motorul. 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