Sari la conținut
ELFORUM - Forumul electronistilor

Computer de bord MOTO+bord electronic!


Cilibiu

Postări Recomandate

Ma bucur ca iti este de folos ideea. Am sugerat din metru in metru deoarece ai o precizie mai buna.

Am atasat o poza cu schema portului INT0 pe care trebuie sa il folosesti si o secventa scurta de cod pentru salvarea in eeprom. Am selectat doar o parte din ce am folosit eu.

 

On Int0 Salveaza_valoarea NosaveConfig Int0 = FallingEnable Int0'Contact offSalveaza_valoarea:If Conditie = 1 ThenKm = Km + MetruIf Km <> 0 ThenEprom_val = Km                                             Writeeeprom Eprom_val , 10                                Waitms 20End IfEnd If

post-21770-139829500931_thumb.jpg

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

Top autori în acest subiect

  • Cilibiu

    115

  • ratza

    19

  • Liviu M

    10

  • stefan_k

    10

Top autori în acest subiect

Imagini postate

Ma bucur ca iti este de folos ideea. Am sugerat o valoare din 10 in 10 metri deoarece ai o precizie mai buna.Am atasat o poza cu schema portului INT0 pe care trebuie sa il folosesti si o secventa scurta de cod pentru salvarea in eeprom. Am selectat doar o parte din ce am folosit eu.

On Int0 Salveaza_valoarea NosaveConfig Int0 = FallingEnable Int0'Contact offSalveaza_valoarea:If Conditie = 1 ThenKm = Km + MetruIf Km <> 0 ThenEprom_val = Km                                             Writeeeprom Eprom_val , 10                                Waitms 20End IfEnd If
Scuze, am vrut sa modific ceva si am folosit functia "citeaza"
Link spre comentariu

Primul este original iar al doilea modificat.

Stby:Do'progam alarmaLoop Until Pine.0 = 0Do'Kilometri parcusiReadeeprom Kmt , Label1Kmtt = 0'preluare date encoderKmtt = Informatie EncoderKmt = Kmt + KmttWriteeeprom Kmt , Label1'shut downIf Pine.0 = 1 ThenGoto StbyEnd IfLoop

Iar cel modificat

Stby:Do'progam alarmaLoop Until Pine.0 = 0'Kilometri parcusiReadeeprom Kmt , Label1DoKmtt = 0'preluare date encoderKmtt = Informatie EncoderKmt = Kmt + Kmtt'shut downIf Pine.0 = 1 ThenWriteeeprom Kmt , Label1Goto StbyEnd IfLoop

Am mutat respectivele 2 lini de cod si sa rezolvat treaba.

Stau acum si ma gandesc oare de cate ori sa scris EEMPROM-ul??

Am facut ceva teste cu el pe bank, tinand cont ca o scriere se facea la 100ms........ si am cam facut test vreo ora sa zic asa...... bineinteles ca , cu un calcul matematic aflu de cate ori sa scris, dar nu cred ca a ajuns pe la 50.000

Link spre comentariu

Eu am folosit aceasta metoda intr-o aplicatie unde aveam dese caderi de tensiune. Si asa memoram datele si scapam de probleme.Astept sa vedem primele teste. Este de admirat perseverenta ta si urcusul rapid in acest domeniu. :da Felicitari! :aplauze

Link spre comentariu

Ca sa reduci si mai mult scrierile nenecesare in ai putea sa faci si o verificare daca valoarea curenta a kilometrajului este diferita de valoare curenta din EEPROM.Ceva de genul:if(km != read_eeprom(adresa)){ write_eeprom(adresa);} La inchiderea contactului ai putea trimite MCU in sleep.Cred ca ai avea un consum si mai mic de 80mA

Link spre comentariu

Cilibiu, poţi scrie km parcurşi în EEPROM atunci cînd opreşti motorul. Scuteşti celulele de o moarte timpurie.

Pai asta am facut acuma.

..... La inchiderea contactului ai putea trimite MCU in sleep.Cred ca ai avea un consum si mai mic de 80mA

Mam informat demult de acest gen de a dormi, IDLE MODE, POWERDOWN.....etc.O pot face dar ledul de alarma nu va mai clipi. De acea nu am folosit functia sleep.
Link spre comentariu
  • 2 săptămâni mai târziu...

