ratza Postat Iunie 21, 2012 Partajează Postat Iunie 21, 2012 Din păcate şi eu programez în C, aşa că nu te pot ajuta. Link spre comentariu
yo6pir Postat Iunie 21, 2012 Partajează Postat Iunie 21, 2012 Daca nu te ajuta help-ul din Bascom, atunci incearca forumul MCS. Ai acces direct din Bascom-> Help->MCS Forum. Acolo se discuta in mod explicit despre probleme de programare in Bascom. E drept destul de academic, si in engleza, dar s'ar putea sa te ajute. Link spre comentariu
DarkAngel_Bv Postat Iunie 22, 2012 Partajează Postat Iunie 22, 2012 Pana la urma am pornit cu un program gol doar de test si am reusit sa-l fac (oarecum). Ceva de genul: Interr: If Asculta = "fall" Then Stop Timer1 Asculta = "rise" Locate 1 , 1 Lcd Timer1 ; " - " ; Ovfi1 ; " " Timer1 = 0 Config Int0 = Rising Else Start Timer1 Asculta = "fall" Config Int0 = Falling End IfReturnDar ma gandesc sa nu mai resetez timerul ala manual ca sa pot calcula si turatia motorului prin acelasi interrupt (stiind ca injectorul se dechide o singura data pe ciclu si ca are nevoie de 2 ture complete ale motorului pentru un ciclu rezulta ca am 4 interrupt cu rising pentru 2 ture complete ale motorului asta in cazul in care captez toate cele 4 injectoare, ceea ce probabil o sa fac doar de test). Dar, am folosit ceva gen On Ovf1 ClockOverflowdoar ca nu imi este apelata subrutine asta niciodata :-?? P.S. Si daca pun on Timer1 la fel, nu-mi intra niciodata in acea subrutina, desi timerul incepe de la 0 si tot asa. Link spre comentariu
Liviu M Postat Iunie 22, 2012 Partajează Postat Iunie 22, 2012 Mie mi se pare cam ciudata logica folosita; mi-ar fi iesit putin altfel: Interr: Stop Timer1 'oprim timerul, ca altfelnumara in continuare si ne strica socotelile If Asculta = "fall" Then Asculta = "rise" 'Locate 1 , 1 'afisarea n-are ce cauta la tratarea intreruperilor, 'bucata asta trebuie sa fie cat mai scurta, 'ca sa nu stea timerul prea mult oprit 'Lcd Timer1 ; " - " ; Ovfi1 ; " " Config Int0 = Rising Else Asculta = "fall" Config Int0 = Falling End If FlagIntrerupereTimer = 1 'folosesti o variabila pe post de flag 'si afisarea o faci in programul principal Timer1 = 0 Start Timer1Return... 'programul principal, n-am idee cum arata de fapt in bascom, adaptezi tu sa fie bine if FlagIntrerupereTimer = 1 then FlagIntrerupereTimer = 0 Locate 1 , 1 'afisarea in programul principal Lcd Timer1 ; " - " ; Ovfi1 ; " " ...'programul principal Link spre comentariu
DarkAngel_Bv Postat Iunie 22, 2012 Partajează Postat Iunie 22, 2012 trebuie sa resetez timerul doar la falling pentru ca oricum e oprit pana la urmatorul rising.In varianta finala o sa pun timerul sa ruleze continuu, dar pentru asta am nevoie de un counter pentru overflow, counter ce nu merge :-?Evident ca afisarea va fi in programul principal, asta e doar de test. De fapt in programul principal o sa am zeci de parametrii afisati unul dupa celalalt sau pe baza de buton (daca seted din buton "scroll" o sa faca scroll la toti parametrii, daca e setat sa afiseze anumit parametru o sa-l afiseze doar pe ala si atat). Link spre comentariu
DarkAngel_Bv Postat Iunie 24, 2012 Partajează Postat Iunie 24, 2012 ceva nu functioneaza ok... pentru un puls cu frecventa de 50 Hz imi da o lungime de 16.61 ms in loc de 20ms iar pentru 100 Hz imi da 8.01 in loc de 10ms Atea cu clock-ul intern de 1Mhz si prescaler 8 pe timer. In orice caz, cu urmatorul cod: $regfile = "m8def.dat"$crystal = 1000000Config Lcd = 16 * 2'Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.5 , Db6 = Portb.7 , Db7 = Portb.6 , E = Portd.7 , Rs = Portb.0Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2 , E = Portb.6 , Rs = Portb.7Config Timer1 = Timer , Prescale = 8Dim Wtime As IntegerDim Timercounter As WordDim Ovfi1 As IntegerDim Asculta As String * 4Dim Test As Single , Testint As Integer , Ultimul_int_ct As Integer , Ultimul_timer As IntegerDim Durata As Single , Duratams As SingleConfig Int0 = RisingEnable InterruptsEnable Int0Enable Timer1On Int0 InterrOn Timer1 Overf1Wtime = 1000Timercounter = 0 Ovfi1 = 0Do Waitms Wtime Locate 1 , 1 Lcd Ovfi1 ; "-" ; Ultimul_int_ct ; "-" ; Ultimul_timer ; " " Locate 2 , 1 Durata = Durata / 65535 Duratams = Durata * 1024 Lcd Fusing(duratams , "##.##") ; " " '; " - " ; Ovfi1 ; " - " ; Ultimul_int_ct ; " "LoopEndInterr: Stop Timer1 If Asculta = "fall" Then Asculta = "rise" Durata = Ovfi1 - Ultimul_int_ct Durata = Durata * 65535 Durata = Durata + Timer1 Durata = Durata - Ultimul_timer Config Int0 = Rising Else Ultimul_int_ct = Ovfi1 Ultimul_timer = Timer1 Asculta = "fall" Config Int0 = Falling End If Start Timer1ReturnOverf1: Incr Ovfi1ReturnAm un jump destul de mare a variabilei Ultimul_int_ct care ar trebui doar sa preia valoarea lui ovfi1. ovf1 la fel, sare cauteodata ca prostul (700000018 in loc de 18). Oare sa fie doar o eroare a proteus sau intr-adevar este o problema de logica a codului? La fel si Ultimul_timer, uneori este negativ, desi Timer1 teoreretic este intre 0 si 65535 Link spre comentariu
Liviu M Postat Iunie 24, 2012 Partajează Postat Iunie 24, 2012 In primul rand, de fiecare data cand calculezi durata pierzi continutul lui TIMER1 (numeri doar de cate ori a avut loc un overflow, cu toate ca TIMER1 poate fi aproape plin).In al doilea rand, dupa ce ai facut un calcul de durata nu resetezi niciodata timerul. Asta inseamna ca nu pornesti nici o numaratoare de la aceeasi valoare => rezulatele nu au cum sa fie reproductive.Ma rog, asta din ce se vede din programul asta. Daca de fapt programul e altul... Link spre comentariu
DarkAngel_Bv Postat Iunie 24, 2012 Partajează Postat Iunie 24, 2012 Practic eu fac in felul urmator:La interrupt (INT0) verific daca e falling sau risingDaca e rising stochez ultimul timer1 (0-65535) si la cat a ajuns overflow-ul (0-65535). Avand in vedere ca nu voi merge niciodata cu masina 65535 secunde (~18.2 ore) fara sa opresc motorul macar o data nu imi fac probleme ca nu incape acel overflow counter intr-un integer.Daca e falling, atunci inmultesc diferenta de overflow number dintre cele 2 intervale cu 65535 si apoi adaug valoarea timerului dupa care scad ultima valoare citita (desi acum daca ma gandesc, am impresia ca am gresit putin).Cred ca voi folosi 2 timere. Unul doar pentru lungimea pulsului si altul ca sa numar pulsurile/secunda Link spre comentariu
Liviu M Postat Iunie 24, 2012 Partajează Postat Iunie 24, 2012 Eu as fi lucrat cu variabile mai mici si le-as fi facut 0 dupa ce le citeam; am citit numarul de overflow-uri, il fac 0, am citit timerul, il fac 0. Pe-asta ultimul l-as reseta oricum, ca poate da erori mari de unul singur - cum ziceam, il citesti i data la 64530, o data la 500 (a generat overflow intre timp si a luat-o de la capat) si faci diferenta: 500 - 64530 => -64000 in loc de 550. Link spre comentariu
DarkAngel_Bv Postat Iunie 24, 2012 Partajează Postat Iunie 24, 2012 Nu am cum sa resetez timerul pentru ca am de calculat si alte frecvente.De fapt pe INT0 am pwm-ul de pe injectoare, pe INT1 am impulsurile de la senzorii ABS. Si am nevoie si de RPM (ca sa pot calcula consumul pe 100Km in functie de viteza cat si consumul pe ora cand masina stationeaza). Tocmai pentru asta am nevoie de un timer ce ruleaza neintrerupt. Link spre comentariu
ratza Postat Iunie 25, 2012 Partajează Postat Iunie 25, 2012 Cred ca voi folosi 2 timere. Unul doar pentru lungimea pulsului si altul ca sa numar pulsurile/secundaDacă ai nevoie de timere precise, nu folosi niciodată oscilatorul intern, pune-i un cuarţ. Aşa am avut neplăcuta surpriză cu un frecvenţmetru, care din trei citiri consecutive dădea patru valori diferite. Vezi că pinul ICP poate fi folosit ca întrerupere externă, cu sau fără timer. Link spre comentariu
DarkAngel_Bv Postat Iunie 25, 2012 Partajează Postat Iunie 25, 2012 in setupul actual pinii xtal sunt folositi pentru LCD. Da, stiu de ICP, dar nu as vrea sa folosesc 2 pini ca sa numar impulsurile/secunda si pwm-ul aceluias semnal.Cu oscilatorul la 4 Mhz si prescaler la 64 imi face intreruperile la timeri la o secunda, cand aveam prescaler la 8 si oscilator la 1Mhz imi facea mai mult de o intrerupere pe secunda. Link spre comentariu
DarkAngel_Bv Postat August 21, 2012 Partajează Postat August 21, 2012 Tocmai ce am primit de la @ole cablurile cu prilific si ENC-ul. momentan m-am jucat cu prolificul, dar nu reusesc sa afisez caracterele corecte pe display. Do A = Waitkey() If A > 0 Then ' Cls Locate 1 , 1 Lcd "ASCII " ; A ; " " End IfLoopcam asa arata codul de test, si totusi pe ecran imi arata codul numeric, dar spre exemplu cifra 2 si 4 de pe tastatura afiseaza aceiasi cifra (217 daca imi amintesc bine) pe LCD. De asemenea, daca incerc sa scriu din Atmega in consola imi baga niste caractere ciudate gen: ����c�hx������c�gx������c�hx������c�gx������c�gx������c�hx������c�hx������c�cx������c�sx������c�sx��am incercat si cu chr(A) si nu afiseaza nimic pe lcd. Link spre comentariu
Buddy1 Postat Septembrie 2, 2012 Partajează Postat Septembrie 2, 2012 buna ziuavreau sa fac un termometru folosind Atmega8,un senzor LM35DZ(singurlul pe care l-am gasit)+ afisajul prezentata in pozele de mai josintrebarea mea: este cineva amabil sa ma ajute cu o schema si cu un cod de programare?temperatura masurata am vazut ca este -50/+150C de LM35 Link spre comentariu
ratza Postat Septembrie 3, 2012 Partajează Postat Septembrie 3, 2012 Te poţi inspira de aici:viewtopic.php?f=214&t=90347 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