Snow Fall
Dziękuję Panowie
Błąd poważny
Już poprawiłem na schemacie, sam się zastanawiam po co tak zaplątałem te połączenia.....
No to ciąg dalszy zmagań. Dziś udało mi się wyskoczyć z pracy przed czasem i zakupiłem 20 białych LEDów. Wymiana z zielonych (bo takie były) potrwała chwilę i przyszedł czas na testy oprogramowania. I tu zaczęły się problemy, jednak nie dorosłem jeszcze do pełnego wykorzystania przerwań , trzeba się więc było posiłkować innym rozwiązaniem.
Ale to już widać z listingu....
Dim A As Byte
Dim B As Word At $61
Dim B1 As Byte At $61 Overlay
Dim B2 As Byte At $62 Overlay
Dim C As Bit
Dim D As Byte
Config Porta = Output
Config Pinb.4 = Output
Config Pinb.5 = Output
Do
B = 65535 'załadowanie jedynek czyli wygaszenie wszystkich LEDów
C = 0
For A = 1 To 5 '5 to liczba spadających LEDów
For D = 1 To 200 '200 ustala szybkość spadania
Gosub Wysw
Next D
Shift B , Left 'przesuwanie LEDów o 1 pozycję
Next A
For A = 1 To 17
For D = 1 To 200
Gosub Wysw
Next D
Shift B , Left 'przesuwanie LEDów o 1 pozycję
B = B + 1 ' po przesunięciu trzeba zapełnić puste pole, sterowanie zerem
Next A
Wait 1 'przerwa pomiędzy kolejnymi spadami
Loop
Wysw:
If C = 1 Then Goto Wysb2
Reset Portb.5 'wyświetlanie młodszego bajtu
Set Portb.4
Porta = B1
C = 1
Goto Koniec
Wysb2:
Reset Portb.4 'wyświetlanie starszego bajtu
Set Portb.5
Porta = B2
C = 0
Koniec:
Waitms 1
Return
End
Tak wygląda pacjent podczas pracy:
Oj nakabelkowałem się tym razem Ale jakoś poszło.
Mały filmik jak to działa:
http://www.youtube.com/watch?v=Ze7ODEfh_T0
Niestety przeskoków nie udało się uniknąć przy 16 LEDach, ale z odległości 2 -3 m już jest to mało zauważalne, przy 32 już przeskakiwanie zaniknie. Dobrym sposobem na uzyskanie płynności jest też maksymalne zbliżenie LEDów do siebie.
W układaniu LEDów pomagał mi syn, więc prosta to ta linijka to nie jest z drugiej strony, to płatki śniegu nie lecą prosto jak deszcz
Na koniec wsady BIN i HEX
Na dziś tyle.
Pozdrawiam
Błąd poważny
Już poprawiłem na schemacie, sam się zastanawiam po co tak zaplątałem te połączenia.....
No to ciąg dalszy zmagań. Dziś udało mi się wyskoczyć z pracy przed czasem i zakupiłem 20 białych LEDów. Wymiana z zielonych (bo takie były) potrwała chwilę i przyszedł czas na testy oprogramowania. I tu zaczęły się problemy, jednak nie dorosłem jeszcze do pełnego wykorzystania przerwań , trzeba się więc było posiłkować innym rozwiązaniem.
Ale to już widać z listingu....
Dim A As Byte
Dim B As Word At $61
Dim B1 As Byte At $61 Overlay
Dim B2 As Byte At $62 Overlay
Dim C As Bit
Dim D As Byte
Config Porta = Output
Config Pinb.4 = Output
Config Pinb.5 = Output
Do
B = 65535 'załadowanie jedynek czyli wygaszenie wszystkich LEDów
C = 0
For A = 1 To 5 '5 to liczba spadających LEDów
For D = 1 To 200 '200 ustala szybkość spadania
Gosub Wysw
Next D
Shift B , Left 'przesuwanie LEDów o 1 pozycję
Next A
For A = 1 To 17
For D = 1 To 200
Gosub Wysw
Next D
Shift B , Left 'przesuwanie LEDów o 1 pozycję
B = B + 1 ' po przesunięciu trzeba zapełnić puste pole, sterowanie zerem
Next A
Wait 1 'przerwa pomiędzy kolejnymi spadami
Loop
Wysw:
If C = 1 Then Goto Wysb2
Reset Portb.5 'wyświetlanie młodszego bajtu
Set Portb.4
Porta = B1
C = 1
Goto Koniec
Wysb2:
Reset Portb.4 'wyświetlanie starszego bajtu
Set Portb.5
Porta = B2
C = 0
Koniec:
Waitms 1
Return
End
Tak wygląda pacjent podczas pracy:
Oj nakabelkowałem się tym razem Ale jakoś poszło.
Mały filmik jak to działa:
http://www.youtube.com/watch?v=Ze7ODEfh_T0
Niestety przeskoków nie udało się uniknąć przy 16 LEDach, ale z odległości 2 -3 m już jest to mało zauważalne, przy 32 już przeskakiwanie zaniknie. Dobrym sposobem na uzyskanie płynności jest też maksymalne zbliżenie LEDów do siebie.
W układaniu LEDów pomagał mi syn, więc prosta to ta linijka to nie jest z drugiej strony, to płatki śniegu nie lecą prosto jak deszcz
Na koniec wsady BIN i HEX
Na dziś tyle.
Pozdrawiam
- Załączniki
-
- SnowFall16.rar
- (995 Bajtów) Pobrany 16 razy
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Piszmy po polsku, wszak jesteśmy Polakami.
Mozna zrobic tak zeby pierwsze i ostatnie diody, z tych ktore sie pala mialy mniejsza jasnosc od reszty?
http://specjalistycznyspecjalista.blogspot.com/
POST MOŻE ZAWIERAĆ LOKOWANIE PRODUKTU
POST MOŻE ZAWIERAĆ LOKOWANIE PRODUKTU
Myślałem już wcześniej o zwiększeniu prędkości, ale w końcu to ma być śnieg.
Ale zrobiłem próbę i dwukrotne zwiększenie prędkości, dobrze wpłynęło na płynność ruchu.
teraz spadanie trwa około 2s
Właśnie przeglądałem Youtube i zauważyłem, że te "fabryczne" zasuwają dużo szybciej od mojego, od 1s do 2,5s, czyli nie jest źle.
Dodałem w załączniku zmianę czasu spadania na około 2s
Pozdrawiam
PS: Fluxor, niestety aktualnie to przekracza moje możliwości programistyczne, a rozwiązanie układowe.... chciałem żeby było jak najtaniej
PPS: Czy robić wersję softu na 32 LED?
Ale zrobiłem próbę i dwukrotne zwiększenie prędkości, dobrze wpłynęło na płynność ruchu.
teraz spadanie trwa około 2s
Właśnie przeglądałem Youtube i zauważyłem, że te "fabryczne" zasuwają dużo szybciej od mojego, od 1s do 2,5s, czyli nie jest źle.
Dodałem w załączniku zmianę czasu spadania na około 2s
Pozdrawiam
PS: Fluxor, niestety aktualnie to przekracza moje możliwości programistyczne, a rozwiązanie układowe.... chciałem żeby było jak najtaniej
PPS: Czy robić wersję softu na 32 LED?
- Załączniki
-
- Snow Fall 16 2s.rar
- (994 Bajtów) Pobrany 15 razy
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Piszmy po polsku, wszak jesteśmy Polakami.
Nie bawiąc się w PWM można na przykład coś w tym stylu:
Dim Ba As Word At $61
Dim Ba1 As Byte At $61 Overlay
Dim Ba2 As Byte At $62 Overlay
Dim Bb As Word At $63
Dim Bb1 As Byte At $63 Overlay
Dim Bb2 As Byte At $64 Overlay
w jednej zmiennej (np. Ba) trzymamy wzorzec dla diod świecących na 100% a w Bb to samo plus dodatkowe zero przed i za wzorcem.
(czyli przykładowo:
1111 1111 1111 0011
1111 1111 1110 0001)
a w procedurze wyświetlającej wystawiać na port naprzemiennie Ba1 z Bb1 i Ba2 z Bb2).
W ten sposób wiodąca i kończąca dioda będą miały 'prawie jak PWM' 50%
Przesuwamy obie zmienne, oczywiście.
Dim Ba As Word At $61
Dim Ba1 As Byte At $61 Overlay
Dim Ba2 As Byte At $62 Overlay
Dim Bb As Word At $63
Dim Bb1 As Byte At $63 Overlay
Dim Bb2 As Byte At $64 Overlay
w jednej zmiennej (np. Ba) trzymamy wzorzec dla diod świecących na 100% a w Bb to samo plus dodatkowe zero przed i za wzorcem.
(czyli przykładowo:
1111 1111 1111 0011
1111 1111 1110 0001)
a w procedurze wyświetlającej wystawiać na port naprzemiennie Ba1 z Bb1 i Ba2 z Bb2).
W ten sposób wiodąca i kończąca dioda będą miały 'prawie jak PWM' 50%
Przesuwamy obie zmienne, oczywiście.
Próbowałem takiej metody, lecz te 50% jest niewystarczające, myślę, że dopiero 25% mogło by się okazać OK, ale to spowodowało znaczny rozrost procedur wyświetlających, oraz wprowadzania danych.
Łatwo by się dało wprowadzać dane przy wykorzystaniu 4 bajtowych liczb, bo zamiast samych jedynek, można by wprowadzić jako startowe podane przez Ciebie, ale wtedy stracimy możliwość starowania 32 LEDów, zostanie max 24.
Chyba, że wystarczą 24 sztuki to powrócę do tej koncepcji, tylko z mniejszym wypełnieniem.
Pozdrawiam
Łatwo by się dało wprowadzać dane przy wykorzystaniu 4 bajtowych liczb, bo zamiast samych jedynek, można by wprowadzić jako startowe podane przez Ciebie, ale wtedy stracimy możliwość starowania 32 LEDów, zostanie max 24.
Chyba, że wystarczą 24 sztuki to powrócę do tej koncepcji, tylko z mniejszym wypełnieniem.
Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Piszmy po polsku, wszak jesteśmy Polakami.
Ależ nie, żaden rozrost. Dla 50% wyświetlasz naprzemiennie bajty. Dla 33% wyświetlasz jeden raz bajt 'wiodący' i dwa razy bajt 'główny'. Dla 25%....Pyra pisze:Próbowałem takiej metody, lecz te 50% jest niewystarczające, myślę, że dopiero 25% mogło by się okazać OK, ale to spowodowało znaczny rozrost procedur wyświetlających, oraz wprowadzania danych.
Napisałem generator przebiegu i zrobiłem próbne uruchomienie na PC.
Oto wynikowy przebieg (jeden pełny cykl dla 4 diod):
Kod: Zaznacz cały
u1[1]=11111111 u1[0]=11111110 u2[1]=11111111 u2[0]=11111111
u1[1]=11111111 u1[0]=11111100 u2[1]=11111111 u2[0]=11111110
u1[1]=11111111 u1[0]=11111000 u2[1]=11111111 u2[0]=11111100
u1[1]=11111111 u1[0]=11110000 u2[1]=11111111 u2[0]=11111000
u1[1]=11111111 u1[0]=11100000 u2[1]=11111111 u2[0]=11110000
u1[1]=11111111 u1[0]=11000000 u2[1]=11111111 u2[0]=11100001
u1[1]=11111111 u1[0]=10000001 u2[1]=11111111 u2[0]=11000011
u1[1]=11111111 u1[0]=00000011 u2[1]=11111111 u2[0]=10000111
u1[1]=11111110 u1[0]=00000111 u2[1]=11111111 u2[0]=00001111
u1[1]=11111100 u1[0]=00001111 u2[1]=11111110 u2[0]=00011111
u1[1]=11111000 u1[0]=00011111 u2[1]=11111100 u2[0]=00111111
u1[1]=11110000 u1[0]=00111111 u2[1]=11111000 u2[0]=01111111
u1[1]=11100000 u1[0]=01111111 u2[1]=11110000 u2[0]=11111111
u1[1]=11000000 u1[0]=11111111 u2[1]=11100001 u2[0]=11111111
u1[1]=10000001 u1[0]=11111111 u2[1]=11000011 u2[0]=11111111
u1[1]=00000011 u1[0]=11111111 u2[1]=10000111 u2[0]=11111111
u1[1]=00000111 u1[0]=11111111 u2[1]=00001111 u2[0]=11111111
u1[1]=00001111 u1[0]=11111111 u2[1]=00011111 u2[0]=11111111
u1[1]=00011111 u1[0]=11111111 u2[1]=00111111 u2[0]=11111111
u1[1]=00111111 u1[0]=11111111 u2[1]=01111111 u2[0]=11111111
u1[1]=01111111 u1[0]=11111111 u2[1]=11111111 u2[0]=11111111
u1[1]=11111111 u1[0]=11111111 u2[1]=11111111 u2[0]=11111111
Kod: Zaznacz cały
#define DIODY 4
#define CYKLE (16 + DIODY + 1)
union {
short int bity;
unsigned char bajt[2];
} u1, u2;
char* bits(char* cp, unsigned char c) // uslugowa - tylko do testu na PC
{
unsigned char mask = 1;
for (int i=1; i<=8; i++) {
cp[8-i] = (c & mask) ? '1' : '0';
mask <<= 1;
}
cp[8] = '\0';
return cp;
}
void wyswietl(void) // tez postac uslugowa do testu na PC
{
char a[9], b[9], c[9], d[9];
// testowo tu tylko bajty na ekran, docelowo bajty na porty naprzemiennie: z u1 i u2
printf("u1[1]=%s u1[0]=%s u2[1]=%s u2[0]=%s\n",
bits(a, u1.bajt[1]),
bits(b, u1.bajt[0]),
bits(c, u2.bajt[1]),
bits(d, u2.bajt[0]));
fflush(stdout);
return;
}
void snowfall(void)
{
while(1) { // a snieg pada i pada i pada ...
u1.bity = u2.bity = 0xffff;
for(int cykl = 0; cykl <= CYKLE; ++cykl) {
if (cykl == 0) {
u1.bity <<= 1;
}
if (cykl > 0 && cykl <= DIODY) {
u1.bity <<= 1;
u2.bity <<= 1;
}
if (cykl == DIODY+1) {
u1.bity <<= 1;
u2.bity <<= 1;
u2.bity += 1;
}
if (cykl > DIODY+1) {
u1.bity <<= 1;
u1.bity += 1;
u2.bity <<= 1;
u2.bity += 1;
}
wyswietl(); // tu wyjscie na porty
}
//sleep(random(20)); // przypadkowa drzemka po każdym cyklu
}
return;
}
int main(int argc, char* argv[])
{
snowfall();
return 0;
}
Kod: Zaznacz cały
gcc -Wall -std=c99 snowfall.c -o snowfall
Przepraszam, że nie w BASCOMie, ale nie znam
Ostatnio zmieniony piątek 18 gru 2009, 11:09 przez swietlik, łącznie zmieniany 2 razy.
Idąc Waszym tropem zrobiłem próbną wersję z ośmioma poziomami jasności. Na razie na 8 czerwonych LEDach, ale efekt jest ciekawy nawet przy powolnym przejściu. Jutro dokupię LEDów i zobacze co dalej bo na razie się zastanawiam jak to zmultipleksować przynajmniej x2 Chyba, że jakąś dużą Atmegę zaprząc do pracy? Choć to chyba przerost formy nad treścią
swietlik - wiesz co, w wolnej chwili zabiorę się chyba za to rozwiązanie ponownie, posiedzę nad optymalizacją kodu i może będzie OK.
A ja niestety tylko BASCOM, no nie mam talentu do języków
Saul - Ciekaw jestem efektu, to by wyszło prawie jak analogowe.
Wczoraj uruchomiłem wersję z czasem spadania około 2s i stwierdziłem, że nie jest źle, więc trochę lenistwo zwyciężyło ....
Muszę się Wam przyznać, że od jakiegoś czasu w mej głowie kiełkuje pomysł rozwiązania analogowego, ale cały czas pracuję na maksymalnym uproszczeniem układu.
Aktualnie jest tak, że na jedną diodę przypada tranzystor, rezystor i kondensator. Potrzebny jest tylko dodatkowy układ wyzwalający impulsy startowe.
Pozdrawiam
A ja niestety tylko BASCOM, no nie mam talentu do języków
Saul - Ciekaw jestem efektu, to by wyszło prawie jak analogowe.
Wczoraj uruchomiłem wersję z czasem spadania około 2s i stwierdziłem, że nie jest źle, więc trochę lenistwo zwyciężyło ....
Muszę się Wam przyznać, że od jakiegoś czasu w mej głowie kiełkuje pomysł rozwiązania analogowego, ale cały czas pracuję na maksymalnym uproszczeniem układu.
Aktualnie jest tak, że na jedną diodę przypada tranzystor, rezystor i kondensator. Potrzebny jest tylko dodatkowy układ wyzwalający impulsy startowe.
Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Piszmy po polsku, wszak jesteśmy Polakami.
Wczoraj kupiłem 32 żółte (były najtańsze ) diody 5mm i zacząłem rozbudowywać układ. Kombinowałem z całkowicie płynnymi przejściami, ale się okazało, że przy większych prędkościach spadku to i tak prawie nie ma wpływu na wrażenie płynności ruchu, zostawiłem więc 8 poziomów jasności. Na razie udało mi się uruchomić układ z 24 LEDami, ale z większą ilością uC też powinien sobie poradzić. Do sterowania użyłem Attiny2313.Pyra pisze:Saul - Ciekaw jestem efektu, to by wyszło prawie jak analogowe.
W niektórych "profesjonalnych" wersjach snowfall zauważyłem, że ruch śnieżynki jest przyspieszony, a na końcu zostaje punkt, który stopniowo przygasa dając wrażenie, że śnieżynka po upadku topnieje. Próbowałem zrobić to samo, i coś niecoś z tego wyszło. Cała linijka 24-diodowa ma ok. 13,5cm, ale diody są gęsto upakowane więc myślę, że można by z tego zrobić parę cm więcej bez utraty efektu. W sklepowych konstrukcjach na długości 13,5cm jest 18 LEDów, a na długości 16,5cm dają 20szt.
Pod spodem filmik:
[youtube]http://www.youtube.com/watch?v=pVHjbPIU-Bo[/youtube]
Gratulacje, zaczyna wygladac jak oryginal.
http://specjalistycznyspecjalista.blogspot.com/
POST MOŻE ZAWIERAĆ LOKOWANIE PRODUKTU
POST MOŻE ZAWIERAĆ LOKOWANIE PRODUKTU