Forum www.nestor-electronic.pl Strona Główna www.nestor-electronic.pl
Forum sterowników procesorowych- programy BASCOM
 
 FAQFAQ   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy   RejestracjaRejestracja 
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Sterowanie LED + PWM

 
Napisz nowy temat   Odpowiedz do tematu    Forum www.nestor-electronic.pl Strona Główna -> Pomoc w programowaniu BASCOM
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Maximus22_kr
Nowy


Dołączył: 12 Gru 2010
Posty: 1
Skąd: Kraków

PostWysłany: Nie Gru 12, 2010 4:59 pm    Temat postu: Sterowanie LED + PWM Odpowiedz z cytatem

Witam
Dopiero zaczynam naukę Bascom z pomocą jednego z kursów Ośla Łączka. Procesor AtMega32

Na początek chciałem zrobić coś pożytecznego ( dla mnie ) i korzystając z różnych źródeł "napisałem" przerzutnik T - do sterowania LED ( w przyszłości halogenów LED przez tranzystory ).

Kod mam taki

$regfile = "m32def.dat"
$crystal = 16000000

Config Portb = &B11111111 'wszystkie końcówki jako wyjścia
Portb = &B11111111 'wszędzie stan spoczynkowy 1
Config Portd = &B11110000 ' trzy najmłodsze jako wejścia
Portd = &B01111111 'włączony T2, podciągnięte wejścia

Do 'pętla nieskończona
If Pind.0 = 0 Then 'jesli S1 zwarty
Waitms 20 'czekaj 20 ms
If Pind.0 = 0 Then 'potem znow sprawdź stan S1
If Portb.1 = 1 Then 'badaj bit pomocniczy i gdy ustwiony na 1
Toggle Portb.7 'zmień stan LED
Portb.1 = 0 'zablokuj możliwość zmian
End If
End If
Else 'jeśli S1 nie jest zwarty
Portb.1 = 1 'umożliw Zmiany
End If


'pętla nieskończona
If Pind.1 = 0 Then 'jesli S2 zwarty
Waitms 20 'czekaj 20 ms
If Pind.1 = 0 Then 'potem znow sprawdź stan S2
If Portb.2 = 1 Then 'badaj bit pomocniczy i gdy ustwiony na 1
Toggle Portb.6 'zmień stan LED
Portb.2 = 0 'zablokuj możliwość zmian
End If
End If
Else 'jeśli S2 nie jest zwarty
Portb.2 = 1 'umożliw Zmiany
End If


If Pind.2 = 0 Then 'jesli S3 zwarty
Waitms 20 'czekaj 20 ms
If Pind.2 = 0 Then 'potem znow sprawdź stan S3
If Portb.3 = 1 Then 'badaj bit pomocniczy i gdy ustwiony na 1
Toggle Portb.5 'zmień stan LED
Portb.3 = 0 'zablokuj możliwość zmian
End If
End If
Else 'jeśli S3 nie jest zwarty
Portb.3 = 1 'umożliw Zmiany
End If

Loop

End

Zasadniczo działa, ale można lepiej - np. przy użyciu zmiennych - może ktoś doradzi.

Druga problem - chciałem zrobić to sterowanie ciekawszym i sterować rozjaśnianiem/ściemnianiem tych trzech wyjść.

Mam taki kod
$regfile = "m32def.dat"
$crystal = 16000000

Config Portd = &B11111000
Portd = &B11111111



Config Timer1 = Pwm , Prescale = 1 , Compare A Pwm = Clear Down
' patrz help do Bascoma

Do
If Pind.0 = 0 Then 'jesli S1 zwarty
Waitms 20 'czekaj 20 ms
If Pind.0 = 0 Then
Pwm1a = Pwm1a - 1 'zmiana wartości PWM
Waitms 30
End If
End If

If Pind.1 = 0 Then 'jesli S2 zwarty
Waitms 20 'czekaj 20 ms
If Pind.1 = 0 Then
Pwm1a = Pwm1a + 1 'zmiana wartości PWM
Waitms 30
End If
End If


Loop

End

Nie działa on do końca tak jakbym chciał, tzn jeden przycisk ściemnia a drugi rozjaśnia, ale ten ściemniający po całkowitym zgaszeniu diody zapala ją ponownie na max i znowu przyciemnia. Chciałbym to zrobić na jednym przycisku, naprzemiennie - raz ściemnia raz rozjaśnia.
Założenie było takie
krótkie przyciśnięcie - zgaszenie
krótkie przyciśnięcie - zapalenie
dłuższe przyciśnięcie ( minimum 1 sek ) - zmniejszenie jasności
dłuższe przyciśnięcie ( minimum 1 sek ) - zwiększenie jasności
Każde naciśnięcie powoduje reakcje odwrotną niż poprzednie.

Pozdrawiam
Piotr
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
SunRiv
Zawsze na posterunku


Dołączył: 11 Lut 2009
Posty: 321
Skąd: Opole

PostWysłany: Nie Gru 12, 2010 9:40 pm    Temat postu: Odpowiedz z cytatem

Można naprzykład tak , ale proponuje zapoznac sie najpierw z Timerami
np w oślej łaczce Smile
Kod:

connfig timer0 = timer , prescale = 64

dim i as byte,j as byte
dim s1 as bit

on timer0 czas

enable interupts
enable timer0

do
   //tu wstawiasz obsługe przycisków
   //i ustawienie s1 w zależności czy s1 = 1 czy   s1=0
loop
end 'program

czas:   //ten podprogram wywoływany jest co x ms
           //w zależniści od prescale i częstotliwości kwarcu
  if s1=1 then
     incr(i)
     pwm1a = i       
  end if
   
  if i=255 then
   s1=0;
  end if   

return

_________________
Subaru Libero SDX-SR 94"
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora
Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum www.nestor-electronic.pl Strona Główna -> Pomoc w programowaniu BASCOM Wszystkie czasy w strefie CET (Europa)
Strona 1 z 1

 
Skocz do:  
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach


Powered by phpBB © 2001, 2005 phpBB Group