Revin cu o problema descoperita astazi.Astazi am finalizat modificarea instalatiei electrice a motorului.Bordul functioneaza bine dar cu urmatoarelel probleme.1. Cand isi da clear in loc sa dispara de pe ecran tot , dispare grafica si textul si apar dungulite albe pentru o fractiune de secunda, iar dupa ce dispar astea totul functioneaza PERFECT.Nu sunt foarte deranjat de acest fenomen care apare de 2 ori, dupa ce dispare imaginea de pornire, si inainte sa apara imaginea de oprire.2. Aceasta este o problema grava care trebuie cu oricepret rezolvare.Folosesc ENCODER pentru citirea vitezei care se pare ca semnalul care il genereaza el este "bistabil", intr-o pozitie este 0 in urmatoarea pozitie este 1, nu este un generator de frecventa ci este cu 2 stari fixe, 0 si 1.Problema este ca atunci cand starea este 0 iar pe T1 este 0, pur si simplu MCU o ia razna cand este vorba de PROGRAMARE sau de citire a vitezei.Daca starea este 0 pe T1, nu pot programa MCU calumea, da DIFERENTE la verificare, nu imi incarca programul cum trebuie, chiar mia blocat MCU de 2 ori, am vazut ca schimba si FUSE BITI in diferite setari fara ca eu sa umblu acolo.Daca scot mufa de la ENCODER, totul functioneaza PERFECT.A doua problema cu acest ENCODER, este atunci cand motocicleta nu se misca timp de 30-60 secunde, pe ecran in loc de 00000.0 (kilometri parcursi resetabili) apare 000NAN si tot trebuie sa apas butonul resetare kilometri, daca starea lui T1 este 1 atunci cand sta sau il programez totul este perfect OK.Ma gandeas sa implementez un montaj care ca atunci cand am 0 sau 1 la intrare fara oscilatie sa am 1 la iesire, iar cand am oscilatie la intrare ,aceasi oscilatie sa am si la iesire, exact cum ai folosi un condesator in serie si doar atunci cand ai tensiune alternativa, trece prin el, daca nu ai nu trece.Voi ce parere aveti de asta?L.E am simulat urmatoarea schema si totul pare sa functioneze exact cum am nevoie.Voi ce parere aveti de schema?

post-15533-139829509267_thumb.jpg

Link spre comentariu

Daca pe T1 am 1 , de ce nu apare NAN? NAN apare doar cand este 0 pe T1, si este si normal ca fiind 0 pe intrare , citirea sa fie 0, iar cand este 1 mult timp ma gandesc ca nu calculeaza.Oricum NAN imi apare doar cand este conectat ENCODERUL cu starea 0.In schema nu am ce sa analizez, schema este facuta, nu pot face modificari, doar daca adaug langa, iar in program nu am de ce sa umblu deoarece functioneaza OK atunci cand ENCODERUL este functional sau nu este cuplat.O sa fac schema fizic si o sa o testez pana sa o montez in bord, dar din simulari pare totul OK.

Link spre comentariu

Sincer eu cred ca este invers. Ca pe T1 am 1 tot timpul daca nu am encoderul conectat. Deci ma gandesc ca el citeste cand trece din 1 in 0.

Sincer treaba asta nu stiu cum sa o setez din program, nu am ajuns sa inteleg destul de bine Conterul si Timerul.

Mai jos codul ce il folosesc.

Precizez ca in acest cod este inclus si citirea TURATIEI motorului care functioneaza excelent.

Config Timer0 = Timer , Prescale = 1024                     'Loop TimerConfig Timer1 = Counter , Edge = Rising                     'Frequency CounterConfig Timer2 = Timer , Prescale = 1024                     'Loop TimerConfig Timer3 = Counter , Edge = Rising                     'Frequency CounterEnable Interrupts Enable Timer2                                               'Timer interruptOn Timer2 Incr_ovf0                                         'Overflow RoutineEnable Timer1                                               'Counter interrruptOn Timer1 Incr_ovfldoEnable Timer2Enable Timer1Enable Timer3'vitezaTimer2 = 0                                                  'Reset counts  Counter1 = 0                                              'viteza  Counter3 = 0                                              'turometru   Ovf0 = 0                                                 'Reset overflows   Ovf1 = 0   While Ovf0 < 6                                           '100ms @ 16 MHz   nop   Wend   Disable Timer1                                           'Stop Timers   Disable Timer3   Disable Timer2   Tempa = Ovf1 * 65536                                     'Calc frequency   Viteza = Tempa + Counter1   Turatie = Tempa + Counter3   Viteza = Viteza * 10   Viteza = Viteza / 814.4                                  'calcul encoder   Turatie = Turatie * 10   Turatie = Turatie * 60loopendIncr_ovfl:   Incr Ovf1   ReturnIncr_ovf0:   Incr Ovf0   Return
Link spre comentariu
  • 3 săptămâni mai târziu...

Am rezolvat aparitia dungilor cand isi da LCD-ul CLEAR.

Acum am alta poblema.

Turatia imi este afisata din 600 in 600 RPM. Problema este intr-o linie de cod care nu stiu cum sa o fac sa arate turatia din 100 in 100 RPM.

Am incercat sa impart la 0.00167 dar nu ia in considerare cei cu 0.00...

Am incercat diferite calcule si nu reusesc sa afisez ce vreau.

