ATtiny2313 sterowanie LED - kod


Witam. Mam problem. trochę dziwny bo nie miałem wcześniej styczności z programowaniem układów, a muszę zaprogramować akurat coś takiego. Przeglądałem kilka stron w necie, nic z tego nie rozumiem, no prawie nic bo udało mi się przerobić jeden kod na coś takiego co mi potrzebne. Posiadam programator zbudowany wedlug schematu Dybkowskiego, i programy ISP Programmer, ISP Flash Programmer i Bascom AVR.

Oto kod"

Config Portd = Output
Config Portb = Output
 
Config Pind.6 = Input
 
Portd = 127
Portb = 255
 
Dim Linijka As Word
 
 
Do
 
Linijka = &B0000001100000011
Gosub Przypisanie
Gosub Opoznienie
 
Linijka = &B0000011110000011
Gosub Przypisanie
Gosub Opoznienie
 
Linijka = &B0000111111000011
Gosub Przypisanie
Gosub Opoznienie
 
Linijka = &B0001111111100011
Gosub Przypisanie
Gosub Opoznienie
 
Linijka = &B0011111111110011
Gosub Przypisanie
Gosub Opoznienie
 
Linijka = &B0111111111111011
Gosub Przypisanie
Gosub Opoznienie
 
Linijka = &B1111111111111111
Gosub Przypisanie
Gosub Opoznienie
 
Linijka = &B0111111111111011
Gosub Przypisanie
Gosub Opoznienie
 
Linijka = &B0011111111110011
Gosub Przypisanie
Gosub Opoznienie
 
Linijka = &B0001111111100011
Gosub Przypisanie
Gosub Opoznienie
 
Linijka = &B0000111111000011
Gosub Przypisanie
Gosub Opoznienie
 
Linijka = &B0000011110000011
Gosub Przypisanie
Gosub Opoznienie
 
Linijka = &B0000001100000011
Gosub Przypisanie
Gosub Opoznienie
 
Linijka = &B0000010010000011
Gosub Przypisanie
Gosub Opoznienie
 
Linijka = &B0000100001000011
Gosub Przypisanie
Gosub Opoznienie
 
Linijka = &B0001000000100011
Gosub Przypisanie
Gosub Opoznienie
 
Linijka = &B0010000000010011
Gosub Przypisanie
Gosub Opoznienie
 
Linijka = &B0100000000001011
Gosub Przypisanie
Gosub Opoznienie
 
Linijka = &B1000000000000111
Gosub Przypisanie
Gosub Opoznienie
 
Linijka = &B0100000000001011
Gosub Przypisanie
Gosub Opoznienie
 
Linijka = &B0010000000010011
Gosub Przypisanie
Gosub Opoznienie
 
Linijka = &B0001000000100011
Gosub Przypisanie
Gosub Opoznienie
 
Linijka = &B0000100001000011
Gosub Przypisanie
Gosub Opoznienie
 
Linijka = &B0000010010000011
Gosub Przypisanie
Gosub Opoznienie
 
Loop
 
Przypisanie:
Portb.0 = Linijka.15
Portb.1 = Linijka.14
Portb.2 = Linijka.13
Portb.3 = Linijka.12
Portb.4 = Linijka.11
Portb.5 = Linijka.10
Portb.6 = Linijka.9
Portb.7 = Linijka.8
Portd.0 = Linijka.7
Portd.1 = Linijka.6
Portd.2 = Linijka.5
Portd.3 = Linijka.4
Portd.4 = Linijka.3
Portd.5 = Linijka.2
Return
 
Opoznienie:
Waitms 80
Return
 End

zastanawia mnie to - &B0000010010000011 bo z tego co zrozumialem jest tu 16 wyjsc, a wedlug ukladu jest 14.

Nie wiem o co chodzi z tymi fuse-bitami. W sumie to nie wiem nic procz tego jak podlaczyc uklad pod programator;/

Jesli ktos bylby tak mily i mi rozjasnil troche to bym byl wdzieczny...
Pozdrawiam




Portret użytkownika gosc

bo o to chodzi ze na poczatku

bo o to chodzi ze na poczatku ma sie wszystko zapalic, a pozniej zgasnac i ma chodzic powtarzajaca sie sekwencja. w pony prog normalnie robi weryfikacje cala, w ISP tak samo, a w bascomie wywala blad.
zgadza sie to co wgrywam z tym co odczytuje... nie mam pojecia o co chodzi, pierwszy raz tak mam. do tej pory na tym samym programie wszystko bylo normalnie. jeszcze sproboje z mocniejszym zasilaczem

Portret użytkownika kretman4

wlaczanie programu przyciskiem

