AT89C2051 - Sterowanie diodą LED.


Witam.
Chciałbym użyć mikrokontrolera z rodziny 8051 do sterowania diodami LED. Nie mogę sobie z tym jednak poradzić. Na samym początku napisałem coś takiego:

$crystal = 12000000
$regfile = "89C2051.DAT"
 
Led1 Alias P1.1
Led2 Alias P1.2
Przycisk1 Alias P1.4
Przycisk2 Alias P1.5
Przycisk3 Alias P1.6
 
Reset Led1
Reset Led2
Reset Przycisk1
Reset Przycisk2
Reset Przycisk3
 
Petlaglowna:
 
Do
If Przycisk1 = 1 Then Gosub Tryb1
Set Led1
Set Led2
Wait 1
Reset Led1
Reset Led2
Wait 1
Loop
 
Tryb1:
Do
If Przycisk1 = 0 Then Gosub Tryb2
Set Led1
Wait 1
Reset Led1
Wait 1
Set Led2
Wait 1
Reset Led2
Wait 1
Loop
 
Tryb2:
Do
If Przycisk1 = 1 Then Gosub Petlaglowna
Set Led1
Set Led2
Loop

Jak widać jest to źle napisane. Nie znam w ogóle żadnego języka programowania. Mój program mógłby działać, ale nie tak jak powinien. Wiem, że muszę to zrobić wykorzystując timer układu AT89C2051 i przerwania. Nie wiem jednak jak to zrobić. Potrzebuję prostego przykładu migającej diody led. Gdyby była też możliwość to proszę o pokazanie w jaki sposób sterować szybkością migania diody.

Dziękuję za pomoc i pozdrawiam.




Portret użytkownika mirley

Re: Miganie

Ten program prawdopodobnie spowoduje zapchanie stosu i zwieszenie się mikrokontrolera, bo skaczesz do procedur a nigdy z nich nie wracach, przy kazdym skoku odkłądają się na stos rejestry ale się nie zdejmują bo nie ma return.

Na początku nie musisz używać timerów.... lepiej żebyś zrozumiał jak napiać program a potem sie timer dołoży.

Aha.... diody powinny być podłaczone do +5V na stałe a zwierane do masy przez procesor, przyciski mają być podłączone od procesora do masy, wykrywany jest stan 0

$crystal = 12000000
$regfile = "89C2051.DAT"
 
Led1 Alias P1.1
Led2 Alias P1.2
Przycisk1 Alias P1.4
Przycisk2 Alias P1.5
Przycisk3 Alias P1.6
 
set Led1
set Led2
set Przycisk1
set Przycisk2
set Przycisk3
 
'zmienne
dim przycisk_licz as byte
dim czas as byte, licznik as byte
 
 
czas = 10
 
Do
if Przycisk1 = 0 then
  incr przycisk_licz1
  if przycisk_licz1 = 5 then
    przycisk_licz1 = 0
    if czas < 255 then incr czas
  End if
end if
 
incr licznik
if licznik >= czas then
  licznik = 0
  Led1 = not led1
end if
 
waitms 10
Loop

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika pavel0910

Czy mógłbyś opisać działanie

Czy mógłbyś opisać działanie tego programu? Czytam polski help do Bascoma i nie mogę zrozumieć. Chciałem zrobić regulację szybkości migania diody, ale nie wychodzi mi to.

Portret użytkownika mirley

Re: Dioda

A sprawdzałeś czy regulacja działa za pomocą przycisku 1. Każde naciśnięcie powinno zmniejszać częstotliwość.

Program cały czas kręci się w Do loop i sprawdza przycisk czy jest zwarty do masy, jeśli jest to zwiększa stan zmiennej, tak w zasadzie to trzeba do tego jeszcze else dopisać:

if Przycisk1 = 0 then
  incr przycisk_licz1
  if przycisk_licz1 = 95 then
    przycisk_licz1 = 0
    if czas < 255 then incr czas
  End if
else
  przycisk_licz1 = 90 
end if

wstaw to wyżej zamiast procedurki co masz w poprzednim poście. Jak pięc razy pętla przejdzie i dalej przycisk jest wciśnięty to nastąpi reakcja na klawisz. zostanie zwiększona zmienna czas.

Poza sprawdzaniem przycisku w tym samym do loop działa licznik, który jest zwiekszany przy każdym przejściu pętli. Jeśli jego wartość jest >= czas to następuje jego zerowanie i zmienianie stanu diody na przeciwny. Od zmiennje czas zalezy ile przejść pętli policzy licznik zanim zmieni stan diody czyli częstotliwość migania. na końcu pętli masz opóźnieni 10ms czyli w uproszczeniu każde przejścię pętli będzie trwało coś około 10ms.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika pavel0910

Dopisałem else i teraz po

Dopisałem else i teraz po naciśnięciu przycisku nie ma żadnej zmiany. Robię wszystko w symulatorze Bascoma 8051.

Na samym początku napisałeś "dim przycisk_licz as byte", a później używałeś "przycisk_licz1". Domyślam się, że to trzeba było zmienić (tak zrobiłem) i pierwszy kod, który podałeś działa. Po naciśnięciu przycisku dioda mruga wolniej, ale jak dołożyć do tego żeby dioda mrugała szybciej po naciśnięciu drugiego przycisku?

Portret użytkownika mirley

Re: Przycisk

Dodać trzeba fragment od drugiego przycisku:

if Przycisk2 = 0 then
  incr przycisk_licz2
  if przycisk_licz2 = 95 then
    przycisk_licz2 = 0
    if czas > 1 then decr czas
  End if
else
  przycisk_licz2 = 90 
end if

Obsługa obu przycisków powinna wyglądać dokładnie tak. Z tym else musi działać.... symulatora nigdy nie używałem więc nie wiem jak do końca on działa

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.