Sari la conținut
ELFORUM - Forumul electronistilor

Timp asteptare "WAIT" program BASCOM !


Cilibiu

Postări Recomandate

Vreau sa stiu cat trebuie sa scriu in program ca in realitate sa fie 1 secunda?Am facut ceva teste, si se pare ca nu prea coincide realitatea cu programul, asta din cauza RC-ului intern, care la mine este de 8MHz. Am scris in bascom "wait 1" si in realitate a asteptat mul mai putin!Programul este mic, trebuie sa comand 4 obiecte la un anumit interval de timp!Iar ca MCU folosesc ATMEGA8!Stiti cumva vreo formula de calcul?

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

Top autori în acest subiect

  • Cilibiu

    12

  • ywar2

    3

  • yo9hnf

    3

  • picolo

    3

Top autori în acest subiect

WAITMS mSNo accurate timing is possible with this command.In addition, the use of interrupts can slow this routine.http://avrhelp.mcselec.com/

......................................."Depending on the used XTAL the asm code "Nu vreaus a fie extrem de precis.Daca o data asteapta 1 secunda ,a doua oiara asteapta 700ms si a treia oara asteapta 1.4 secunde, nui problema, la mine diferenta este foarte mare, cred ca asteapta cam 200ms la "Wait 1", nu stiu exact, dar daca nu imi puteti macar da ceva mai explicit sau vreo formula de calcul ca daca scri "wait 1" la 8MHZ in realitate astepata "X" secunde!Daca nu voi fi nevoit sa rescriu codul cu modificari pana la apropierea timpului de asteptare!O zi buna tuturor!Ce ai scris mai sus deja stiam!
Link spre comentariu

Daca tot stiai ceea ce a postat colegul de forum inseamna ca stii si sa folosesti unul din Timere pentru a realiza intarzierea dorita, conform foii de catalog a ATMEGA 8 si a notei de aplicatie "AVR130: Setup and use the AVR Timers

Link spre comentariu

Salut. Pe timpuri cind ma jucam cu HC85 si voiam sa fac o intirziere de timp 'reglabila' foloseam o bucla for - next in care nu executam nimic. In functie de lungimea ei era si timpul de asteptare. Cind am trecut la cod masina, principiul a fost lafel numai ca acum puteam corecta acuratetea calculind pe tacti in parte cit dura concret o bucla. Ma gindesc ca lafel s-ar putea face si in Bascom dar fiind vorba de un oscilator intern cred ca precizia va lasa mult de dorit. Pe curind!!!

Link spre comentariu

Nu prea ai cum sa ajungi la eroare de 20% chiar daca este cu RC.Doar daca sunt generate intreruperi foarte des si dureaza tratarea lor.Daca nu este ceva secret, pune codul ala care produce eroare asta la wait.Este posibil sa gresesti in alta parte.

Link spre comentariu

Ascesta este programul care ruleaza :

Unde este semnul exclamari, acolo trebuie cat de cat sa fie apropiata valoarea scrisa de realitate!

DoIf Pind.2 = 1 Then                                          ' daca bujia este pornita mai mult deIncr NIf N > 10 Then                                              ' 5 minuteGoto St2                                                    ' sare la program de oprire de urgentaEnd IfEnd IfAdcv = Getadc(1)                                            'citeste temperatura camerei de ardere   Volt = Adcv * Dif   Volt = Volt / Volt_divIf Volt > 4.2 Then                                          ' daca temperatura camerei de ardere are 100 gradePortd.2 = 0                                                 ' opreste bujiaElsePortd.2 = 1                                                 ' porneste bujiaEnd IfIf Pinb.0 = 0 Then                                          ' daca primeste semnal de oprireGoto St                                                     ' sare la program de oprireEnd IfAdcv = Getadc(0)                                            'citeste temperatura apei   Volt = Adcv * Dif   Volt = Volt / Volt_divIf Volt > 2.2 Then                                          ' daca temperatura depaseste 90 gradeGoto Whai                                                   ' oprire partiala a programuluiEnd IfIf Volt > 1.24 Then                                         ' daca temperatura apei ajunge la 70 gradePortd.4 = 1                                                 ' releu ONElsePortd.4 = 0                                                 ' releu OFFEnd IfPortd.3 = 1                                                 ' pompa de motorina 1 inpulsWaitms 200                                                  ' se astepta 200msPortd.3 = 0                                                 ' pompa de motorina revine in pozitia OFFWait 1                                        ''!!!!!!!!!!!!!!!! trebuie sa astepte in jur de 2 secunde

Restul timpilor am scris wait 1 deoarece inca nu am decis anumiti timpi, dar nu sunt asa inportanti, daca are eroare cu 5 secunde , nu ma deranjeaza.

Problema este unde am pus semnul exclamari , care ar trebui sa astepte in jur de 2 secunde!

Link spre comentariu

Ai postat o bucatica din program.Rutinele wait trebuie sa stie cat ai frecventa oscilator.Incearca sa pui mai multe detalii despre config.Eu unul , daca m-as afla in locul atmelului ala, intentionat functinam anormaldaca vedeam in ce hal este scris codul sursa.BASIC, BASIC, dar nici chiar asa.

Link spre comentariu

In ce "HAL " e scris codul sursa?Mah tu cum ai vrea sa arate? cu flori pe la colturi?Am zis destuld e clar, freventa este de 8MHZ, ce vrei mai mult, restul nu te intereseaza, o data ce se ruleaza doar Do-LOOP! Tot nu inteleg de ce vrei tu tot codul!In locul tau ma puneam sa dorm decat sa scriu critit intr-un post, in care macar nu ai zis nimik de timpi de asteptare!Si ce sa mai zic de ATMELU cu inteligenta artificiala care functioneaza dupa cum ii place cum e scris codul! :ras: Tot codul arata exact cum trebuie sa arata, pe mine ma intereseaza doar timpi din acest MAIN PROGRAM, do-loop!De ce sa postez tot codul? ce importanta are daca doar acest MAIN PROGRAM ruleaza?Nu vrei si schema und evine pus atmelu?Vrei cam multe!Ce este atat de greu sa scri o formul de calcul ?De exemplu am intrun cod care foloseste un timer, am o valoare care pentru o citire de durata doar 1 secunda, trebuie sa scri valoarea de "30" la o frecventa de 8Mhz ca citirea sa dureze exact o secunda!Ce mare lucru ar fi si pentru "wait"?Deja sunt o gramada de raspunsuri dar raspunsurile sunt tot pe langa!

Link spre comentariu

Salut. Daca nu gasesti valoarea apropiata ptr 1 secunda eu zic sa incerci altfel, desii daca este vorba de oscilator intern e posibil sa varieze. Leaga la controler un led si un push buton. Scrie o portiune mica de program in care la apasarea butonului sa porneasca o asteptare de 100 ...1000 secunde si cind termina de numarat sa aprinda ledul. Cronometreaza timpul in secunde si vezi cit dureaza. Vezi cu cit timpul masurat este mai mic sau mai mare decit cel setat, stabileste un raport si aplica-l valorii initiale de 100...1000 secunde si apoi refa testul. Cred ca acuratetea cea mai mare este atunci cind timpul de cronometrare si masurat este mai mare. Rezultat poti sa obtii dar... nu este reproductibil, caci fiecare controler in parte are alte valori la oscilatorului intern. Este o idee... daca vrei poti sa o incerci. Bafta !!!

Link spre comentariu

Nu vreau sa ma bag si eu peste, dar intreb asa: Ai setat fusebitii exact pentru osc.intern de 8MHz? de ce intreb; daca ai setat cumva altfel oscilatorul intern, si apoi ai stat in config program alta valoare a osc. se poate ca sa-ti mearga tot programul mai repede decat ai dori de fapt datorat tocmai acestei diferente de setare. Mie mi s-a intamplat sa setez fuzebitii pentru osc.intern de 4MHz si in program aveam alta setare de 1MHz si nu stiam de ce totul se petrecea mai repede decat as fi vrut, pana mi-am dat seama. Eventual verifica si asta. Folosind "WATIMS" in loc de "WAIT" ai precizie mai buna si utilizezi mai putina memorie de program. Poti scrie "Waitms 2000" in loc de "Wait 2". Rutina:---------------------If Volt > 2.2 Then ' daca temperatura depaseste 90 gradeGoto Whai ------------------------eu as fi scris-o:---------------------DoIf Volt>2.2 Then NOPLoop until Volt<2.2-----------------Sper sa te ajute sugestiile mele. Toate bune.

Link spre comentariu

Salut. Daca nu gasesti valoarea apropiata ptr 1 secunda eu zic sa incerci altfel, desii daca este vorba de oscilator intern e posibil sa varieze. Leaga la controler un led si un push buton. Scrie o portiune mica de program in care la apasarea butonului sa porneasca o asteptare de 100 ...1000 secunde si cind termina de numarat sa aprinda ledul. Cronometreaza timpul in secunde si vezi cit dureaza. Vezi cu cit timpul masurat este mai mic sau mai mare decit cel setat, stabileste un raport si aplica-l valorii initiale de 100...1000 secunde si apoi refa testul. Cred ca acuratetea cea mai mare este atunci cind timpul de cronometrare si masurat este mai mare. Rezultat poti sa obtii dar... nu este reproductibil, caci fiecare controler in parte are alte valori la oscilatorului intern. Este o idee... daca vrei poti sa o incerci. Bafta !!!

Mersi de sfat, este o idee buna, dar daca folosesc oscilator extern, se in bunatateste precizia?

Nu vreau sa ma bag si eu peste, dar intreb asa: Ai setat fusebitii exact pentru osc.intern de 8MHz? de ce intreb; daca ai setat cumva altfel oscilatorul intern, si apoi ai stat in config program alta valoare a osc. se poate ca sa-ti mearga tot programul mai repede decat ai dori de fapt datorat tocmai acestei diferente de setare. Mie mi s-a intamplat sa setez fuzebitii pentru osc.intern de 4MHz si in program aveam alta setare de 1MHz si nu stiam de ce totul se petrecea mai repede decat as fi vrut, pana mi-am dat seama. Eventual verifica si asta. Folosind "WATIMS" in loc de "WAIT" ai precizie mai buna si utilizezi mai putina memorie de program. Poti scrie "Waitms 2000" in loc de "Wait 2". Rutina:---------------------If Volt > 2.2 Then ' daca temperatura depaseste 90 gradeGoto Whai ------------------------eu as fi scris-o:---------------------DoIf Volt>2.2 Then NOPLoop until Volt<2.2-----------------Sper sa te ajute sugestiile mele. Toate bune.

Am setat fuse biti cum trebuie, daca nu ai grija il blochezi.Iar a doua varianta o stiu, dar nu am aplicato pentru ca subrutina "whait" este acesata de mai multe DOO LOOP, si dece sa implementez alte DO-LOOP UNTIL cand pot avea o singura subrutina acesata cu GOTO!Multumesc de ajutor!
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