Mam pewien problem.
Korzystając z tego że mam 2 procki 2313 postanowilem je wykorzystac.

Oto kod:

'************* Konfiguracja uC *****************
'***********************************************
$regfile = "attiny2313.dat"
$crystal = 4000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B00000000 : Portd = &B00000000
 
'Config Timer0 = Timer , Prescale = 8
'Enable Timer0 : On Timer0 Prztimer0
'Enable Interrupts
 
Dim Leds As Word                                            'stan diod
Dim Licznik As Byte
Dim X As Word
 
Leds = &B0011111111110000
 
Do
 Select Case Licznik
   Case 0 : Leds = &B0011111111111111
   Case 1 : Leds = &B0011111111110000
   ....................
  Case 48 : Leds = &B0011111111110000
  Case 49 : Leds = &B0011111111111111
  Case 50 : Leds = &B0011111111110000
 
 End Select
 
 
 
 Waitms 8
 
 
 X = Leds Mod 256
 Portb = X
 X = Leds / 256
 Portd = X
 
Loop
End

Kombinowałem już na kilka sposobów ale bez ingerencji kogoś z umiejętnościami się nie obejdzie. Przy takich ustawieniach jakie są obecnie wpisane (4MHz, waitms 8) chodzi idealnie, ale tylko jesli zrobie powtarzanie kolejki. Mi chodzi o to żeby nic się nie świeciło do momentu wciśnięcia przycisku podpiętego na port PD6 (zwierany do masy). Po wciśnięciu przycisku żeby się włączyła ta cała kolejka z polecenia Case, a po skończeniu z powrotem wszystko było wyłączone.
Mógłby ktoś mi pomóc? bo już nie wyrabiam psychicznie nad tym :) Z góry dzięki!

Portret użytkownika mirley

Re: Diody

'************* Konfiguracja uC *****************
'***********************************************
$regfile = "attiny2313.dat"
$crystal = 4000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B00111111 : Portd = &B00000000
 
'Config Timer0 = Timer , Prescale = 8
'Enable Timer0 : On Timer0 Prztimer0
'Enable Interrupts
 
Dim Leds As Word                                            'stan diod
Dim Licznik As Byte
Dim X As Word
Dim flaga as bit 
 
 
Leds = &B0011111111110000   'stan jaki będzie podczas zgaszenia
 
Do
 If Flaga = 1 Then
   Select Case Licznik
    Case 0 : Leds = &B0011111111111111
    Case 1 : Leds = &B0011111111110000
     ....................
    Case 48 : Leds = &B0011111111110000
    Case 49 : Leds = &B0011111111111111
    Case 50 : 
       Leds = &B0011111111110000
       Flaga = 0
  End Select
 Else
   Leds = &B0011111111110000 'stan jaki będzie podczas zgaszenia
 End If
 
 if pind.6 = 0 then flaga = 1
 
 
 Waitms 8
 
 
 X = Leds Mod 256
 Portb = X
 X = Leds / 256
 X.6 = 1
 Portd = X
 
Loop
End

Popatrz teraz. Powinno działać. trzeba dodać zmienną flaga i sprawdzić stan przycisku. Zmieniłem typ wyprowadzeń portu D na wyjścia i tylko d6 ma być wejściem

-

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 kretman4

No więc wygląda to tak.

No więc wygląda to tak. miałem do podłączenia 20 LED i buzerek piezo. Z tego względu że 2313 ma maksymalne obciążenie 20mA na port, to podzielilem diody i podlaczylem z 4 wyjsc na tranzystory NPN. no i jest to dziwne bo dziala w taki sposob ze wszystko co jest w kodzie attiny ustawione na wylaczone to w rzeczywistosci sie swieci, a jesli sie pojawi sygnal to sie wylacza (cos jakby robi sie zwarcie i nie swieci). Generalnie dziala odwrotnie niz powinno, dlatego jest przekrecony kod (wlaczenie/wylaczenie portow).
A po dodaniu tej czesci z wlacznikiem jest tak ze, jesli zewre wejscie do masy to nie chodzi sekwencja tylko wszystkie porty uaktywaniaja sie na stale, i dioda caly czas swieci, bez jakiegos ograniczenia czasowego. Nie mam pojęcia o co tu moze chodzic. Tranzystory podlaczylem tak jak to bylo opisane na twoim forum.

Portret użytkownika mirley

Re: Tranzystory

Jak dasz tranzystor NPN podłączony bazą do procesora, emiterem do masy a na kolektorze będą diody z rezystorami podłączone do + zasilania to nie ma sie co dziwić że stan sie odwraca. Tranzystor działa przecież jak negator w takiej konfiguracji. Wysoki stan na bazie włącza tranzystor i potencjał kolektora staje się niski, powodując zaświecenie diody. Jak baza pójdzie do masy to diody zgasną....

