Hmm. Jakie ma znaczenie funkcja wait na końcu programu, bo ja nie używałem opóźnienia w swoim programie po procedurze spiout.
Jeżeli chodzi o pomysł z odwróceniem diod to odpada bo to sa diody 2 w 1 czerwona i zielona razem ze wspólnym wyjsciem.
W układzie zastosowałem funkcję shiftout a oto jej opis:
SHIFTOUT Przeznaczenie:
Wysuwa ciąg bitów pochodzący z określonej zmiennej.
Składnia:
SHIFTOUT pin_danych , pin_zegarowy , zmienna , opcje [, il_bitów , opóźnienie ]
gdzie:
pin_danych nazwa końcówki portu będącą linią wyjściową strumienia bitów, np. PORTB.0
pin_zegarowy nazwa końcówki portu będąca linią zegarową, np. PORTB.1
zmienna zmienna z której wysuwane będą bity,
opcje opcje,
il_bitów ilość wysuwanych bitów,
opóźnienie opóźnienie w mikrosekundach między kolejnymi bitami.
Opis:
Instrukcja ta podobnie jak SHIFTIN, może być używana do szybkiej transmisji szeregowej pomiędzy dwoma procesorami.
Pin_danych powinien być połączony z końcówką wejściową drugiego procesora, który jest odbiornikiem strumienia bitów. Pin_zegarowy w trybie MASTER generuje sygnał zegarowy synchronizujący transmisję. W trybie SLAVE jest on wejściem sygnału zegarowego pochodzącego z drugiego procesora.
Uwaga! Jeśli pin_zegarowy ma być wyjściem należy użyć PORTx.y, jeśli zaś będzie wejściem należy użyć PINx.y
Podana jako parametr zmienna może być dowolną – oprócz zmiennych bitowych! - zmienną języka BASCOM BASIC. Bity nadawane będą wysuwane właśnie z tej zmiennej.
Można podać ilość wysyłanych bitów, maksymalnie 255. Jeśli ten parametr nie występuje lub jest określony jako NULL, liczba bitów jest automatycznie określana na podstawie ilości bitów składających się na zmienną. Dla typu Byte będzie to 8 bitów a dla typu Word – 16.
Znaczenie liczby podanej jako parametr opcje, jest następująca:
0 najpierw bit MSB jest podawany przy niskim poziomie logicznym na końcówce zegarowej
1 najpierw bit MSB jest podawany przy wysokim poziomie logicznym na końcówce zegarowej
2 najpierw bit LSB jest podawany przy niskim poziomie logicznym na końcówce zegarowej
3 najpierw bit LSB jest podawany przy wysokim poziomie logicznym na końcówce zegarowej
Gdy liczba określająca opcję zostanie powiększona o 4, wtedy sygnał zegarowy nie będzie generowany i lina zegarowa będzie pełnić rolę wejścia zewnętrznego sygnału zegarowego (tryb SLAVE).:
4 najpierw bit MSB jest podawany przy niskim poziomie logicznym na końcówce zegarowej
5 najpierw bit MSB jest podawany przy wysokim poziomie logicznym na końcówce zegarowej
6 najpierw bit LSB jest podawany przy niskim poziomie logicznym na końcówce zegarowej
7 najpierw bit LSB jest podawany przy wysokim poziomie logicznym na końcówce zegarowej
Jako opóźnienie normalnie używane są dwie instrukcje maszynowe NOP. Gdy częstotliwość zegara jest zbyt duża, można podać czas opóźnienia w mikrosekundach. Jednak w tym przypadku konieczne jest określenie ilości transmitowanych bitów.
ale i tak występują błedy, nie wszystkie liczby są poprawnie wysłane. Te które są źle wysyłane po prostu nie używam. W moim przypadku użyłem opóźnienia choć graniczna częstotliwość dla 74hc164 to 50MHz. Moje 4MHz nie powinno zrobić wrażenia na tamtej kości. Problem rozwiązany połowicznie.