Sari la conținut
ELFORUM - Forumul electronistilor

PIC16F628 - TMR1


Vizitator Georgecpr

Postări Recomandate

la automatica si calc din iasi. Off, ma omoara WDT-ul ala, de fapt nici nu stiu daca e din cauza lui sau nu, am sa incerc sa va dau asha pe scurt ce vreau sa fac in program si sa-mi spunetzi daca problema pe care o am e din cauza WDT-ului sau nu, va rog frumos.deci, in bucla programului am doua functii. in prima am un switch (e program scris in C) in care verific daca s-a apasat sau nu o tasta, si in caz afirmativ astept 300 ms. In acest timp invalidez intreruperea de timer. Tastele sunt toate legate pe portul A al mic. Portul il citesc pe intreruperea de timer, la un anumit interval de timp.In a doua functie prima instructiune e ceva de genul: "if(!tasta) return;", adica daca n-am o tasta apasata trebuie sa ies din functie, dupa care urmeaza un switch in care afisez ceva pe un lcd, in functie de tasta apasata. Dupa aia incrementez un flag, pana la o suta cel mult si dupa aia il fac zero din nou, si dupa aia fac tasta=0;Acuma, in varianta de debug, ptr orice tasta apasata, afisez pe lcd valoarea flagului. Problema e ca la apasarea unei taste, valoarea flagului creste cu doua trei unit, si nu cu una cum ar trebui, e ca si cum programul meu nu s-ar executa pas cu pas, si am pp ca e din cauza WDT-ului, asta in cazul in care incerc sa scriu numai pe primul rand al lcd-ului, ca daca incerc sa scriu si pe celalalt lcd-ul o ia razna.Va rog sa ma ajutatzi. merci mult.PS: releul modulat in timp, desi impropriu spus, este un releu comandat de un semnal PWM cu factor de umplere variabil. De exemplu, intr-un anumit interval de timp, care este perioada de esantionare aleasa de mine, tzin semnalul pe high un timp care depinde de comanda pe care vreau eu sa o dau. Am vazut asta la un regulator numeric si merge, altfel nu vad alta rezolvare avand in vedere ca nu-mi permit sa dau bani si pe un convertor DA.

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

Top autori în acest subiect

