Sari la conținut
ELFORUM - Forumul electronistilor

BASCOM


yo9hnf

Postări Recomandate

  • 5 luni mai târziu...

Salutare.

Vreau sa aprind un led, folosind un atmega,de fapt este un test.

Ce comanda trebuie sa dau tinand cont ca voi folosi PWM1.

 

Sa il aprind la o anumita intensitate stiu, dar nu stiu cum sa cresc intensitatea cu fiecare apasare de buton, 

$regfile "m8def.dat"$crystal = 1000000	Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Prescale = 1Config Portd.4 = InputSet Portd.4Light Alias Pind.4 Do   If Light = 1 ThenCompare1a = 300	End If LoopEnd 
Link spre comentariu

In primul rind creaza o variabila pentru "Compare1a = 300", poate "Dim Valoare As Word(sau alt tip)", astfel "Compare1a = Valoare".

Defineste butoane :

Creste Alias Pinb.0

Scade Alias Pinb.1

 

si:

 

Valoare = 100

 

Do

 

if creste = 0 then Incr Valoare  'buton

if scade = 0 then Decr Valoare 'buton

waitms = 1  'temporizare pentru creste sau descreste "Valoare" cu o viteza rezonabila, fara va creste/descreste instantaneu

Compare1a = Valoare

 

Loop

 

Ce am scris este pur teoretic, e netestat, dar cam asta ar fi idea, mai trebuie implementat in soft limita maxima si limita minima pe care o poate lua "Valoare", o sa-ti dai seama de ce mai este nevoie.....

Editat de nickrvl
Link spre comentariu

La multi ani tuturor romanilor!

 

Foloseste "Debounce".

Cam asa ar trebui sa arate comenzile:

Main:Do  Debounce Pind.4 , 0 , Up_count , Sub ' up_count este o subrutina  Debounce Pind.5 , 0 , Dn_count , Sub' dn_count este o subrutinaCall CalcCall Disp'Call IdoicLoop
Link spre comentariu

Am un atmega16 si m-am pus sa fac practic, pe un cablaj de test, dar din pacate nu stiu cum sa continui codul, mai exact cum sa implementez limita minima si maxima,  banui ca din acea cauza nu functioneaza nu are nici un efect, codul pe care il folosesc este mai jos.

'$sim$regfile "m16def.dat"$crystal = 1000000	Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Prescale = 1Config Porta.0 = InputConfig Porta.1 = InputSet Porta.0Set Porta.1   Creste Alias Pina.0Scade Alias Pina.1Dim Valoare As Word          Valoare = 100 Do If Creste = 0 Then Incr Valoare                             'buton If Scade = 0 Then Decr Valoare                              'buton  Waitms 200                                                  'temporizare pentru creste sau descreste "Valoare" cu o viteza rezonabila, fara va creste/descreste instantaneu COMPARE1A = Valoare Loop

@nico, am incercat ceva si cu, codul de la tine, dar cum nu am experienta prea multa, nu am reusit nimic...

Editat de costyy86
Link spre comentariu

Am refacut codul altfel, functioneaza doar ca nu stiu ca mai sus sa implementez limita maxima si minima, astfel ca la mine cand ajunge la maxim si mai apas odata o ia iarasi de la minim si viceversa...

 

'$sim$regfile "m16def.dat"$crystal = 1000000	Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Prescale = 1Config Porta.0 = InputConfig Porta.1 = InputSet Porta.0Set Porta.1   Creste Alias Pina.0Scade Alias Pina.1Dim Valoare As Word	Do If Creste = 1 ThenValoare = Valoare + 50Waitms 100End If  If Scade = 1 ThenValoare = Valoare - 50Waitms 100Compare1a = Valoare End If LoopEnd 
Link spre comentariu

limita se face cam asa

if creste = 1 then  if valoare < 1000 then    valoare = valoare + 50  end ifwaitms 100end if

in loc de 1000 pui valoarea care trebuie la tine , nu m-am uitat atent , asa incat ultima incrementare cu 50 sa nu depaseasca maximul . La minim pui valoare >= 50 ca scazand inca 50 sa ajunga la 0

Editat de Depanatoru
Link spre comentariu

Multumesc, functioneaza "aproapte" bine, la minim nu vrea sa se duca la zero deloc, ramane la 50, sau daca pun alte valori, sa spunem 10, la minim ramane la 10 nu vrea sa coboare la zero, la maxim merge bine..

Link spre comentariu

Nu, am pus, uite codul mai jos.

 

$regfile "m16def.dat"$crystal = 1000000	Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Prescale = 1Config Porta.0 = InputConfig Porta.1 = InputSet Porta.0Set Porta.1   Creste Alias Pina.0Scade Alias Pina.1Dim Valoare As Word	Do If Creste = 1 Then       If Valoare < 1000 ThenValoare = Valoare + 100Waitms 150 End IfEnd If   If Scade = 1 Then           If Valoare >= 100 ThenValoare = Valoare - 100 Waitms 150Compare1a = Valoare End IfEnd If  LoopEnd 
Link spre comentariu

Gata am descoperit, lipseste un "=" din urmatoarea comanda, cel cu rosu

 

If Creste = 1 Then
       If Valoare <= 1024 Then
Valoare = Valoare + 100
Waitms 150
 
Multumesc.
 
L.E. Dar daca tin apasat pe butonul scade, dupa ce ajunge la zero, sare la tensiunea maxima, aprinde ledul la maxim atat timp cat tim butonul apasat, de ce?
Editat de costyy86
Link spre comentariu

Cred ca ar trebui sa mai introduci o conditie care sa nu-ti permita sa mai folosesti butonul cand s-a ajuns la valoaea maxima/minima.

Ceva de genul:

if valoare<=minim(maxim) then valoare =minim(maxim)

insa trebuie sa-ti stabilesti tu limitele "minim", respectiv "maxim".

Link spre comentariu

 

 

 
 
L.E. Dar daca tin apasat pe butonul scade, dupa ce ajunge la zero, sare la tensiunea maxima, aprinde ledul la maxim atat timp cat tim butonul apasat, de ce?

 

De ce ... nu e buna logica programului , daca nu pui codul complet nimeni nu poate stii .

Link spre comentariu

Codu complet, l-am pus mai sus postu #415, dar pana la urma am dibuit, se comporta ok, trebuia la butoane  "if creste 0 then" nu 1 then, si acum se comporta bine, se opreste unde il setez eu..

Multumesc.

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