Program Attiny2313 " knight rider efekt" i multipleksacja diod


Witam wszystkich,

Potrzebuje pomocy w napisaniu programu, którego rolą jest przelewanie 5 z 28 diód od lewej do prawej i spowrotem. Całość była podzielona na 4sekcje dlatego potrzebna jest multipleksacja .

Próbowałem napisać ten program , lecz moje doświadczenie w programu jest nikłe nie licze na to że wogule by to zadziałało( dołączam kod).
5 diód musi pływać , najlepiej jakby jeszcze była regulacja prędkości pływania

  '*************konfig*********
 
 $regfile = "attiny2313.dat"
$crystal = 8000000
 
 
 
'*********zmienne**********
Dim Mux As Byte
Dim Licz1 As Byte
Dim Sekcja1 As Byte
Dim Sekcja2 As Byte
Dim Sekcja3 As Byte
Dim Sekcja4 As Byte
 
'*********petla************
   Set Licz1
 
Do
Prawo:
   Incr Licz1
   If Licz1 = 40 Then
   Gosub Lewo
   Else
   Gosub Efekty
End If
 
Lewo:
  Decr Licz1
  If Licz1 = 0 Then
  Gosub Prawo
  Else
  Gosub Efekty
End If
 
Efekty:
  Sekcja1 = Licz1
  If Sekcja1 > 7 Then
  Sekcja1 = 12
End If
 
 
  Sekcja2 = Licz1
  If Sekcja2 < 8 Or Sekcja2 > 19 Then
   Sekcja2 = 12
   Else
   Sekcja2 = Sekcja2 - 11
End If
 
 
   Sekcja3 = Licz1
   If Sekcja3 < 20 Or Sekcja3 > 31 Then
   Sekcja3 = 12
   Else
   Sekcja3 = Sekcja3 - 20
End If
 
 
   Sekcja4 = Licz1
   If Sekcja4 < 32 Then
   Sekcja4 = 12
   Else
   Sekcja4 = Sekcja4 - 32
End If
 
'*********wyswietlanie*******
 
Incr Mux
  If Mux = 4 Then Mux = 0
 
  Select Case Mux
    Case 0:
     Set Portd.2
 
     Sekcja1 = Lookup(sekcja1 , Tabela)
      Portb = Sekcja1
     Reset Portd.2
 
    Case 1:
     Set Portd.3
     Sekcja2 = Lookup(sekcja2 , Tabela)
      Portb = Sekcja2
     Reset Portd.3
 
    Case 2:
     Set Portd.4
 
     Sekcja3 = Lookup(sekcja3 , Tabela)
     Portb = Sekcja4
     Reset Portd.4
 
     Case 3:
     Set Portd.5
 
     Sekcja4 = Lookup(sekcja4 , Tabela)
     Portb = Sekcja4
     Reset Portd.5
  End Select
 
 
 
Loop
 
 
Tabela:
   Data 254 , 252 , 248 , 240 , 224 , 193 , 131 , 135 , 143 , 159 , 191 , 255
'****** sk1  ,  2   ,  3  , 4  ,sp5   , 6  , kk7   , 8  ,  9  ,  10 , 11 , kp0
'sk- start sekwencji4
'kk- koniec sekwencji4
'sp- start sekwencji1
'kp- koniec sekwencji1




Portret użytkownika matrix

Re: Program Attiny2313 " knight rider efekt" i multipleksacja di

Ja mam gotowy na atmega8 i multiplex na CD4067. W sumie 48 diod które pływają i do tego jest regulacja prędkości plus obsługa wyświetlacza lcd a na nim temperatura z jednego czujnika LM35 plus pomiar napięcia akumulatora samochodowego. Jak skończę to przedstawię projekt. Całość prawie zrobiona, zostało tylko złożyć.

Portret użytkownika Poszu

Re: Program Attiny2313

Z miłą chęcią obejrze twój projekt, tylko że mi nie jest potrzebne aż tyle wodotrysków do jednego bajeru ;]

Portret użytkownika matrix

Re: Program Attiny2313

Musziałem użyć do projektu atmega8 bo pamięć ma sporą a kod zajął dość dużo miejsca.

Portret użytkownika Poszu

błąd w kodzie

poprawiłem swój kod lecz jest w nim jeden błąd
Error:61 Line:133 Label not found [_ENDIF0 ]

prosze o pomoc w jego wyeliminowaniu

  '*************konfig*********
 
 $regfile = "attiny2313.dat"
$crystal = 16000000
 
 Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
 
Enable Interrupts
 
'*********zmienne**********
Dim Flaga As Bit
Dim Mux As Byte
Dim Licz1 As Byte
Dim Sekcja1 As Byte
Dim Sekcja2 As Byte
Dim Sekcja3 As Byte
Dim Sekcja4 As Byte
Dim Co200ms As Byte
Dim Kierunek As Bit
Reset Mux
Reset Flaga
Reset Licz1
Set Kierunek
'*********petla************
 
Do
Gosub Wyswietl
   If Flaga = 1 Then Flaga = 0
 
      Select Case Kierunek
      Case 0:
         Incr Licz1
         If Licz1 = 39 Then
            Reset Kierunek
            Else
         End If
 
      Case 1:
         Decr Licz1
         If Licz1 = 0 Then
            Set Kierunek
            Else
         End If
 
      End Select
      Gosub Efekty
   Else
Loop
 End
 
Efekty:
   Sekcja1 = Licz1
   If Sekcja1 > 7 Then
   Sekcja1 = 12
End If
 
   Sekcja2 = Licz1
   If Sekcja2 < 8 Or Sekcja2 > 19 Then
   Sekcja2 = 12
   Else
   Sekcja2 = Sekcja2 - 11
End If
 
 
   Sekcja3 = Licz1
   If Sekcja3 < 20 Or Sekcja3 > 31 Then
   Sekcja3 = 12
   Else
   Sekcja3 = Sekcja3 - 20
End If
 
 
   Sekcja4 = Licz1
   If Sekcja4 < 32 Then
   Sekcja4 = 12
   Else
   Sekcja4 = Sekcja4 - 32
End If
Return
 
 
 '***********timer************
Prztimer0:
Timer0 = 0
Incr Co200ms
If Co200ms = 50 Then
   Co200ms = 0
   Flaga = 1
End If
Return
 
 
 
'*********wyswietlanie*
Wyswietl:
Incr Mux
  If Mux = 4 Then Mux = 0
 
  Select Case Mux
    Case 0:
     Set Portd.2
 
     Sekcja1 = Lookup(sekcja1 , Tabela)
      Portb = Sekcja1
     Reset Portd.2
 
    Case 1:
     Set Portd.3
     Sekcja2 = Lookup(sekcja2 , Tabela)
      Portb = Sekcja2
     Reset Portd.3
 
    Case 2:
     Set Portd.4
 
     Sekcja3 = Lookup(sekcja3 , Tabela)
     Portb = Sekcja4
     Reset Portd.4
 
     Case 3:
     Set Portd.5
 
     Sekcja4 = Lookup(sekcja4 , Tabela)
     Portb = Sekcja4
     Reset Portd.5
  End Select
 
Return
 
Tabela:
   Data 254 , 252 , 248 , 240 , 224 , 193 , 131 , 135 , 143 , 159 , 191 , 255
'****** sk1  ,  2   ,  3  , 4  ,sp5   , 6  , kk7   , 8  ,  9  ,  10 , 11 , kp0

Portret użytkownika matrix

Re: błąd w kodzie

Wywala Ci błąd bo na końcu pętli

do
loop

masz tylko dyrektywę
else

a brak
end if

Portret użytkownika mirley

Re; program lED

Błąd jest w pierwszej części:

Do
Gosub Wyswietl
   If Flaga = 1 Then Flaga = 0    'flaga = 0 powinna być w nowej linijce bo w ifie jest jeszcze więcej operacji
 
      Select Case Kierunek
      Case 0:
         Incr Licz1
         If Licz1 = 39 Then
            Reset Kierunek
            Else          'po co ten else? 
         End If
 
      Case 1:
         Decr Licz1
         If Licz1 = 0 Then
            Set Kierunek
            Else 'po co ten else? 
         End If
 
      End Select
      Gosub Efekty
   Else    'po co ten else? powinno tu byc end if
Loop
 End

Sprawdź tak:

Do
Gosub Wyswietl
If Flaga = 1 Then 
  Flaga = 0   
  Select Case Kierunek
    Case 0:
      Incr Licz1
      If Licz1 = 39 Then
        Reset Kierunek   
      End If
    Case 1:
      Decr Licz1
      If Licz1 = 0 Then
        Set Kierunek
      End If 
  End Select
  Gosub Efekty
end if
Loop
End

-

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 Poszu

Re: program

Dziekuje za pomoc
zaprogramowalem attiny2313 tym programem lecz w ukladzie testowym nie widac zadnej reakcji
fusebity

schemat pogladowy
http://schematukladupdf.patrz.pl
lub
http://www.speedyshare.com/files/26382642/untitled.pdf

kondensatory przy rezonatorze 22pf
rezonator 16mhz
rezystory 330ohm

wrazie problemow z odszyfrowaniem
anody sa połączone po 7x do portów pd2...pd5
katody sa łączone po 4x przez rezystory do portów pb1...pb7

Portret użytkownika mirley

Re: diody

na początku programu dodaj konfigurację porów:

Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111111 : Portd = &B11111111

całego programu jeszcze nie analizowałem...

Wrazie dalszych kłopotow napisz najpierw program na 8 diod a potem pomyślisz co nie idzie. Przynajmniej wytestujesz czy sam układ 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 Poszu

Re:Re: diody

Dzieki mirley ;)

okiełznałem potwora tylko teraz jeszcze potrzebuje tabeli a nie bardzo ja potrafie przeliczyc
jesli chcialbym teraz ustawic przez

Tabela:
Data 'tutaj pokolei liczby po przecinku

to wzor jest 255 - 2^(potega jest numerem portu)
tylko wtedy odejmowac trzeba jesli portb(numer) = 1
czyli
przyklad portb.0 = 1 portb.1 = 1 portb.7 = 1
255 - 2^0 - 2^1 - 2^7
dobrze rozumiem?

Portret użytkownika mirley

Re: Porty

Port w liczbie binarnej są w naturalnej kolejnosi, to znaczy że piny 7,6...1,0 odpowiadają kolejnym bitom liczby binarnej 11111110 (1 to stan wysoki na pinie a 0 to stan niski, w przykładzie wszystkie piny sa w stanie wysokim poza portx.0, który jest w stanie niskim) najpierw ustaw sobie stan binarny który chcesz przliczyc na dziesiętny a potem uzyj kalkulatora do zamiany wartości.

W większości przypadków do tabeli najłatwiej jest od razu wpisac binarne liczby:

Tabela:
Data &B11111110, &B11111101, &B11111011 'itd

-

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.