cred ca am gasit unde e problema, dar asta nu inseamna ca am si o rezolvare de unul singur :((. Faza e ca lcd-ul meu e pe portul B al microcontrolerului, si folosesc totzi bitzii din acest port. Am vazut ca la pic 16F87XA RB6 si RB7 sunt folositzi si In Circuit-Debugger, si cred ca aci e problema. V-ash ruga sa-mi spunetzi, in cateva cuvinte ce inseamna In-Circuit-Debugger si la ce foloseste, ca din documentatia pe care o am nu prea inteleg.Si inca o intrebare non-subiect: cum naiba sterg un post anterior?pls helpmerci anticipatPS: si eu am facut un PID care-mi mentinea temperatura ff bine pe palier, dar cu un MCS 51, problema care vreau s-o rezolv e sa am performante de regim tranzitoriu bune si pe o referintza tip rampa!!!cum ai folosit matlabul in simulare? inseamna ca esti bun matematician si fizician si ai dedus corect modelul matematic al partzii fixate!!

Link spre comentariu

salut,

 

Uite cam la ce ma gandesc eu din ceea ce ai povestit.

 

Problema e ca la apasarea unei taste, valoarea flagului creste cu doua trei unit, si nu cu una

Ai debounce la taste? Desi pare ca apesi numai o data, inchiderea si deschiderea unui contact mecanic se face cu oscilatii care se sting dupa cateva ms. Procesorul le vede si poate sa reactioneze la ele, daca softul nu stie sa le ocoleasca.

 

In Circuit Debugger este un mic montaj cu care te conectezi la procesor si poti rula programele de aplicatie chiar pe montajul final. Cu ICD poti porni/opri rularea, poti seta break pointuri, poti rula pas cu pas chiar pe placa montajului final. Ca sa il folosesti, insa, trebuie activat modul debug din cuvantul config. Altfel RB 5,6... si care or fi, sunt porturi I/O chioare.

 

nu-mi permit sa dau bani si pe un convertor DA.

Ce rezolutie iti trebuie? Ce precizie? O sa fii surprins cat este de usor sa faci un D/A cu PIC si cu cateva pasive. Exista chiar mai multe abordari, in fct de performantele care le vrei.

 

sa am performante de regim tranzitoriu bune si pe o referintza tip rampa

Asa numitul acord al regulatoarelor PID este un capitol separat. E o arta sa faci un acord corect. E nevoie de experienta si mai ales cunoasterea intregului ansamblu regulator+sistem reglat. Urmarirea referintei de tip rampa imi aminteste de o cerinta similara la PLLuri. Parca ordinul buclei era cel care dadea eroarea la diverse semnale de intrare. Mi se pare ca daca bucla e de tip 2 (doua integratoare, adica pol dublu in origine, cred ca stii despre ce vorbesc) si daca nu depasesti domeniul de liniaritate, eroarea e constanta in timpul rampei si tinde la zero odata ce referinta e stabila. Cauta cartea de PLL-uri a lui Ulrich Rohde sau cred ca in orice carte in care se face teoria PLLului ar trebui sa gasesti tratat raspunsul tranzitoriu.

 

cum ai folosit matlabul in simulare?

A, foarte simplu. Nici o filozofie. Practic am facut un fel de model electric al termostatului. In esenta capacitatea calorica a ansamblului am simulat-o cu un condensator, iar pierderile cu o rezistenta in paralel. Am aplicat un salt treapta de putere si am trasat evolutia temperaturii. Apoi am "bibilit" R si C din model in asa fel incat sa se pupe cu exponentiala masurata practic. Apoi am adaugat ecuatia regulatorului pr. zis si am schimbat coeficientii termenilor P, I si D pana cand a raspuns cel mai repede, dar fara oscilatii.

 

 

Bafta,

Cirip

Link spre comentariu

cum ai folosit matlabul in simulare? inseamna ca esti bun matematician si fizician si ai dedus corect modelul matematic al partzii fixate!!

Modulul Simulink te ajuta foarte mult in astfel de cazuri. Pe vremea mea se facea si Simulink la laboratoare la AC in Iasi. Teoria regulatoarelor (PID si restul) e explicata binisor in cursul de Introducere in Automatica (anul I) si in cel de Teoria Sistemelor (in anul 3 - bucle de reglare digitale). De asemeni, mai gasesti niste exemple bune si aici (implementare regulator PID cu un microcontroller PIC): http://www.microchip.com/stellent/idcpl ... lterID=521Daca mai ai greutati cu software-ul, cred ca mai bine e postezi si o bucata de cod, e mai greu sa-mi dau seama din "descrierea" pe care o faci.
Link spre comentariu

is foarte multumit de acest forum, si pentru asta trebuie sa va multumesc frumos voua ca avetzi timp sa-mi datzi si mie informatii de care am nevoie.

Deci care-i treaba cu regulatorul ala, eu de fapt am ceva cunostinte despre modelul partzii fixate pentru ca pana la urma e un element de intarziere cu timp mort, insa nu stiu constanta de timp al modelului si parametrul ala de la exponentiala. Acordarea regulatorului m-am gandit s-o fac cu metoda releului, ptr ca un asemenea model imi da voie, sigur am oscilatzii intretinute cand bag releul in bucla si sper din tot sufletul sa nu gresesc.

Am facut si simulink si stiu cat de cat sa-l folosesc. Dar pana acolo am probleme mari in realizarea unui meniu :((.

Deci cu alte cuvinte daca nu folosesc In-Circuit-Debugger ar trebui sa ma pot folosi de portul B ca uz general. Problema e ca nici nu stiu cat e cuvantul ala de la adresa 2007 ca n-am scris eu bootloaderul asha l-am primit si eu de la altcineva.

Am sa postez o parte din program, de fapt un programel de debug poate daca avetzi timp sa va uitatzi sa ma lamuriti si pe mine. Nu am condensatoare pe butoane daca la asta te refereai, dar oscilatiile alea din cauza contactului imperfect am zis eu ca le elimin soft, pentru ca odata ce am citit portul si am vazut ca a fost apasata o tasta astept 300 ms, timp in care opresc timerul.

void main (void){		RP0=0;	RP1=0;	PORTA=0x00; // clear this register	RP0=1;//selectie bank 1	TRISB=0x00;	TRISD=0x00;	TRISA=0x3F;	ADCON1=0x06; //PORTA digital	RP0=0;	CLRWDT(); //dezactivare WDT	initializare_LCD();	init_timer();	init_parametrii();	strncpy(&DISPLAYH[0],"   Bun venit    ",16);	strncpy(&DISPLAYL[0],"< press Enter  >",16);	LCD_send_string();	DelayMs(10000);	CLRWDT();		strncpy(&DISPLAYH[0],"Ralucutza papa  ",16);//	strncpy(&DISPLAYL[0],"pe bog              ",16);	LCD_send_string();	while(1);}
Sa va explic cat de cat programelul si marea dar marea mea nelamurire:

DISPLAYH si DISPLAYL sunt doi vectori de tip unsigned char de dimensiune 16, variabile declarate global. Functia LCD_send_string() scrie pe lcd continutul acestor buffere. Functiile ptr lcd sunt facute de mine si cred ca-s corecte ptr ca am respectat totzi timpii aia din catalog cerutzi pentru lcd, dar daca vretzi va pot trimite si aceste fct, problema e ca incarc prea mult postul.

Care e marea problema pe care nu o inteleg. Daca bag comentariu la antepenultima linie din program, nu am nici cea mai mica eroare, programul lucreaza ff bine exact asha cum vreau!!! Daca in schimb scot comentariul de la antepenultima linie, pe lcd imi sunt afisate balarii, problema e ca si prima data, nu numai dupa alea 10 sec. Adica cum, sa spunem ca gresec la linia aia la care am pus comentariu, dar pana acolo programul n-ar trebui sa se execute bine?

Va rog sa-mi datzi si mie o explicatie cat de cat s-o inteleg, v-am spus folosesc portul B pentru lcd si are trei bitzi, aia doi folositi pentru In-Circuit-Debugger si inca unul RB3/PGC folosit pentru Low-Voltage Programming cu mai multe functii, in rest ceilalalti pin sunt I/E atat.

Link spre comentariu

Greu de spus fara sa stiu cum arata functiile. Din cate observ, ceea ce e diferit la linia aceea este numarul de caractere al parametrului de tip string. Toate celelalte au exact 16 caractere, asta are mai multe. Ce compilator folosesti? Functia strncpy() este dintr-o biblioteca care vine inclusa in pachetul compilatorului? Trimite-mi, daca poti, tot codul, sa vedem ce ar putea fi.

Link spre comentariu

Salut,

 

Nu cunosc "metoda releului" de acord si nici nu inteleg de ce trebuie sa ai oscilatii intretinute (probabil ca la regulatoarele cu histerezis). Un regulator PID trebuie "sa se aseze" intr-o stare in care marimile procesului sunt relativ constante, iar eroarea tinde la zero, atata timp cat nu exista factori perturbatori.

 

I-am dat lui gogu "PID regulator tuning" si primul link cu care a venit a fost: http://leo.technion.ac.il/Courses/ICA/L ... /set16.pdf. La sfarsitul pedefeului est descrisa o metoda de acord. Poate te inspiri de acolo.

 

Cirip

Link spre comentariu

am gasit eroarea, off doamne.functia strncpy este functie din biblioteca C string.h si are antetul strncpy(unsigned char *string_destinatie, const unsigned char *string, unsigned char nr_length), adica copie nr_length din string in string_destinatie. Faza e ca compilatorul interpreteaza al doilea parametru al functiei diferit fatza de compilatorul C, cel putzin asha cred eu. Defapt aloca cel de-al doilea parametru in EEPROM, nu-mi vine sa cred treaba asta.Cat despre metoda releului, eu zic ca este ff bine venita pentru ca nu trebuie sa cunosti modelul partzii fixate, problema e ca se poate aplica doar pentru anumite partzi fixate, acelea care, in domeniul frecventelor introduc un defazaj -pi. Se introduce la inceput releul in bucla inchisa si se aduce sistemul la limita de stabilitate, adica raspunsul sistemului este unul oscilant intretinut. In functie de amplitudinea oscilatiilor si pulsatia acestora se determina parametrii regulatorului. Metoda este ff bine descrisa in cartea prof Lazar, Ingineria Reglarii Automate.

Link spre comentariu

functia strncpy este functie din biblioteca C string.h si are antetul strncpy(unsigned char *string_destinatie, const unsigned char *string, unsigned char nr_length), adica copie nr_length din string in string_destinatie. Faza e ca compilatorul interpreteaza al doilea parametru al functiei diferit fatza de compilatorul C, cel putzin asha cred eu. Defapt aloca cel de-al doilea parametru in EEPROM, nu-mi vine sa cred treaba asta.

Repet intrebarea: ce compilator folosesti?
Link spre comentariu

folosesc picclite, e bun nu e bun spune-mi shi mie te rog. chiar nu stiu cum sa scap de asta si cred ca de acolo imi da eroarea, pentru ca si in simulare nu scrie ca lumea in cele doua buffere. merci multspune-mi shi mie un compilator bun te rog.functia strncpy este inclusa intr-un pachet care vine cu compilatorul. uite aci antetul functie exact cum e scrisa ea in header: extern far char *strncpy(far char *, const char *, size_t).Oricum, chiar daca fac eu o functie care copie un sir constat intr-un buffer tot nu merge, dupa parerea mea asta e marea greseala, cum interpreteaza compilatorul operatorul const.si cum pot sa vad in MPLAB codul generat in assembler sau nu pot?!!

Link spre comentariu

Compilatoarele HiTech sunt, dupa parerea mea, cele mai bune compilatoare de C pentru PIC. Trebuie doar sa citim cu atentie manualul:

pag.146

The const type qualifier is used to tell the compiler that an object has a constant value and will not be

modified. If any attempt is made to modify an object declared const, the compiler will issue a warning.

User defined objects declared const are placed in a special psects in ROM.

[...]

pag.146

In the midrange series, const pointers can access RAM as well as ROM.

[...]

pag.154

An anonymous constant string is always placed in ROM and can only be accessed via a const pointer.

In the following example, the string ?Hello world? is a constant string and is stored in ROM. It is

therefore accessed via a const pointer:

#define HELLO "Hello world"

SendBuff(HELLO);

A non-const array initialised with a string, for example:

char fred[] = "Hello world";

produces an array in RAM which is initialised at startup time with the string ?Hello world? (copied

from ROM), whereas a constant string used in other contexts represents an unnamed array qualified

const, accessed directly in ROM.

 

Sublinierile imi apartin. Voiam sa arat asta de la postul precedent, cand ai spus de sirul declarat cu const ca e in EPROM, atunci am banuit ca e vorba de compilatorul HiTech, dar nu eram sigur.

 

Ca sa vezi codul generat, ai urmatoarele optiuni (evident, dupa compilare):

In MPLAB View->Disassembly Listing

In MPLAB View->Program Memory (alege "Symbolic" in partea de jos a

ferestrei)

Fisierul *.lst din directorul proiectului (trebuie sa activezi optiunea "Generate assembly list file" la optiunile compilatorului, Project->Build Options->Project->Picc Compiler->Categories: Advanced->Diagnostics->Generate assembly list file).

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