stan jaki będzie podczas wygaszenia musisz sobie wpisać do zmiennej LEDS:

....
Else
   Leds = &B0000000000000000 'stan jaki będzie podczas zgaszenia
 End If

Jak dasz same zera to tranzystory się wyłączą i diody zgasną

-

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 kretman4

No dobra ale mialem

No dobra ale mialem programowane tylko te podrty pod ktore podlaczylem cokolwiek. Fakt faktem ze nie dziala ta opcja z wlacznikiem :(

Portret użytkownika mirley

Re: led

Zmień jeszcze to:

Config Portd = &B00111111 : Portd = &B00000000

na

Config Portd = &B00111111 : Portd = &B11111111

pin na którym jest wejście przycisku powinien być ustawiony w stan 1, czyli podciągnięty do + zasilania.

-

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 kretman4

niestety to nic nie zmieniło.

niestety to nic nie zmieniło. bo zwarciu PD6 do masy wlacza sie i caly czas swieci...

Portret użytkownika mirley

Re: Diody

Czy wszystkie diody podłączone są poprzez tranzystory? Nie widzę błędu w programie. Jeśli wszędzie są tranzystory to 0 logiczne powinno je zgasić.... chyba że masz PNP od strony zasilania, to wtedy zmienia postać rzeczy.

-

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 gosc

tak to wygląda, miałem czas

tak to wygląda, miałem czas to rozrysowałem :) łatwiej coś zrozumieć.

Portret użytkownika mirley

Re: Tranzystor

Jest tak jak pisałem wcześniej. Jeśli masz wątpliwości to wyjmij procka z podstawki. Weź kabelek podłączony z jednej strony do 5V i dotykaj po kolei do pinów portu w pustej podstawce. Tranzystory powinny się włączać

-

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 gosc

Sprawdziłem jak napisałeś.

Sprawdziłem jak napisałeś. Tranzystory działają prawidłowo. A układ cały dalej nic. Po zwarciu pinu do masy załącza się na stałe i na tym koniec.

Portret użytkownika mirley

Re: led

Chwila ..... a gdzie modyfikujesz wartość licznika?

Dopisz zaraz po waitms 8:

incr Licznik
if licznik > 50 then licznik = 0

-

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 kretman4

Wreszcie coś ruszyło! Odpala

Wreszcie coś ruszyło!
Odpala się, ale po wciśnięciu przycisku odtwarza sekwencję do 20 pozycji i koniec. nie wiem w czym może być problem. podaję to co mam w kodzie na samym końcu

  Case 50 :
       Leds = &B0000000000000000
       Flaga = 0
 
  End Select
 
 Else
 
   Leds = &B0000000000000000                                'stan jaki będzie podczas zgaszenia
 
  End If
 If Pind.6 = 0 Then Flaga = 1
 
 Waitms 8
 
 Incr Licznik
 If Licznik > 50 Then Licznik = 0
 
 X = Leds Mod 256
 Portb = X
 X = Leds / 256
 X.6 = 1
 Portd = X

zastanawia mnie polecenie "end if" które pojawia się tylko raz, a poleceń if jest więcej, chyba że działa to inaczej niż mi się wydaje.

mimo wszystko dzięki za rozwikłanie tejże zagadki!

Portret użytkownika mirley

Re: Diody

End if jest potrzebny jak w ifie jest więcej niż jedna linijka. Jak piszesz w jednej linni ifa i po then jedno polecenie to end if nie trzeba. Jak polecenie po if jest w nowej linijce lub jest więcej poleceń to wtedy na końcu pisze się end if

-

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 kretman4

Nie wiem o co chodzi. Po

Nie wiem o co chodzi. Po włączeniu zasilania jest wszystko ok, zewrę pin z masą włącza się cała sekwencja, a następnym razem włączają się 3/4. I po pierwszym włączeniu procek tak jakby wariuje, bo nie odpala pełnego schematu.. Co może być przyczyną? No bo jak sam stwierdziłeś w kodzie jest wszystko ok.

Portret użytkownika mirley

Re: LED

To zwiększanie licznika i jego ograniczanie

 Incr Licznik
 If Licznik > 50 Then Licznik = 0

Wstaw zaraz po sprawdzaniu flagi, czyli po if flaga=1 .......

-

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 demsy1

X = Leds Mod 256 Portb = X

X = Leds Mod 256
 Portb = X
 X = Leds / 256
 Portd = X

W miejscu X trzeba coś wstawić?

Portret użytkownika mirley

Re: Diody

X to zmienna pomocnicza, zadeklarowana na początku programu. Typ byte

