Sari la conținut
ELFORUM - Forumul electronistilor

programare pic 16f877a


Postări Recomandate

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
  • Răspunsuri 19
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

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

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 de ventzel
Link spre comentariu

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

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
Vizitator iRoata

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

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 de Myhayxx
Link spre comentariu
Vizitator iRoata

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

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 :d

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 de ventzel
Link spre comentariu

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

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări