Sari la conținut
ELFORUM - Forumul electronistilor

probleme program


wwwglro

Postări Recomandate

Se da un pic 12f629, 2 butoane, 2 leduri.Atat timp cat tin apasat primul buton se aprind ambele leduri. Daca in acest timp apas butonul 2, ledul nr 2 se stinge pentru 10 secunde. Daca eliberez ledul 1, se sting ambele leduri.Programul l-am facut in ccs.Problema este ca atunci cand fac temporizarea respectiva de 10 secunde, se singe ledul 2 dar se mai reaprinde foarte scurt din cand in cand si nu stiu de ce...Am facut fizic montajul iar ledul 2 se aprinde la o intensitate foarte scazuta numai ca in loc de led 2 tre sa pun un buzer si acesta pacane in temporizare, altfel nu ar fi probleme.programul este urmatorul:#include <12f629.h>#FUSES NOWDT,INTRC_IO, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOCPD//for 16f628long bec0=0; // variabila tasta0long bec1=0; // variabila tasta1long intr=0; // intreruperi sistemlong sec=0; // timer sistem in secundeint8 flag0=0; // variabila led0int8 flag4=0; // variabila led1 (buzer)int8 flag4_temp=0; // disable temporizare#int_rtccvoid clock_isr(){ intr++; if (intr>250) //intreruperi sistem contorizare secunde { sec++; intr=0; }//////////////////////////////////////////////////////////////////////////////// if (INPUT(PIN_A0)==0) //daca se apasa tasta 0 se incrementeaza o variabila { bec0++; } if (INPUT(PIN_A1)==0) //daca se apasa tasta 1 se incrementeaza alta variabila { bec1++; }//////////////////////////////////////////////////////////////////////////////////pin 0 if (bec0>4) //dupa 5 intreruperi (20ms) se considera ca tasta0 este sigur apasata { flag0=1; //aprinde ledul 0 flag4=1; //aprinde ledul 4 (buzer) }//pin1(buzer) if (bec1>4 && bec0>4) //dupa 5 intreruperi (20ms) se considera ca tast10 este sigur apasata { flag4_temp=1; //activeaza temporizarea sec=0; flag4=0; }//////////////////////////// if (!INPUT(PIN_A0)==0 && bec0>5) //tasta nu este apasata la bec0=6 { flag0=0; //stinge ledul 0 flag4=0; //stinge ledul 4 (buzer) bec0=0; //se reseteaza flagul de apasare tasta0 sec=0; flag4_temp=0; //se reseteaza flagul de temporizare }///////////////////////////// if (!INPUT(PIN_A1)==0 && bec1>5) //tasta nu este apasata la bec1=6 { bec1=0; //se reseteaza flagul de apasare tasta1 flag4=0; //se stinge ledul 1 }///////////////////////////////////////////////////////////////////////////////}void main(){ set_tris_a(0b000000011); //GP0, GP1 intrare GP2:GP5 iesiri setup_comparator (NC_NC_NC_NC); set_rtcc(6); //initializare counter 0-255 ==> 6-255==> 0-250 o intrerupere la 4 ms setup_counters( RTCC_INTERNAL, RTCC_DIV_16 | RTCC_8_BIT); enable_interrupts (INT_RTCC); enable_interrupts(GLOBAL); do {/////////////////////////////////////////////////// if(flag0==0) // stingere led0 output_low(PIN_A5); if(flag0==1) // aprindere led1 output_high(PIN_A5);////////////////////////////////////////////////// if(flag4==0) output_low(PIN_A4);///////////////////////////////////////////////// if(flag4_temp==1) { if (sec>10) flag4=1; else flag4=0; }///////////////////////////////////////////////// if(flag4==1) output_high(PIN_A4);//////////////////////////////////////////////////////////////////////////////// } while(1);}

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

Top autori în acest subiect

  • wwwglro

    10

  • puiu

    10

  • Liviu M

    7

Top autori în acest subiect

Vizitator Iuliu79

Nu stiu in programu asta daca il faceai in Mplab te puteam ajuta.descrie exact ce vrei sa faca microcontrolerul?!! :smt103: :smt103:

Link spre comentariu

Se da un pic 12f629, 2 butoane, 2 leduri.Atat timp cat tin apasat primul buton se aprind ambele leduri. Daca in acest timp apas butonul 2, ledul nr 2 se stinge pentru 10 secunde. Daca eliberez ledul 1, se sting ambele leduri.Programul l-am facut in ccs.Problema este ca atunci cand fac temporizarea respectiva de 10 secunde, se singe ledul 2 dar se mai reaprinde foarte scurt din cand in cand si nu stiu de ce...Am facut fizic montajul iar ledul 2 se aprinde la o intensitate foarte scazuta numai ca in loc de led 2 tre sa pun un buzer si acesta pacane in temporizare, altfel nu ar fi probleme.

1. Aici cred ca este ce vrea sa faca microcontrolerul.2. Asteptam sa-si dea cu parerea cineva care a lucrat in ccs. Din pacate eu lucrez in asm sub MPLAB si nu prea pot sa te ajut, dar fenomenul care apare s-ar putea sa provina de la faptul ca lucrezi direct cu iesirile si nu ai variabile interne care pe timpul programului pot sa-si schimbe valoarea (Cred ca si la tine apare acest lucru).
Link spre comentariu

off-topic

daca il faceai in Mplab te puteam ajuta

MPLAB e numai o interfata frumoasa si usor de utilizat intre compilator/asamblor si utilizator. In mplab NU se fac programe.Daca vrei sa-l ajuti din mplab, instaleaza-ti compilatorul ccs, activeaza-l in mplab ca scula de compilare a proiectului si gata, il ai si tu in mplab.on-topic: Dupa parerea mea, se intampla din cauza modului asincron intre functionarea normala si tratarea intreruperilor. Adica daca intreruperea vine exact dupa if(flag4_temp) si inainte de if(flag4), se poate intampla ca in intrerupere sa-ti setezi la loc proaspatul resetat flag4. Sau? :nas: Eu as lasa in isr numai socotitul secundelor, iar diversele prelucrari (inclusiv cele din main) le-as face numai cand vine o secunda noua si pe toate in main. In felul asta as "sincroniza" putin prelucrarile cu secundele.
Link spre comentariu

Nu pot sa las in isr doar socotitul secundelor ci mai tre sa iau si decizia daca tastele sunt ferm apasate (debounce) si asta se face din cate stiu eu cam dupa 20ms de la detectarea primei apasari.Eventual sa masor si milisecundele...si sa fac debounce-ul in main...Merci

Link spre comentariu

Faci debouncingul in program.Daca parcurgi main o data pe secunda, ai timp berechet sa testezi fiecare intrare, sa astepti 100ms si sa retestezi intrarea. Daca isi pastreaza valoarea e apasare ferma, daca se schimba a fost "pacaleala".Sau poti face citirea intrarilor in isr si restul numai o data pe secunda, sau poti face citirea intrarilor in permanent in main si sa faci prelucrarile iesirilor o data pe secunda... Ma rog, asta e singura mea idee. S-ar putea chiar sa nu fie nici macar cea buna. Asa ca... spor la treaba si succes.

Link spre comentariu
Vizitator Iuliu79

off-topic

daca il faceai in Mplab te puteam ajuta