-

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 demsy1

$regfile =

               $regfile = "attiny2313.dat"
$crystal = 1000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111111 : Portd = &B11111111
 
'Config Timer0 = Timer , Prescale = 8
'Enable Timer0 : On Timer0 Prztimer0
'Enable Interrupts
 
Dim Leds As Word
Dim Licznik As Byte
Dim X As Word
Dim Opu as byte
 
Leds = &B0000000000000000
Opu = 100
 
 Opu = 100
Do
 Select Case Licznik
   Case 0 : Leds = &B0011111111111111
   Case 1 : Leds = &B1001111111111111
   Case 2 : Leds = &B1100111111111111
   Case 3 : Leds = &B1110011111111111
   Case 4 : Leds = &B1111001111111111
   Case 5 : Leds = &B1111100111111111
   Case 6 : Leds = &B1111110011111111
   Case 7 : Leds = &B1111111001111111
   Case 8 : Leds = &B1111111100111111
   Case 9 : Leds = &B1111111110011111
  Case 10 : Leds = &B1111111111001111
  Case 11 : Leds = &B1111111111100111
  Case 12 : Leds = &B1111111111110011
  Case 13 : Leds = &B1111111111111001
  Case 14 : Leds = &B1111111111111100
  Case 15 : Leds = &B1111111111111100
  Case 16 : Leds = &B1111111111111100
  Case 17 : Leds = &B1111111111111001
  Case 18 : Leds = &B1111111111110011
  Case 19 : Leds = &B1111111111100111
  Case 20 : Leds = &B1111111111001111
  Case 21 : Leds = &B1111111110011111
  Case 22 : Leds = &B1111111100111111
  Case 23 : Leds = &B1111111001111111
  Case 24 : Leds = &B1111110011111111
  Case 25 : Leds = &B1111100111111111
  Case 26 : Leds = &B1111001111111111
  Case 27 : Leds = &B1110011111111111
  Case 28 : Leds = &B1100111111111111
  Case 29 : Leds = &B1001111111111111
 
 End Select
 
 Incr Licznik
 If Licznik = 30 Then Licznik = 1
 
 Waitms Opu
 If Pind.6 = 0 Then                                         'lepiej dać zwieranie do masy niz do zasilania więc 0.
  opu = opu -10
  If Opu < 10 Then Opu = 100
  Waitms 1000
end if
 
 X = Leds Mod 256
 Portb = X
 X = Leds / 256
 Portd = X
 
Loop
End

Jak mogę zmienić program by uzyskać efekt zwiększania szybkości lub zmniejszania po zwarciu do masy przez PD.6?

Portret użytkownika mirley

Re: opoznienie

To co masz powinno dokładnie tak 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.

Portret użytkownika demsy1

Gdy przycisk jest rozwarty to

Gdy przycisk jest rozwarty to stopniowo przyśpiesza efekt przejscia, a gdy zwieram do masy to prędkość się stabilizuje. Chciałbym każdym naciśnięciem przycisku zwiększać prędkość o np: 10%

Portret użytkownika mirley

Re: konfiguracja portów

zmień konfigurację na początku. Ma być:

Config Portd = &B10111111 : Portd = &B11111111

przecież 6 pin ma być wejściem. Nie zauważyłem tego wcześniej

-

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 demsy1

Zmieniłem ale jest taka sama

Zmieniłem ale jest taka sama sytuacja.

Portret użytkownika mirley

Re: Diody

A co się dzieje jak zmieniasz na początku programu wartośc opu (np opu = 10, opu = 100, opu = 250)i nie dotykasz przycisku? Zwróć uwagę że jak trzymasz przycisk to cały czas wywoływany jest dodatkowy waitms 1000 w obsłudze przycisku... Aha zamień tego waitms 1000 na wait 1 bo tak powinno być.

-

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 demsy1

Zmieniłem na opu = 250 i

Zmieniłem na opu = 250 i efekt jest podobny tyle ze w dłuższym czasie przyśpiesza bez wciskania przycisku

Portret użytkownika mirley

Re: Diody

A jak wogóle wywalisz tego ifa z odczytem pind.6 to co się dzieje? powinno działać ze stałą prędkością, ustawianą w zmiennej opu na początku

-

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 demsy1

Pozmieniałem tak żeby

Pozmieniałem tak żeby zapalała się jedna dioda, a nie tak jak niżej dwie i jest teraz dobrze.

Select Case Licznik
   Case 0 : Leds = &B0011111111111111
   Case 1 : Leds = &B1001111111111111
   Case 2 : Leds = &B1100111111111111
   Case 3 : Leds = &B1110011111111111
   Case 4 : Leds = &B1111001111111111
   Case 5 : Leds = &B1111100111111111
  ...................................
  Case 29 : Leds = &B1001111111111111

zrobiłem tak

Case 0 : Leds = &B1111111111111111
   Case 1 : Leds = &B0111111111111111
   Case 2 : Leds = &B1011111111111111
   Case 3 : Leds = &B1101111111111111
   Case 4 : Leds = &B1110111111111111
   Case 5 : Leds = &B1111011111111111
    .................................
  Case 30 : Leds = &B0111111111111111

potrafi kolega wyjaśnić czemu tak się działo?

Portret użytkownika mirley

Re: Diody

To przypadek stany diod nie mają tu znaczenia..... popatrz za to na linijkę

Portd = X

tu też jest błąd. Wpisujemy stany wszystkich portów co powoduje wyłączenie podciągania na pd6 jak trafi się akurat w zmiennej 0. Trzeba by spróbowac zamiast tego tak:

Portd = X or &B11000000

-

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 demsy1

Portd = X or &B11000000 Bez

Portd = X or &B11000000

Bez wstawiania &B11000000 też jest dobrze

Portret użytkownika gosc

Witam serdecznie Chciałbym

Witam serdecznie
Chciałbym się dowiedzieć jak mogę dopisać do tego programu niżej przycisk.
Naciskam np: S1 włączają się po kolei diody od case 0 do case 14 mija 15 sekund i wyłącz się po kolei od case 14 do case 0

               $regfile = "attiny2313.dat"
$crystal = 1000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111111 : Portd = &B11111111
 
'Config Timer0 = Timer , Prescale = 8
'Enable Timer0 : On Timer0 Prztimer0
'Enable Interrupts
 
Dim Leds As Word
Dim Licznik As Byte
Dim X As Word
Dim Opu as byte
 
Leds = &B0000000000000000
Opu = 100
 
 Opu = 100
Do
 Select Case Licznik
   Case 0 : Leds = &B0011111111111111
   Case 1 : Leds = &B0001111111111111
   Case 2 : Leds = &B0000111111111111
   Case 3 : Leds = &B0000011111111111
   Case 4 : Leds = &B0000001111111111
   Case 5 : Leds = &B0000000111111111
   Case 6 : Leds = &B0000000011111111
   Case 7 : Leds = &B0000000001111111
   Case 8 : Leds = &B0000000000111111
   Case 9 : Leds = &B0000000000011111
  Case 10 : Leds = &B0000000000001111
  Case 11 : Leds = &B0000000000001111
  Case 12 : Leds = &B0000000000000011
  Case 13 : Leds = &B0000000000000001
  Case 14 : Leds = &B0000000000000000
 
 
 End Select
 
 Incr Licznik
 If Licznik = 15 Then Licznik = 1
 
 
end if
 
 X = Leds Mod 256
 Portb = X
 X = Leds / 256
 Portd = X
 
Loop
End

Portret użytkownika mirley

Re: Led

Na samym początku trzeba by uruchomić timer żeby nie latało to tak w do loop bez ładu i składu. Szczególnie jak będziesz chciał odmierzać sensownie te 15 sekund i jeszcze przyciski obsługiwać. Konfigurację timera masz na początku zakomentowaną:

Config Timer0 = Timer , Prescale = 8
Enable Timer0 : On Timer0 Prztimer0
Enable Interrupts

Na końcu programu dodajesz obsługę przerwania:

Prztimer0:
 Timer0 = 6
 
 
 
'to wykonuje się co 6ms
 
Return

teraz trzeba by w tej obsłudze przerwania dopisać ustawianie zmiennych tak zwanych flag typu bit. Np

Prztimer0:
 Timer0 = 6
 Set F_6ms
 incr dzielnik 
 if dzielnik = 10 then   'licz do 10 czyli 6ms *10
   dzielnik = 0
   set F_60ms
 end if
Return
[/qb
 
I teraz w pętli głównej można już taktować działanie programu:
 
[qb]
Do
 
  if F_6ms = 1 then
    F_6ms = 0
 
    'tutaj np sprawdzanie klawiatury patrz: moje kody źródłowe na ten temat i inne programy   
  end if
 
 
  if F_60ms = 1 then
    F_60ms = 0
    'tutaj co 60 ms można obsługiwać zmianę aktualnie świecącej diody
  end if
 
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 gosc

chcialem sobie zrobić

chcialem sobie zrobić oświetlenie schodowe. więc będzie potrzebna obsługa 2- uch przycisków

Portret użytkownika mirley

Re: Oświetlenie

No to nie ma problemu tylko w miejscu obsługi flagi F_6ms w pętli głównej dajesz odczyt dwóch klawiszy. Korzystasz z konstrukcji:

  If Sw1 = 0 Then 'sw1 to pin 
    Incr Sw_licz(1)  'zmienna typu byte
    If Sw_licz(1) = 10 Then
 
     'reakcja na klawisz, działa po  60ms za pierwszym razem a jak się trzyma to co 256*6ms     
 
    End If
  Else
    Sw_licz(1) = 0
  End If

-

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 gosc

Wyszło mi coś takiego, ale

Wyszło mi coś takiego, ale chyba coś brakuje

$regfile = "attiny2313.dat"
$crystal = 1200000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111100 : Portd = &B11111111
 
Config Timer0 = Timer , Prescale = 8
Enable Timer0 : On Timer0 Prztimer0
Enable Interrupts
 
 
Dim Sw_licz As Byte
Dim F_60ms As Bit
Dim F_6ms As Bit
Dim Dzielnik As Word
Dim Leds As Word
 
Sw1 Alias Pind.0
 
Leds = &B0000000000000000
 
Prztimer0:
 Timer0 = 6
 Set F_6ms
 incr dzielnik
 If Dzielnik = 10 Then                                      'licz do 10 czyli 6ms *10
   dzielnik = 0
   set F_60ms
 end if
Return
 
 
 
Do
 
 
  Select Case Dzielnik
   Case 0 : Leds = &B0011111111111111
   Case 1 : Leds = &B0001111111111111
   Case 2 : Leds = &B0000111111111111
   Case 3 : Leds = &B0000011111111111
   Case 4 : Leds = &B0000001111111111
   Case 5 : Leds = &B0000000111111111
   Case 6 : Leds = &B0000000011111111
   Case 7 : Leds = &B0000000001111111
   Case 8 : Leds = &B0000000000111111
   Case 9 : Leds = &B0000000000011111
  Case 10 : Leds = &B0000000000001111
  Case 11 : Leds = &B0000000000001111
  Case 12 : Leds = &B0000000000000011
  Case 13 : Leds = &B0000000000000001
  Case 14 : Leds = &B0000000000000000                       'I teraz w pętli głównej można już taktować działanie programu:
  End Select
 
  if F_6ms = 1 then
    F_6ms = 0
 
    If Sw1 = 0 Then                                         'sw1 to pin
    Incr Sw_licz(1)                                         'zmienna typu byte
    If Sw_licz(1) = 10 Then
 
                                                             'reakcja na klawisz, działa po  60ms za pierwszym razem a jak się trzyma to co 256*6ms
 
    End If
  Else
    Sw_licz(1) = 0
  End If                                                    'tutaj np sprawdzanie klawiatury patrz: moje kody źródłowe na ten temat i inne programy
  end if
 
 
  if F_60ms = 1 then
    F_60ms = 0
                                                            'tutaj co 60 ms można obsługiwać zmianę aktualnie świecącej diody
  End If
 
Loop

Portret użytkownika demsy1

koledze wyżej chodzi chyba o

koledze wyżej chodzi chyba o coś takiego: http://www.youtube.com/watch?v=Ir_cqS6oV5U&feature=watch_response
fajny bajer, Też bym sobie taki zmontował

Portret użytkownika mirley

Re: oświetlenie

No dokładnie o tym samym myśleliśmy

$regfile = "attiny2313.dat"
$crystal = 1200000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111100 : Portd = &B11111111
 
Config Timer0 = Timer , Prescale = 8
Enable Timer0 : On Timer0 Prztimer0
Enable Interrupts
 
 
Dim Sw_licz As Byte
Dim F_60ms As Bit
Dim F_6ms As Bit
Dim Dzielnik As Word
Dim Leds As Word
Dim Licznik as byte
Dim on_off as bit
 
 
Sw1 Alias Pind.0
 
Leds = &B0000000000000000
 
Prztimer0:
 Timer0 = 6
 Set F_6ms
 incr dzielnik
 If Dzielnik = 100 Then                                      'licz do 10 czyli 6ms *10
   dzielnik = 0
   set F_60ms
 end if
Return
 
 
 
Do
 
  if F_6ms = 1 then
    F_6ms = 0
 
    If Sw1 = 0 Then                                         'sw1 to pin
    Incr Sw_licz(1)                                         'zmienna typu byte
    If Sw_licz(1) = 10 Then
 
    on_off = 1
 
    End If
  Else
    Sw_licz(1) = 0
  End If                                                    'tutaj np sprawdzanie klawiatury patrz: moje kody źródłowe na ten temat i inne programy
  end if
 
 
  if F_60ms = 1 then
    F_60ms = 0
 
    if on_off = 1 then
    Select Case Licznik
     Case 0 : Leds = &B0011111111111111
     Case 1 : Leds = &B0001111111111111
     Case 2 : Leds = &B0000111111111111
     Case 3 : Leds = &B0000011111111111
     Case 4 : Leds = &B0000001111111111
     Case 5 : Leds = &B0000000111111111
     Case 6 : Leds = &B0000000011111111
     Case 7 : Leds = &B0000000001111111
     Case 8 : Leds = &B0000000000111111
     Case 9 : Leds = &B0000000000011111
     Case 10 : Leds = &B0000000000001111
     Case 11 : Leds = &B0000000000001111
     Case 12 : Leds = &B0000000000000011
     Case 13 : Leds = &B0000000000000001
     Case 14 : Leds = &B0000000000000000                       'I teraz w pętli głównej można już taktować działanie programu:
    End Select
 
     if licznik = 15 then on_off = 0 
 
     X = Leds Mod 256
     Portb = X
     X = Leds / 256
     Portd = X
    else
      Licznik = 0
    end if
 
  End If
 
 
Loop

Spróbuj to... poza obsługą flag nic nie umieszczaj w do loop bo po to jest timer żeby działało to w określonych chwilach. Powinno sie teraz zapalić sekwencyjnie, nad gaszeniem sam pomyśl

-

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 gosc

Błąd

Wyskakuje mi błąd przy

 X = Leds Mod 256
     Portb = X

Portret użytkownika demsy1

Błąd

Jak się nie mylę to powinno być jeszcze na początku

Dim X As Word

Portret użytkownika mirley

Re: X

Dokładnie tak..... jak się pisze z palca to tak jest potem :) Dopisz deklarację przy innych zmiennych..... tak na marginesie to w przyszłości planuję sam zrobić taki wyłącznik z dwoma fotokomórkami na dole i na górze schodów...... tym linkiem to demsy1 dokładnie trafiłeś w to co będę robił :)

-

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 gosc

Oświetlenie schodowe

Ja również mam zamiar zbudować taki sterowni z czujnikami ruchu na pierwszym i ostatnim stopniu.

Portret użytkownika maro

Czy ten kod podany przez

Czy ten kod podany przez kolega Mirleya jest kompletny do wykonania tego sterownika?

Portret użytkownika mirley

Re; LED

Kod nie jest kompletny... staramy sie wspólnie coś stworzyć.. żeby dopisać cały kod i dobrze go przetestować trzeba czasu, którego cały czas mi brakuje

-

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 maro

sterowanie

Podłączyłem ten układ na płytce stykowej i muszę powiedzieć że nie działa. Po zwarciu pinu D.0 nic się nie dzieje. który pin będzie jako sw2?
Dodam jeszcze że po wgraniu wcześniejszego kodu diody mrugają w stylu Night Rider

Portret użytkownika mirley

Re: LED

Chyba zapomnieliśmy dopisać zwiększania licznika:

Do
 
  if F_6ms = 1 then
    F_6ms = 0
 
    If Sw1 = 0 Then                                         'sw1 to pin
    Incr Sw_licz(1)                                         'zmienna typu byte
    If Sw_licz(1) = 10 Then
 
    on_off = 1
 
    End If
  Else
    Sw_licz(1) = 0
  End If                                                    'tutaj np sprawdzanie klawiatury patrz: moje kody źródłowe na ten temat i inne programy
  end if
 
 
  if F_60ms = 1 then
    F_60ms = 0
 
    if on_off = 1 then
    Select Case Licznik
     Case 0 : Leds = &B0011111111111111
     Case 1 : Leds = &B0001111111111111
     Case 2 : Leds = &B0000111111111111
     Case 3 : Leds = &B0000011111111111
     Case 4 : Leds = &B0000001111111111
     Case 5 : Leds = &B0000000111111111
     Case 6 : Leds = &B0000000011111111
     Case 7 : Leds = &B0000000001111111
     Case 8 : Leds = &B0000000000111111
     Case 9 : Leds = &B0000000000011111
     Case 10 : Leds = &B0000000000001111
     Case 11 : Leds = &B0000000000001111
     Case 12 : Leds = &B0000000000000011
     Case 13 : Leds = &B0000000000000001
     Case 14 : Leds = &B0000000000000000                       'I teraz w pętli głównej można już taktować działanie programu:
    End Select
 
     incr Licznik                        'tego brakowało.......teraz powinno być ok
     if licznik = 15 then on_off = 0 
 
     X = Leds Mod 256
     Portb = X
     X = Leds / 256
     Portd = X
    else
      Licznik = 0
    end if
 
  End If
 
 
Loop