Ceva sfaturi daca se poate.

 

Declare Sub Lcdtext(byval S As String , Byval Xoffset As Byte , Byval Yoffset As Byte , Byval Fontset As Byte , Byval Inverse As Byte , Byval Rotation As Byte)Dim Turatie As LongDim Rpm As String * 6doEnable Timer2Enable Timer1Enable Timer3Timer2 = 0                                                  'Reset counts  Counter3 = 0                                              'turometru   Ovf0 = 0                                                 'Reset overflows   Ovf1 = 0   While Ovf0 < 6                                           '100ms @ 16 MHz   nop   Wend   Disable Timer3   Disable Timer2   Tempa = Ovf1 * 65536                                     'Calc frequency   Turatie = Tempa + Counter3                >>>>>>>>> CITESTE VALOAREA 5   (50hz la intrare)            Turatie = Turatie * 600                     >>>>>>> IMULTESTE CU 600 CA SA AFISEZE 3000 RPMRpm = Str(turatie)Rpm = Format(rpm , "    0") Lcdtext Rpm , 50 , 11 , 1 , 0 , 0              >>>>> AFISEAZA PE LCDloopend'=== Sub Routines ===Sub Lcdtext(byval S As String , Xoffset As Byte , Yoffset As Byte , Fontset As Byte , Inverse As Byte , Rotation As Byte)Local Tempstring As String * 1 , Temp As Byte               'Dim local the variablesLocal A As Byte , Pixels As Byte , Count As Byte , Carcount As Byte , Lus As ByteLocal Row As Byte , Byteseach As Byte , Blocksize As Byte , Dummy As ByteLocal Colums As Byte , Columcount As Byte , Rowcount As Byte , Stringsize As ByteLocal Xpos As Byte , Ypos As Byte , Pixel As Byte , Pixelcount As ByteStringsize = Len(s) - 1                                     'Size of the text string -1 because we must start with 0For Carcount = 0 To Stringsize                              'Loop for the numbers of caracters that must be displayed If Fontset = 1 Then Restore Font16x16                      'Add or remove here fontset's that you need or not, If Fontset = 2 Then Restore Font8x8                        'this is the name that you gave to the font, NOT the filename If Fontset = 3 Then Restore Font32x32                      'If you dont know the name, open the font file in wordpad, and there it is, If Fontset = 4 Then Restore Font6x8                        'right on top. Temp = Carcount + 1                                        'Cut the text string in seperate caractersTempstring = Mid(s , Temp , 1)Read Row : Read Byteseach : Read Blocksize : Read Dummy     'Read the first 4 bytes from the font fileTemp = Asc(tempstring) - 32                                 'Font files start with caracter 32For Lus = 1 To Temp                                         'Do dummie read to point to the correct line in the fontfile   For Count = 1 To Blocksize    Read Pixels   Next CountNext LusColums = Blocksize / Row                                    'Calculate the numbers of columsRow = Row * 8                                               'Row is always 8 pixels high = 1 byte, so working with row in steps of 8.Row = Row - 1                                               'Want to start with row=0 instead of 1Colums = Colums - 1                                         'Same for the columsSelect Case Rotation    Case 0                                                  '0 degrees rotation            For Rowcount = 0 To Row Step 8                  'Loop for numbers of rows                  A = Rowcount + Yoffset                  For Columcount = 0 To Colums              'Loop for numbers of Colums                      Read Pixels : If Inverse = 1 Then Toggle Pixels       'Read the byte from the file and if inverse = true then invert de byte                      Xpos = Columcount                     'Do some calculation to get the caracter on the correct Xposition                      Temp = Carcount * Byteseach                      Xpos = Xpos + Temp                      Xpos = Xpos + Xoffset                          For Pixelcount = 0 To 7           'Loop for 8 pixels to be set or not                             Ypos = A + Pixelcount          'Each pixel on his own spot                             Pixel = Pixels.0               'Set the pixel (or not)                             Pset Xpos , Ypos , Pixel       'Finaly we can set the pixel                             Shift Pixels , Right           'Shift the byte 1 bit to the right so the next pixel comes availible                          Next Pixel                  Next Columcount            Next RowcountEnd SelectNext CarcountEnd SubIncr_ovfl:   Incr Ovf1   ReturnIncr_ovf0:   Incr Ovf0   Return'=== Includes ===$include "Font16x16.font"                                   'Includes here your font files$include "font8x8.font"$include "font32x32.font"$include "font6x8.font"
Link spre comentariu

Turatia imi este afisata din 600 in 600 RPM. Problema este intr-o linie de cod care nu stiu cum sa o fac sa arate turatia din 100 in 100 RPM.

   Turatie = Turatie * 600                     >>>>>>> IMULTESTE CU 600 CA SA AFISEZE 3000 RPM
Inmultesti cu 100 ?
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