Sari la conținut
ELFORUM - Forumul electronistilor

2 programe diferite intr-un PIC


Craciun

Postări Recomandate

Ma intereseaza principial posibilitatea stocarii si rularii a 2 programe independente intr-un PIC. Aceste programe se presupun gata facute si sa fie pornite si executate independent, in urma actionarii unor butoane. Mai pe scurt am un program de capacimetru si caut sa rulez separat un program de frecventmetru. Cum pot face cel mai usor ? Multumesc ! Daniel

Link spre comentariu
  • Răspunsuri 23
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Craciun

    9

  • one

    4

  • lucicop

    4

  • vsurducan

    2

Top autori în acest subiect

Vizitator DragosP

Cum pot face cel mai usor ? Multumesc ! Daniel

Vrei să ruleze independent în acelaşi timp? :rolleyes: Adică multitasking, sau independent: odată unul altă dată altul?1. Multitasking: trebuie să "jonglezi" cu resursele interne hardware ale mc-ului. Destul de greu, dar se poate...2. Odată unul alteori altul: o intrare de selecţie (masă capacimetru, plus frecvenţmetru, de ex). Sau, configurare pe serială.La reset, faci ceva gen bootstrap unde citeşti intrarea (digitală sau serială) şi rulezi secvenţa de cod corespunzătoare. Aşa, practic o să ai 2+1 programe. :yawinkle:
Link spre comentariu

Vreau sa ruleze cand unul cand celalalt, nu simultan. Deci inteleg ca ar trebui un al treilea program de decizie (care zice care din cele 2 sa ruleze) , dar cum fac ca sa stochez astea 3 programe in PIC, fara sa se suprapuna? Adica voi avea 3 hexuri sau cum ?

Link spre comentariu

Nu merge asa. Trebuie sa ai sursele la cele 2 programe si sa faci modificarile necesare pentru a rula un program sau altul la apasarea sau nu, a unui buton. Nu poti utiliza nici macar alternativ, 2 programe care au fost compilate pentru a rula de la adresa 0000h a memoriei.Deci daca ai numai hexurile, uita de treaba asta !Don Mario

Link spre comentariu

Vreau sa ruleze cand unul cand celalalt, nu simultan. Deci inteleg ca ar trebui un al treilea program de decizie (care zice care din cele 2 sa ruleze) , dar cum fac ca sa stochez astea 3 programe in PIC, fara sa se suprapuna? Adica voi avea 3 hexuri sau cum ?