żeby sprawdzić dla pewności czy klawiatura działa w miejscu obsługi wstaw toogle port:

 If Sw1 = 0 Then                                         'sw1 to pin
    Incr Sw_licz(1)                                         'zmienna typu byte
    If Sw_licz(1) = 10 Then
 
    on_off = 1
    toggle portx.x            'tu zmień na odpowiedni pin    
 
    End If
  Else
    Sw_licz(1) = 0
  End If     

-

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 maro

Wstawiłem incr Licznik ale

Wstawiłem

 incr Licznik 

ale dopiero po 15 razie gdy wcisnąłem przycisk to tylko na chwilkę błysnęły wszystkie diody i dalej nic, po wstawieni

 toggle portd.0

było to samo.

Ma ktoś jakiś pomysł?

Portret użytkownika mirley

Re: Program

Spróbuj ten program....

$regfile = "attiny2313.dat"
$crystal = 12000000                                         '
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111100 : Portd = &B11111111
 
Config Timer0 = Timer , Prescale = 8
Enable Timer0 : On Timer0 Prztimer0
Enable Interrupts
 
 
Dim Sw_licz(1) As Byte
Dim F_60ms As Bit
Dim F_6ms As Bit
Dim Dzielnik As Word
Dim Leds As Word
Dim Licznik as byte
Dim on_off as bit
Dim X As Word
 
Sw1 Alias Pind.0
 
Leds = &B0000000000000000
 
 
Do
 
  if F_6ms = 1 then
    F_6ms = 0
 
    If Sw1 = 0 Then                                         'sw1 to pin
    Incr Sw_licz(1)                                         'zmienna typu byte
    If Sw_licz(1) = 10 Then
 
    on_off = 1
 
    End If
  Else
    Sw_licz(1) = 0
  End If                                                    'tutaj np sprawdzanie klawiatury patrz: moje kody źródłowe na ten temat i inne programy
  end if
 
 
  if F_60ms = 1 then
    F_60ms = 0
 
    if on_off = 1 then
    Select Case Licznik
     Case 0 : Leds = &B0011111111111111
     Case 1 : Leds = &B0001111111111111
     Case 2 : Leds = &B0000111111111111
     Case 3 : Leds = &B0000011111111111
     Case 4 : Leds = &B0000001111111111
     Case 5 : Leds = &B0000000111111111
     Case 6 : Leds = &B0000000011111111
     Case 7 : Leds = &B0000000001111111
     Case 8 : Leds = &B0000000000111111
     Case 9 : Leds = &B0000000000011111
     Case 10 : Leds = &B0000000000001111
     Case 11 : Leds = &B0000000000001111
     Case 12 : Leds = &B0000000000000011
     Case 13 : Leds = &B0000000000000001
     Case 14 : Leds = &B0000000000000000                       'I teraz w pętli głównej można już taktować działanie programu:
    End Select
 
    Incr Licznik
    If Licznik = 15 Then On_off = 0
 
     X = Leds Mod 256
     Portb = X
     X = Leds / 256
     Shift X , Left , 1
     Portd = X Or &B00000001
    else
      Licznik = 0
    end if
 
  End If
 
 
Loop
 
Prztimer0:
 Timer0 = 6
 Set F_6ms
 incr dzielnik
 If Dzielnik = 100 Then                                      'licz do 10 czyli 6ms *10
   dzielnik = 0
   set F_60ms
 end if
Return

po pierwsze częstotliwość to 12000000 a nie 1200000 a po drugie to przerwanie timera ma być pod pętlą główną

Testowałem to i u mnie działa. Reaguje na kliknięcia i zaświeca diody na porcie b

-

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 maro

Sterownik schodowy

Wgrałem kod i u mnie też działa, ale jeszcze nie do końca tak jak chciałem. Zwieram pind.0 do masy zapala się kolejno dioda, ale nie chcą gasnąć

Portret użytkownika mirley

Re: LED

Bo nie mają gasnąć... widzisz przecież że w programie tego nie ma.... Trzeba będzie dołożyć zmienne:

Dim W as word

Dodatkowo trzeba będzie dołożyć kolejne case z sekwencją gaszenia i zmodyfikować fragment:

......
    Incr Licznik
    If Licznik = 15 or 30 Then On_off = 0
 
    if licznik = 30 then licznik = 0
 
     X = Leds Mod 256
     Portb = X
     X = Leds / 256
     Shift X , Left , 1
     Portd = X Or &B00000001
    else
     if licznik <> 0 then
      incr W
      if W = 220 then on_off = 1
     else
      w = 0
     end if 
    end if
 
  End If

-

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 maro

Zaraz za Case 14 : Leds =

Zaraz za

Case 14 : Leds = &B0000000000000000   

dokładamy
Case 15....
Case 16....
...........
...........
...........
Case 30....
?