Sari la conținut
ELFORUM - Forumul electronistilor

Probleme de incepatori


ole

Postări Recomandate

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

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 IfReturn
Dar 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 ClockOverflow
doar 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

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

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

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 Ovfi1Return
Am 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

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

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

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

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

Cred ca voi folosi 2 timere. Unul doar pentru lungimea pulsului si altul ca sa numar pulsurile/secunda

Dacă 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

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
  • 1 lună mai târziu...

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 IfLoop
cam 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
  • 2 săptămâni mai târziu...

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

post-66708-139829483558_thumb.jpg

post-66708-139829483559_thumb.jpg

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