iulian2010 Postat Octombrie 7, 2012 Partajează Postat Octombrie 7, 2012 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 Link spre comentariu
iulian2010 Postat Octombrie 7, 2012 Partajează Postat Octombrie 7, 2012 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
Cilibiu Postat Octombrie 7, 2012 Autor Partajează Postat Octombrie 7, 2012 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
iulian2010 Postat Octombrie 7, 2012 Partajează Postat Octombrie 7, 2012 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. Felicitari! Link spre comentariu
ramsesrr Postat Octombrie 7, 2012 Partajează Postat Octombrie 7, 2012 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
ratza Postat Octombrie 8, 2012 Partajează Postat Octombrie 8, 2012 Cilibiu, poţi scrie km parcurşi în EEPROM atunci cînd opreşti motorul. Scuteşti celulele de o moarte timpurie. Link spre comentariu
Cilibiu Postat Octombrie 8, 2012 Autor Partajează Postat Octombrie 8, 2012 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 80mAMam 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
Cilibiu Postat Octombrie 20, 2012 Autor Partajează Postat Octombrie 20, 2012 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? Link spre comentariu
godFather89 Postat Octombrie 21, 2012 Partajează Postat Octombrie 21, 2012 Aia cu NAN (not a number) apare, probabil, de la o impartire la zero.Restul... analizeaza bine schema si programul. Link spre comentariu
Cilibiu Postat Octombrie 21, 2012 Autor Partajează Postat Octombrie 21, 2012 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
ratza Postat Octombrie 22, 2012 Partajează Postat Octombrie 22, 2012 Poate ai pus întreruperea pe nivel logic, nu pe front. Link spre comentariu
Cilibiu Postat Octombrie 22, 2012 Autor Partajează Postat Octombrie 22, 2012 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
Cilibiu Postat Octombrie 23, 2012 Autor Partajează Postat Octombrie 23, 2012 Am montat circuitul respectiv in bord si functioneaza perfect. Link spre comentariu
Cilibiu Postat Noiembrie 11, 2012 Autor Partajează Postat Noiembrie 11, 2012 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
Liviu M Postat Noiembrie 11, 2012 Partajează Postat Noiembrie 11, 2012 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
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