MPLAB e numai o interfata frumoasa si usor de utilizat intre compilator/asamblor si utilizator. In mplab NU se fac programe.Daca vrei sa-l ajuti din mplab, instaleaza-ti compilatorul ccs, activeaza-l in mplab ca scula de compilare a proiectului si gata, il ai si tu in mplab.on-topic: Dupa parerea mea, se intampla din cauza modului asincron intre functionarea normala si tratarea intreruperilor. Adica daca intreruperea vine exact dupa if(flag4_temp) si inainte de if(flag4), se poate intampla ca in intrerupere sa-ti setezi la loc proaspatul resetat flag4. Sau? :nas: Eu as lasa in isr numai socotitul secundelor, iar diversele prelucrari (inclusiv cele din main) le-as face numai cand vine o secunda noua si pe toate in main. In felul asta as "sincroniza" putin prelucrarile cu secundele.
Raspund doar pt ca vad ca esti neexperimentat tu lucrezi cu programarea picului cu un limbaj de prg la nivel inalt eu cu unul la low level de unde arata ca " In mplab NU se fac programe"????? In continuare postez aici un program executat integral de mine in Mplab realizat si finalizat practic acum citiva ani ,scopul dispozitivului e STATIE DE LIPIT CU 16F819 CU LEDURI DE INDICATIE A TEMPERATURI SETATE SI AFISARE ZECIMALA A TEMPERATURI .Am muncit la cod aproximativ trei luni adica 4 -5 ore pe zii ,atunci eram somer si am zis ca sa fac ceva in legatura cu statia de lipit sa fac o statie la care sa ii vad si temperatura sa ii setez temperatura de lucru ....sa ma "joc" . Pt un electronist care lipeste zi de zi nu are o mare nevoie sa vada temperatura virfului letconului ci sa o simta .Am ales "creierul" statiei de lipit un microcontroler ieftin si m-am apucat de munca ,si asa rezultatul muncii s-a concretizat intr-o statie de lipit ce o folosesc in prezent renuntind cu totul la pistolul de lipit ala dupa vremea lu' ceausescu care si astazi functioneaza (apropo de aparatele electrice dupa vremea lu raposatu erau fiabile si isi faceau treaba ,pt nostalgigi).Atasez dosarul project aici pt alti care doresc amanunte despre modul in care am ales si construit statia voi crea un topic la rubrica dedicata STATIE DE LIPIT, daca vor fi doritori sa cunoasca jucaria .[attachment=0]prj_resize.jpg[/attachment][attachment=1]statia cu 16f819.zip[/attachment]
Link spre comentariu

Imi pare rau ca te dezamagesc, da' tu nu in mplab ai scris programul ci in assembler. Poti foarte bine scrie programul folosind un editor de texte (notepad de exemplu) si "compila" (in cazul tau asambla) in terminal (din linia de comada).Ce ofera mplab in plus e integrarea tuturor sculelor sub o singura interfata, ca sa nu mai trebuiasca sa scrii toate comenzile de mana, da' e numai o interfata.

Link spre comentariu

1. Nu este bine sa va certati pe forum. Amandoi aveti in felul vostru dreptate. Pentru Liviu M: am vrut azidimineata sa-ti raspund ca nu este bine sa-l iei asa tare pe Iuliu79, dar m-am abtinut crezand ca nu v-a avea repercursiuni postarea respectiva. 2. Este adevarat ca MPLAB intruneste sub el mai multe softuri, dar este incetatenit si faptul ca de regula cine spune ca lucreaza sub MPLAB, lucreaza de obicei in ASM sau C, deoarece se dau gratis cu MPLAB. Acuma nu ma apuc sa fac teoria lui C care se da versiunea pentru studenti sau etc. De asemenea se spune ca cine lucreaza sub MPLAB, de obicei progreameaza tot cu el, desi programatarul este un dispozitiv fizic, dar asa s-a incetatenit ideea si de fapt programeaza cu un programator a carui schema este recunoscuta de MICROCHIP. Nu vrea sa intru in polemica si nici sa desvolt acest subiect.3. Sper ca amandoi sa ramneti pe forum ''activi''.

Link spre comentariu
Vizitator Iuliu79

1. Nu este bine sa va certati pe forum. Amandoi aveti in felul vostru dreptate. Pentru Liviu M: am vrut azidimineata sa-ti raspund ca nu este bine sa-l iei asa tare pe Iuliu79, dar m-am abtinut crezand ca nu v-a avea repercursiuni postarea respectiva. 2. Este adevarat ca MPLAB intruneste sub el mai multe softuri, dar este incetatenit si faptul ca de regula cine spune ca lucreaza sub MPLAB, lucreaza de obicei in ASM sau C, deoarece se dau gratis cu MPLAB. Acuma nu ma apuc sa fac teoria lui C care se da versiunea pentru studenti sau etc. De asemenea se spune ca cine lucreaza sub MPLAB, de obicei progreameaza tot cu el, desi programatarul este un dispozitiv fizic, dar asa s-a incetatenit ideea si de fapt programeaza cu un programator a carui schema este recunoscuta de MICROCHIP. Nu vrea sa intru in polemica si nici sa desvolt acest subiect.3. Sper ca amandoi sa ramneti pe forum ''activi''.

Da asa e programatorul e un dispozitiv fizic si folosesc un prg mic EPIC pt a scrie ii microcontroler .Activ voi ramine dar doresc sa ajut nu sa primesc argumente gen "macho" ,ca nu i-si au rostul,iar dezamagit ... :dans: E greu sa construiesti,dar mai greu e sa fii original.[attachment=1]100_7689_resize.jpg[/attachment][attachment=0]Programatorul cablaj_resize.jpg[/attachment]
Link spre comentariu

1. Un raspuns corect ar fi: Depinde de cum vrei sa faci programul.2. Dar sa fim mai constructivi cred ca numai ce au lucrat cu ccs te pot lamuri, deoarece nu ai lucrat in ASM. Daca ai putea integra CCS in MPLAB cum sustine Liviu M, poate ai putea sa dai drumul la simulator si ai vedea unde este greseala, vazand ce se scrie in diversi registri in timp ce tu vrei sa faci sau nu acel lucru sau altfel spus ai vedea ce instructiune nu este facuta de PIC asa cum ai gandit-o tu.

Link spre comentariu

Nici eu nu stiu exact daca exista vreo reteta pentru codul perfect; poate si din cauza ca am inteles aiurea folosirea intreruperilor, eu incerc sa rezolv cat mai putine in isr; de obicei sa testez flaguri si sa setez cateva variabile care sa-mi zica mai departe cine a generat intreruperea, restul avandu-si locul in programul principal/functii dedicate.Asta imi permite ca isr sa fie cat mai scurt si rapid prelucrat, astfel incat, daca lucrez cu mai multe surse de intrerupere, sa nu ratez vreuna. A propos de "sa nu ratez vreuna", pentru ca picurile au stiva cam mica, am impresia ca daca vine o noua intrerupere in timp ce servesti o alta, datele actuale din registrii sunt salvati peste cele existente, ducand la efecte neprevazute. Ca o "contramasura", la intrarea in isr se dezactiveaza intreruperile globale (nu mai primesti intreruperi), se testeaza flagurile sa se detecteze cine a genertat intreruperea, se fac ceva prelucrari si, inaite de iesirea din isr, se reactiveaza intreruperile. De aici si ideea mea ca isr tzrebuie sa fie cat mai rapida.Nu ti-am zis nimic mai devreme pentru ca la tine, avand o singura sursa de intreruperi, nu poate iesi nimic aiure.

Link spre comentariu

Cum dimineata, la cafeluta, ma mai uit la ce prostii am debitat in cursul zilei anterioare, am mai citit o data topicul asta, m-am mai uitat putin peste codul din primul post si sunt cateva chestii pe care nu le inteleg bine/despre care cred ca nu sunt facute bine (poate ca-s bine si nu inteleg eu cum trebuie codul, ca nu stiu exact ce fac toate comenzile).

Pentru ca nu ai decat o sursa de intreruperi, nu m-am uitat prea atent cum "servesti" intreruperea, dar azi am vazut ca:

- in isr nu reincarci nicaieri registrul ala notat rtcc; in codul tau

set_rtcc(6); //initializare counter 0-255 ==> 6-255==> 0-250 o intrerupere la 4 ms
.

Timerul genereaza intreruperi la trecerea din 0xFF in 0x00 (cand se umple). Asta inseamna ca la tine numara intotdeauna de la 0 la 255 (genereaza intreruperea cand o ia iarasi de la 0). De obicei cand vrei ca un timer sa "socoteasca" un anumit timp si sa-ti genereze intreruperea cand iti trebuie tie, dupa ce genereaza intreruperea (adica atunci cand registrul lui e 0) se reincarca cu valoarea calculata de tine la inceput (in cazul asta cu 6). Adica in isr trebuie, de fiecare data, sa apelezi

set_rtcc(6);
. In caz contrar secundele tale sunt mai sunt mai lungi decat te astepti tu sa fie.

- nu stergi nicaieri flagul de intrerupere de la timer 0. In cazul asta (cred ca) nu e grav, ca nu e nevoie sa testezi faguri, da' daca lucrezi cu mai multe intreruperi si decizia "cine a generat intreruperea" o faci cu flaguri, acestea trebuie resetate in isr.

Link spre comentariu

Eu stiu ca in ccs registrul rtcc se incarca in mainIn corpul functiei intrerupere nu se initializeaza timere...(asa stiu eu din exemplele studiate)

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