Fila *.hex este rezultatul procesului de compilare a unei file *.asm (generate de asamblor) sau rezultatul unei compilari cu un compilator de nivel inalt (C, pascal, basic, forth etc). Fila *.hex este un tot unitar care tine cont de hardware in mod intim.Pentru a inscrie trei file *.hex in mod *succesiv* intr-un PIC exista metoda clasic a programarii ICSP sau a bootloaderului (initial se incarca un program de boot care este tot o fila *.hex cu ajutorul unui programator ICSP dupa care pe interfata seriala se incarca programul utilizator ori de cate ori este necesar utilizand un software de comunicatie pe PC)Schimband programul utilizator se poate schimba functionalitatea aparatului continand microcontrolerul (cu conditia ca filele *.hex sa fie rezultatul unei compilari a unui program sursa corect, scris in concordanta cu schema hardware.Este putin probabil sa reusiti sa faceti un capacimetru si un frecventmetru avand acces doar la filele *.hex. Uzual aveti nevoie de filele sursa unde sa operati modificarile necesare pentru a putea schimba functionalitatea ansamblului prin apasarea unui buton de exmplu.Apasand butonul o data, aparatul devine frecventmetru (semnalizare cu un LED bicolor rosu), apasand a doua oara butonul, aparatul devine capacimetru (semnalizare led verde) apasand a treia oara butonul, aparatul devine voltmetru (semnalizare rosu+verde).Daca nu aveti experienta necesara unei astfel de programari este mai simplu sa cautati pe web un "multimetru" cu PIC care contine de obicei cel putin functiile de frecventmetru si voltmetru (mai rar capacimetru)sau L/C metru + frecventmetru.Un exemplu in sprijinul afirmatiilor de mai sus:http://members.cox.net/berniekm/super.htmlhttp://www.qsl.net/la9sja/electronics/ea/cele bune,Vasile
Link spre comentariu

Bun, daca utilizez bootloaderul si am si sursele la cele 2 programe , cum fac ca nu vreau sa le incarce de pe calculator pe seriala as vrea ca aparatul sa fie "stand alone". Deci mai concret : pot stoca cele 2 programe in portiuni separate din memoria program a PIC-ului si apoi prin intermediul bootloaderului sa dictez ca sa ruleze unul sau celalalt? Sau totul se va reduce la un singur program cu 2 ramuri decizionale?

Link spre comentariu

Dupa umila mea parere: te complici daca vrei sa faci 2 programe separate. Poti face in felul urmator:Stochezi tipul deviceului la o adresa in EEPROMProgramul porneste si in functie de tip, apeleaza o anumita functie (sau sare la o anumita adresa, daca scrii codul tau in ASM)La o apasare de buton, care schimba tipul deviceului, salvezi corespunzator tipul in EEPROM si restartezi softul.

Link spre comentariu

daca ai sursele programelor merge faci asa compilezi primul program la adresa 0x0100al doilea unde se termina primulsi faci um program mic la adresa 0x0000 care teseteaza un buton sau pinsi in functie de el pleaca primul sau al doilea programdaca are intreruperi este putin mai delicat dar merge

Link spre comentariu

Dar programul mic care testeaza pinul nu va rula decat la inceput, apoi vor rula celelalte. Ce zici tu, inseamna multitasking. De ce atata complicare ? Daca ai sursele, le compilezi cum vrei tu.

Link spre comentariu

Merci @sofian , si cum fac sa compilez programele zicandu-le sa inceapa de la adresele specificate (ca in Mplab n-am folosit pana acum decat "quick building" la compilare si ala nu imi lasa loc de intors)?

Link spre comentariu

deci in fiecare program asm este directiva org 0x0000 care ii spune de unde incepe sa compileze, in alte programe nu stiu (C+,basic)deci atentie sa nu aiba org 0x0004 sau si mai rau sa nu fie specificata adresa asta explicit aici este adresa de intruperi a picului

Link spre comentariu

Dupa umila mea parere: te complici daca vrei sa faci 2 programe separate. Poti face in felul urmator:Stochezi tipul deviceului la o adresa in EEPROMProgramul porneste si in functie de tip, apeleaza o anumita functie (sau sare la o anumita adresa, daca scrii codul tau in ASM)La o apasare de buton, care schimba tipul deviceului, salvezi corespunzator tipul in EEPROM si restartezi softul.

De acord, ar avea avantajul ca la oprirea alimentarii programul porneste cu ultima variabila memorata in eeprom (adica cu ultima functie utilizata de aparat).Utilizarea directivei ORG si "amestecarea" a doua surse separate poate crea o gramada de probleme. Prima este intreruperea, daca una din surse apeleaza intreruperea iar cealalta nu, mai sunt ceva sanse (mici).A doua este pagina de memorie (la PIC16) la care se poate ajunge prin cocatenarea a doua surse. Un salt intr-o pagina gresita duce tot programul in balarii. Probabil ca va fi nevoie de debugging...Asta este singurul motiv pentru care un compilator de nivel inalt te scuteste de batai de cap (comparativ cu asamblorul) si iti creaza alte batai de cap... ca de exemplu rescrierea intregului program daca nu-l ai 'de model' decat in asm.cele bune,Vasile
Link spre comentariu
  • 1 lună mai târziu...

Trebuie ca la inceput sa ii dau org 0 si apoi un go to intr-un mic programel, in fct de starea butonului sa sara la programul prinicipal, cel putin asa am inteles. Dar intreb "offtopic": daca compilez programul initial la o adresa superioara lui 0x100 sa zicem (fara bootloader), mai ruleaza programul sau trebuie neaparat de la 0 ?

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