Skip to content

Instantly share code, notes, and snippets.

@rafalw
Created September 25, 2012 09:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rafalw/3780776 to your computer and use it in GitHub Desktop.
Save rafalw/3780776 to your computer and use it in GitHub Desktop.
3 efekty świetlne na 8 LED-ów i mikrokontroler.
' 3 efekty świetlne na 8 LED-ów i mikrokontroler.
$regfile = "attiny2313.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
' Poniższa dyrektywa musi być aktywna dla avrdude, stk500.exe oraz AVRStudio;
' Programator USBASP z poziomu Bascoma wymaga binarnego wsadu do EEPROM (domyślnie)
'$eepromhex
$eeprom
' Definicje efektów świetlnych
' 1 - Od lewej do prawej i z powrotem
Leftright:
Data 128 , 64 , 32 , 16 , 8 , 4 , 2 , 1 , 2 , 4 , 8 , 16 , 32 , 64
' 2 - Od lewej do prawej czwórkami
Leftrightfour:
Data 129 , 66 , 36 , 24 , 36 , 66
' 3 - Tylko do prawej
Toright:
Data 128 , 64 , 32 , 16 , 8 , 4 , 2 , 1
' 4 - Tylko do lewej
Toleft:
Data 1 , 2 , 4 , 8 , 16 , 32 , 64 , 128
$data
' Czas wyświetlania (dla efektu nie sterowanego timerem)
Const Lr4 = 16
' Port B jako wyjścia
Config Portb = &B11111111
' Stan spoczynkowy portu B to 0
Portb = &B00000000
' Bity 6, 5 i 4 portu D jako wejścia
Config Portd = &B1000111
' Stan spoczynkowy portu D to 1
Portd = &B1111111
' Wyświetlaniem normalnej linijki będzie sterował timer0 - następna dioda zapalana co ok. 16ms
Config Timer0 = Timer , Prescale = 256
' Włączamy obsługę przerwań i przerwanie timera 0
Enable Interrupts
Enable Timer0
' Ustawiamy podprogram obsługi przerwania timera 0
On Timer0 Przesun_linijke
' Funkcja realizująca efekt świetlny (deklaracja)
' address - adres w EEPROM początku tablicy z definicją efektu
' maxcount - maksymalna wartość licznika pętli (liczba elementów w/w tablicy - 1)
Declare Sub Effect(address As Byte , Byval Maxcount As Byte)
Dim I As Byte , Tmp As Byte ' licznik pętli, zmienna pomocnicza do wyznaczania adresu w EEPROM
Dim Iters As Byte ' licznik pętli dla timera Timer0
Dim Addr As Byte ' zmienna przechowująca adres początku tabeli w pamięci EEPROM
' Okazuje się, że port D nie od razu ma wartości spoczynkowe ustalone...
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Iters = 0
Do
' W pętli sprawdzane są po kolei bity od najmłodszego do najstarszego,
' więc wyzerowanie kilku na raz będzie zinterpretowane jako naciśnięcie
' jednego (tego, który pierwszy został wyzerowany); może to sprawiać wrażenie
' losowości.
If Pind.3 = 0 Then ' efekt czwórek
Addr = Loadlabel(leftrightfour)
Effect Addr , 5
Elseif Pind.4 = 0 Then ' efekt "do prawej"
Addr = Loadlabel(toright)
Effect Addr , 7
Elseif Pind.5 = 0 Then ' efekt "do lewej"
Addr = Loadlabel(toleft)
Effect Addr , 7
End If
Loop
End
' Funkcja realizująca efekt świetlny (definicja)
Sub Effect(address As Byte , Byval Maxcount As Byte)
Stop Timer0
For I = 0 To Maxcount
Tmp = Address + I
Readeeprom Portb , Tmp
Waitms Lr4
Next I
Start Timer0
End Sub
' Podprogram obługi przerwania - bez pętli itp., maks. krótki
Przesun_linijke:
Addr = Loadlabel(leftright)
Tmp = Addr + Iters
Readeeprom Portb , Tmp
Iters = Iters + 1
Iters = Iters Mod 14
Return
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment