Sari la conținut
ELFORUM - Forumul electronistilor

Probleme de incepatori


Postări Recomandate

  • 2 săptămâni mai târziu...

Buna ziua,am citit cred ca toate discutiile despre timere, in spcial timer o si tot nu am reusit sa realizez ce imi propun.Vreau sa masor cu timer0 o durata de timp in care un semnal la intrarea in t1(timerul pe 16 biti) trece o singura data din 1 logic in 0 logic sa zicem.ar insemna ca timer 1 are valoarea 1, adica a facut o singura numarare pt ca semnalul se va modifica o singura data.fara sa pun nici un semnal la t1 sau si daca pun tot repeta aceleasi valori pe lcd $regfile = "m8535.dat"$crystal = 8000000'----------Config Lcd = 16 * 2Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portb.2 , Db6 = Portb.5 , Db7 = Portb.0 , E = Portd.7 , Rs = Portc.4Cursor OffDeclare Sub Displays Dim Timercounter As Byte Dim Count1 As Byte'-----------Config Timer1 = Counter , Edge = RisingDdrb.1 = 0Portb.1 = 1Config Porta = Output'-------Config Timer0 = Timer , Prescale = 1024'---------------Enable Timer1Enable Timer0Enable InterruptsDim A As Long , B As Byte , I As LongTimercounter = 0Count1 = 0ClsLocate 1 , 1Lcd "TEST"Locate 2 , 1Lcd "COMM ITC"Wait 5ClsCount1 = Timer1Start Timer0If Count1 = 1 ThenCall DisplaysEnd If'--------------Displays:Stop Timer0ClsHomeTimercounter = Timer0Lcd "durata:"Locate 2 , 1Lcd Timercounter ; " s" Start Timer0 ReturnVa rog mult daca poate cineva sa mi spuna unde gresesc.

Link spre comentariu
Vizitator AEMelectronic

buna searacine ma poate ajuta cu o schema pt o telecomanda cu 3-4 canale(telecomanda radio)si un receptor ?vreau in momentul in care armez un buton pe telecomanda sa porneasca un motor iar cand decuplez butonul sa se decupleze si motorular fi minunat daca ambele ar folosi ATmega8eu am gasit pe net dar am gasit cu PIC iar ce am gasit cu ATmega8 nu ma prea este ceea ce imi trebuie mie

Link spre comentariu
  • 4 săptămâni mai târziu...
Vizitator mihai_atanasiu

Buna seara,

 

incerc sa fac un fel de ciclo computer dintr-un Arduino uno; am citit pe net si am vazut ca cea mai sigura solutie este folosirea intreruperilor;

 

pentru inceput mi-am propus sa fac partea cu numararea rotatiilor pe baza unui releu reed; pentru simplificare am folosit in loc de reed un micro intrerupator conectat la pinul 2 digital;

 

un program simplu ar fi:

   unsigned long wheelRotations = 0;   void setup() {         Serial.begin(9600);         attachInterrupt(0, wheelISR, CHANGE);   }    void wheelISR()    {         wheelRotations++;        Serial.println(wheelRotations);    }

Teoretic acest scurt program ar trebui sa scrie la portul serial nr de rotatii; prin apasarea butonului se apeleaza functia wheelISR().

 

Problema este ca mi se pare ca nu functioneaza corect; variabila wheelRotations se incrementeaza incorect. Daca apas repetitiv pe buton cu o cadenta fixa de 10 ori in mod normal variabila wheelRotations ar trebui sa ajunga la valoarea 10; dar citeodata la o apasare a butonului se incrementeaza de 2-3 ori;

 

deci in loc de 1,2,3,4,5,6,7,8,9,10

 

apare asa: 1,2,3,6,9,10,11,13.......

 

am gresit ceva in cod ? M-am uitat si la functia attachInterrupt() sa vad daca pot inlocui evenimentul CHANGE cu RISING sau FALLING dar comportamentul este similar.

 

Stie cineva care ar fi problema ?

Link spre comentariu
Vizitator mihai_atanasiu

Citeste despre (soft) debouncing.Butoanele nu-s perfecte, asa ca la orie apasare oscileaza si genereaza mai multe pulsuri.

M-am gindit ca la o apasare de buton se pot produce mai multe "apasari"; ca sa verific am conectat si un releu reed si se comporta la fel sau aproape asemanator;
Link spre comentariu

La orice contact mecanic, inclusiv la relee reed, apar vibraţii mecanice pe o durată de ordinul milisecundelor. În perioada vibraţiilor mecanice apar multe impulsuri electrice foarte scurte. Microcontrolerul, fiind foarte rapid, le percepe ca pe un şir de apăsări repetate.

 

Ca să scapi de problema asta, cum ţi-a mai spus şi Liviu M,

Citeste despre (soft) debouncing.

Link spre comentariu
Vizitator mihai_atanasiu

am citit despre debouncing; mai sigura mi se pare varianta hardware; am gasit un exemplu de soft debouncing si l-am testat; functioneaza pentru 200ms; problema este ca la mine este posibil sa am o frecventa putin mai mare de 5hz si atunci se pierd informatii.Pentru moment o sa folosesc varianta soft; multumesc pt raspunsuri;

Link spre comentariu
Vizitator mihai_atanasiu

ratza, tocmai asta vroiam sa scriu; multumes pt sugestie; am pus un condensator de 100 nF si acum functioneaza corect; nu mai "tremura" micro intrerupatorul; functioneaza si cu releul reed;

 

citisem de aseara ca varianta cu condensator este cea mai sigura;

 

acum o sa va spun si ce fac: un ciclo computer pentru o bicicleta electrica care pe linga informatiile legate de distanta si viteza va colecta si informatii electrice de la baterie prin intermediul unui senzor de curent si tensiune.

Produsul exista de cumparat (http://www.ebikes.ca/drainbrain.shtml), am deja unul la bicicleta dar m-a prins "flama" ca as putea sa concep si eu unul.

 

Voi vedea cit de departe pot sa merg;

 

Cind o sa am o varianta cit de cit acceptabila o sa dau mai multe detalii.

Link spre comentariu

@INCEPATOR21:

Mai jos ai programul modificat pentru a indeplini cerintele tale.

Nu am insistat prea m ult pentru perierea programului, asta o poti face si tu, in cazul in care mai intampini unele "lipsuri de finete".

Ca o observatie: afisorul pare a fi conectat cam dezlanat, de obicei este conectat la pinii aceluiasi port.

$regfile = "m8535.dat"$crystal = 8000000'----------Config Lcd = 16 * 2Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portb.2 , Db6 = Portb.5 , Db7 = Portb.0 , E = Portd.7 , Rs = Portc.4Cursor OffDeclare Sub DisplaysDim Timercounter As ByteDim Count1 As Byte , Flag As Bit'-----------Config Timer1 = Counter , Edge = RisingDdrb.1 = 0Portb.1 = 1Config Porta = Output'-------Config Timer0 = Timer , Prescale = 256                      ' Prescalerul a fost modificat de mine pentru simularea bunei functionari a programului'---------------                                              ' Atentie! Chiar cu valoarea de 1024 nu vei obtine o masuratoare in unitati de secunda.Enable Timer1Enable Timer0Enable InterruptsDim A As Long , B As Byte , I As LongTimercounter = 0Count1 = 0Timer1 = 0Timer0 = 0ClsDoFlag = 1Count1 = Timer1Start Timer0If Count1 = 1 Then Call DisplaysIf Flag = 1 Then Gosub Static_msgLoop'--------------Displays:Stop Timer0ClsHomeTimercounter = Timer0ClsLcd "durata:"Locate 2 , 1Lcd Timercounter ; " s"Timer1 = 0Flag = 0Start Timer0ReturnStatic_msg:HomeLocate 1 , 1Lcd "TEST"Locate 2 , 1Lcd "COMM ITC"Flag = 1Return
Link spre comentariu
  • 4 săptămâni mai târziu...

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