nickrvl Postat Noiembrie 6, 2011 Partajează Postat Noiembrie 6, 2011 Salut. Am avut si eu o problema asemanatoare pe care am disctat-o aici. Uite cum am rezolvat eu, sper sa te prinzi de treaba:viewtopic.php?f=37&t=70867Am rezolvat, nelucrind niciodata cu eeprom-ul nu stiam nici comenzile de baza, de fapt e simplu,cu "WRITEEPROM variabila, adresa" se scrie efectiv valoarea variabilei la adresa respectiva "Writeeprom S0, 1 etc etc" in cazul meu si se citeste cu "READEPROM variabila, adresa".Banuiesc ca urmatoarea mea intrebare ar fi fost exact problema ta, adica daca eeprom-ul nu are nimic scris atunci Mc-ul la initiere o sa afiseze aiurea, in cazul cronometrului meu afisaza "88.88" in loc de "00.00", si se rezolva cum ai rezolvat tu, se genereaza un fisier epp cu datele necesare Mc-ului la initiere. In cazul meu nu "e grav", la prima setare a valorilor cifrelor cronometrului totul revine la normal, dar in alte proiecte poate fi o problema serioasa, asa ca multumesc... Link spre comentariu
Cilibiu Postat Noiembrie 13, 2011 Partajează Postat Noiembrie 13, 2011 Ca sa iti mearga ce vrei, prima oara trebuie sa scri in eeprom valoare 0 sau de start, la mine am folosit eepromul pentru Kilometri generali parcursi, prima oara am scris in eeprom kilometri parcursi pana la schimbarea bordului, dupa care am sters doar flashul si am scris din nou doar flashul, in program fiind accesat eepromul la pornirea MCU-ului dupa care inainte de oprire rescria valoarea noua in EEPROM! Link spre comentariu
ywar2 Postat Noiembrie 13, 2011 Partajează Postat Noiembrie 13, 2011 Salut. Nu mai deschid un subiect nou si continui aici cu o problema noua care imi da de cap. Problema consta in faptul ca daca adun la o variabila single o valoare zecimala rezultatul este altul decit cel real. Spre exemplu: 28500 + 0.1 = 28500.099609375 in loc de 28500.1 Am incercat si alte artificii gen (285000 + 1)/10 si rezultatul este acelasi. Care este solutia ? Iata si programul simplificat: Dim Freq As Single 'frecventa de lucruDim Freq_mem As Eram Single 'memoreaza frecventa in ERAMDim Tune As Bit 'indica daca s-a schimbat frecventa sau nuA Alias Pind.2 'upB Alias Pind.3 'down'setarea intreruperi encoderConfig Int0 = FallingSet BOn Int0 GetencoderEnable InterruptsEnable Int0'*******************************************************************************' PROGRAMUL'******************************************************************************* Cls 'incarc din memorie frecventa Freq = Freq_mem 'afisez frecventa Locate 2 , 1 Lcd Freq 'stand-by Tune = 0Loop: 'daca frecventa s-a modificat If Tune = 1 Then 'afisez frecventa Locate 2 , 1 Lcd Freq 'memorez frecventa Freq_mem = Freq 'stand-by Tune = 0 End IfGoto Loop'*******************************************************************************' ENCODER'*******************************************************************************Getencoder: Waitms 1 If A = 0 Then If B = 0 Then 'Incr Freq ------ OK !!! Freq = Freq + .1 ' nu functioneaza corect Else 'Decr Freq ------ OK !!! Freq = Freq - .1 ' nu functioneaza corect End If End If Gifr = 64 Tune = 1Return'*******************************************************************************La pornire se initializeaza o variabila din memorie si este afisata pe ecran, dupa care intra intr-o bucla in care este asteptata o schimbare data de un encoder. La rotirea encoderului se intrerupe bucla si se face o 'incrementare sau decrementare' cu 0.1 a variabilei freq. Odata ce a fost tratata intreruperea se revine la bucla principala si se afiseaza valoarea ei. Portiunea de program cu encoderul nu-mi apartine si este arhicunoscuta. Restul este logica. Unde am gresit sau unde gresesc ??? Link spre comentariu
nico_2010 Postat Noiembrie 14, 2011 Partajează Postat Noiembrie 14, 2011 @ywar2:Iti propun sa incerci urmatoarea varianta:Dim Freq as IntegerDim numar as integer....Freq=25800000numar=0....pas=numar*100freq=freq+pas 'sau freq=freq-pas Waitms 1 If A = 0 Then If B = 0 Then numar = numar + 1 Else 'Decr Freq ------ OK !!! numar = numar - 1 End If End If Gifr = 64 Tune = 1Daca nu am fost suficient de explicit trimite un MP.Stima Link spre comentariu
ywar2 Postat Noiembrie 14, 2011 Partajează Postat Noiembrie 14, 2011 Salut Nico, tot nu merge. Nu merge ptr ca in final eu am nevoie de o valoarea cu zecimala, sa zicem 28500.1, apoi 28500.2, etc. Am anticpat si eu metoda ( 2850000 + 100 ) / 100 dar rezultatul este 28500.09765625 si nu 28500.1.Culmea:freq = 285001freq = freq / 10freq = freq * 10da rezultatul.....285000.96875 si nu 285001 !!!Helpul zice ca este o problema cu reprezentarea binara a valorilor zecimale si ca eroarea este cunoscuta, problema este cum o rezolv eu ? Link spre comentariu
godFather89 Postat Noiembrie 14, 2011 Partajează Postat Noiembrie 14, 2011 Helpul zice ca este o problema cu reprezentarea binara a valorilor zecimale si ca eroarea este cunoscuta, problema este cum o rezolv eu ?Helpul zice bine. Tipurile de date ce respecta IEEE 754 (single, float, double, etc.) au aceasta problema desi in unele limbaje a fost diminuata prin mici artificii sau prin introducerea unor noi tipuri de date (decimal).O metoda de rezolvare ar fi sa folosesti un tip numeric intreg in care ultimele 2-3 cifre (sau de cate ai nevoie) reprezinta partea fractionara si afisarea sa o faci manual: mai intai partea intreaga (x/100), un punct si apoi partea fractionara (x %100).De exemplu: freq = 28500100 (285001.00).freq /= 10 -> 2850010 (28500.10)freq *= 10 -> 28500100 (285001.00).Deci, mai trebuie sa gasesti un tip de date intreg (nesemnat?) in care sa incapa numerele cu care vrei tu sa lucrezi (unsigned long/unsigned long long) dar fiind vorba de BASCOM, nu iti pot fi de ajutor. Link spre comentariu
nico_2010 Postat Noiembrie 14, 2011 Partajează Postat Noiembrie 14, 2011 Salut!Ideea propusa de GodFather este buna si vine in completarea ideii mele prezentate mai sus.Valoarea frecventei va fi in Hz (asa cum am mentionat-o in "program), iar pas-ul este valoarea pasilor in sute de hertzi.Ca urmare, dupa adunarea efectuata la fiecare modificare vei avea frecventa incrementata/decrementata cu cate 100Hz.Afisarea o poti formata cu comanda "Format" sau cu comanda "Fusing" astfel incat sa obtii valoarea in forma dorita de tine. Link spre comentariu
ywar2 Postat Noiembrie 14, 2011 Partajează Postat Noiembrie 14, 2011 Salut si multumesc pentru preocuparea dvs vis a vis de problema mea. Mi se pare o solutie interesanta cea data de godFather89 si am sa ma gindesc la ea. Problema este ca afisarea rezultatului este problema cea mai mica, dar cea mai importanta este ca acesta urmeaza sa fie folosit mai departe intr-un alt algoritm matematic. Acesta din urma este deja pus la punct si functioneaza, dar daca ii dai date gresite, lafel sint si rezultatele. In seara asta am sa incerc sa incerc solutia sus mentionata si daca merge postez rezultatul. Daca mai aveti solutii, sint binevenite. 73!!! Link spre comentariu
godFather89 Postat Noiembrie 14, 2011 Partajează Postat Noiembrie 14, 2011 dar cea mai importanta este ca acesta urmeaza sa fie folosit mai departe intr-un alt algoritm matematic.Toate operatiile elementare ar trebui sa functioneze pe numere in formatul prezentat mai sus, precizia fiind data de numarul de zecimale alese pentru partea fractionara. Daca ai probleme, pune codul aici sa vedem si noi. Link spre comentariu
ywar2 Postat Noiembrie 14, 2011 Partajează Postat Noiembrie 14, 2011 Salut. Am reusit!!! Solutiile la problema de mai sus sint: -valoarea variabilei am folosit-o ignorind virgula, deci din 6 cifre si nu 5+1 -afisarea am realizat-o prin conversie in string, formatare "00000.0" si afisare -restul calculelor in care a fost implicata variabila au fost amplificate cu 10, datorita mutarii / disparitiei virgulei din variabila. Pentru ca am promis sa postez solutia, ma voi tine de cuvint. O alta remarca pentru cei care doresc sa foloseasca encodere mecanice, pentru o mai buna functionare sa puna intre fiecare intrare si masa, cite un condensator de 10nF, poate chiar mai mult. Va functiona impecabil cu subrutina din program. 73!!! Dim Freq As Single 'frecventa de lucruDim Freq_mem As Eram Single 'memoreaza frecventa in ERAMDim Tune As Bit 'indica daca s-a schimbat frecventa sau nuDim Fqlcd As String * 6 'valoarea frecventei formatataDeclare Sub Ecran 'surutina de formatare si afisare a frecventei pe ecran'encoderA Alias Pind.2 'upB Alias Pind.3 'down'setarea intreruperi encoderConfig Int0 = FallingSet BOn Int0 GetencoderEnable InterruptsEnable Int0'*******************************************************************************' PROGRAMUL'******************************************************************************* Cls 'incarc din memorie frecventa Freq = Freq_mem 'F=285003 si nu 28500.3 'afisez frecventa Call Ecran 'stand-by Tune = 0Loop: 'daca frecventa s-a modificat If Tune = 1 Then 'afisez frecventa Call Ecran 'memorez frecventa Freq_mem = Freq 'stand-by Tune = 0 End IfGoto Loop'*******************************************************************************' ENCODER'*******************************************************************************Getencoder: Waitms 1 If A = 0 Then If B = 0 Then Incr Freq 'UP Else Decr Freq 'DOWN End If End If Gifr = 64 Tune = 1 'a fost modificata frecventa !!!Return'*******************************************************************************' ECRAN'*******************************************************************************Sub Ecran: Freqlcd = Str(freq) 'transfer valoarea frecventei in string Freqlcd = Format(freqlcd , "00000.0") 'formatez stringul Locate 2 , 1 Lcd Freqlcd 'afisez frecventa corecta Lcd " KHz"End Sub'******************************************************************************* Link spre comentariu
nickrvl Postat Noiembrie 15, 2011 Partajează Postat Noiembrie 15, 2011 ....Pentru ca am promis sa postez solutia, ma voi tine de cuvint....... ....Loop: 'daca frecventa s-a modificat If Tune = 1 Then 'afisez frecventa Call Ecran 'memorez frecventa Freq_mem = Freq 'stand-by Tune = 0 End IfGoto Loop......... La "frecventa" cu care e scrisa memoria nu se "uzeaza" prematur? Link spre comentariu
ywar2 Postat Noiembrie 15, 2011 Partajează Postat Noiembrie 15, 2011 Ba da, dar la cit costa integratul, ce mai conteaza !!! Asa este, stiu si eu asta, dar am ales sa salvez atit de des ptr ca atunci cind opresti echipamentul prin intreruperea curentului si nu a unui push buton ON/OFF care sa comande controlerul, sa ramina memorata ultima frecventa setata. Altfel la pornirea echipamentului va pornii tot timpul de la o frecventa de start. A fost optiunea mea !!! Link spre comentariu
yo9hnf Postat Noiembrie 17, 2011 Autor Partajează Postat Noiembrie 17, 2011 Are cineva un cod pentru DS1307 cu setare din butoane? Am putut face ceasul sa mearga ( am gasit ceva coduri pe internet), dar la toate se pre-initializa ora si nu mergea setata. Link spre comentariu
ywar2 Postat Noiembrie 17, 2011 Partajează Postat Noiembrie 17, 2011 Salut. Acesta este bun? http://www.avrprojects.info/avr-project ... sed-clock/ Link spre comentariu
yo9hnf Postat Noiembrie 17, 2011 Autor Partajează Postat Noiembrie 17, 2011 Salut ywar2 ! Multumesc !Din pacate programul nu este bun. Am gasit undeva libraria pe care o apeleaza, dar tot da eroare la "seco" si "mine". 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