Sari la conținut
ELFORUM - Forumul electronistilor

BASCOM


Postări Recomandate

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=70867

Am 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

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

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

@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

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

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

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

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

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

....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? :nas:
Link spre comentariu

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

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