Witam.
Mam następujący problem z SPI (i nie tylko)
Najpierw opis układu:
Atmega32A master SPI
Atmega8 Slave. (przerwania)
Wszystko taktowane wewnętrznie na 8MHz
Do atmegi8 są przyłączone 4 wyświetlacze 12 diodowe WA przez tranzystory. Katody do portów (oczywiście z R)
Wyświetlanie multipleksowane. Do tego 8 przycisków - jako, że brakło portów
to "klawiatura" jest matrycowa 4x2. Krążące 0 na kolumnach jest brane ze sterowania anod, wiersze są podłączone do PB6 i PB7.
Częstotliwość dobrana "na oko" - najniższa przy której nie widać migania - pewnie koło 80Hz. Żródło: TIMER1_OVF
DDR dla PB6,7 i SPI zaprogramowanie, PORTB |= 0b11000000.
oba GND, (A)VCC podłączone, Aref przez 100nF do masy, wszystko zblokowane elektrolitem 100uF i 100nF ceramicznym (SMD bezpośrednio na nogach). SS do masy, na resecie 10k.
W całym programie nie ma ani jednego paskudnego _delay_. W przerwaniach nie ma też czekania na flagi (ani nawet for-a)
Całość dodatkowo podłączona do oscyloskpu dwukanałowego z pamięcią.
I teraz problemy:
Układ właściwie działa - przebiegi na SPI są "ładne", sprawdzane bezpośrednio na pinach proców - kabla łączącego na oscylogramach "nie widać"
Ale ciekawostka - slave jeśli wysyła 255 to po "paczce" zegarowej czasem jest szpileczka do 0, czasem prostokąt o czasie trwanie okresu zegarowego a czasem nic. Nie przeszkadza to w transmisji bo jest to po ostatnim opadającym zboczu zegara ale nigdzie nie spotkałem się z opisem że tak ma być.
Niestety działanie kończy się przy naciskaniu klawiszy - działa dopóki nie przytrzyma się klawisza. (klawisze - polling w przerwaniu timera autopowtarzanie zrobione licznikiem i flagami) Wówczas zazwyczaj (bo też nie zawsze) slave wysyła coś na SPI - to że wysyła to jest dla mnie oczywiste, ale skąd się biorą wartości to już nie wiem - w programie, w pętli główniej mam SPDR = 255, skąd zatem się biorą różne wartości? Master nadaje koło 2 bajtów na sekundę, pętla programu głównego wykonuje się w tym czasie pewnie tysiące razy. Obserwuję też na oscyloskopie MISO i MOSI jednocześnie i nie widzę korelacji między danymi - (nawet z przesunięciem w czasie). Co gorsza układ nie wraca już do normalnego stanu, ciągle wysyłana jest sekwencja brana nie wiadomo skąd. Wyświetlacze też zaczynają trochę szwankować, ale właściwie układ "prawie działa" np. nadal reaguje na przyciski.
Oczywiście prawie robi wielką różnice - potrzebuję działającego układu. Ktoś ma jakiś pomysł?
Po uwagach moderatora dodaję schemat i kod.
Jeśli chodzi o schemat to:
1. Oczywiście nie ma tam 24 przełączników - po prostu na szybko w eagle wstawiłem taki element zamiast wyswietlacza led (obudowa się zgadzała)
2. Pomiędzy nogami 8 i 7 jest wlutowany 100nF (bezpośrednio do nóg)
3. PB6 i PB7 są podciągnięte przez 1k do Vcc
4. Reset jest podciągnięty przez 10k.
5. Układ jest zasilany na 3,3V. Na SV7.5 też jest podane 3,3V
6. SV1 jest nie podłączone
7. Przyciski są podłączone do SV3..6 pomiędzy piny 2 i 3
8. SS do masy
Poniżej kod - od razu zaznaczam, że jest to wersja max okrojona (przez co użytecznie bez sensu). Nawet nie ma przycisków obsługiwanych co nie zmienia faktu, że to one wszystko psują.
I teraz jak to działa:
Jak wysyłam z mastera 254 to układ ma się wygasić.
I tak działa dopóki nie zacznę naciskać przycisków.
Jak zacznę je naciskać - szybko kilka razy - ile - nie ma reguły, to wygaszenie przestaje działać.
Jak master wysyła 254 to slave odpowiada 170 - widzę to na oscyloskopie a diody gasną.
Jak wysyła nie 254 wszystko działa i slave wysyła zwrotnie liczbę o 1 mniejszą.
Póki wszystko działa.
Teraz jak ponaciskam sobie przyciski (pomimo, że nic w programie nie robią) to po wysłaniu z mastera 254 wyświetlacz nie gaśnie - slave wysyła w odpowiedzi nie 170 a np. 250. Z mastera wysyłam bajt 2 razy na sekundę - mogę czekać godzinami zawsze dostaję 250 - oczywiście widzę, że master faktycznie wysyła 254. Jak ponaciskam znów przyciski to 250 może się zmienić.
Po resecie oczywiście wszystko jest OK do następnej zabawy z przyciskami.
Mam następujący problem z SPI (i nie tylko)
Najpierw opis układu:
Atmega32A master SPI
Atmega8 Slave. (przerwania)
Wszystko taktowane wewnętrznie na 8MHz
Do atmegi8 są przyłączone 4 wyświetlacze 12 diodowe WA przez tranzystory. Katody do portów (oczywiście z R)
Wyświetlanie multipleksowane. Do tego 8 przycisków - jako, że brakło portów
to "klawiatura" jest matrycowa 4x2. Krążące 0 na kolumnach jest brane ze sterowania anod, wiersze są podłączone do PB6 i PB7.
Częstotliwość dobrana "na oko" - najniższa przy której nie widać migania - pewnie koło 80Hz. Żródło: TIMER1_OVF
DDR dla PB6,7 i SPI zaprogramowanie, PORTB |= 0b11000000.
oba GND, (A)VCC podłączone, Aref przez 100nF do masy, wszystko zblokowane elektrolitem 100uF i 100nF ceramicznym (SMD bezpośrednio na nogach). SS do masy, na resecie 10k.
W całym programie nie ma ani jednego paskudnego _delay_. W przerwaniach nie ma też czekania na flagi (ani nawet for-a)
Całość dodatkowo podłączona do oscyloskpu dwukanałowego z pamięcią.
I teraz problemy:
Układ właściwie działa - przebiegi na SPI są "ładne", sprawdzane bezpośrednio na pinach proców - kabla łączącego na oscylogramach "nie widać"
Ale ciekawostka - slave jeśli wysyła 255 to po "paczce" zegarowej czasem jest szpileczka do 0, czasem prostokąt o czasie trwanie okresu zegarowego a czasem nic. Nie przeszkadza to w transmisji bo jest to po ostatnim opadającym zboczu zegara ale nigdzie nie spotkałem się z opisem że tak ma być.
Niestety działanie kończy się przy naciskaniu klawiszy - działa dopóki nie przytrzyma się klawisza. (klawisze - polling w przerwaniu timera autopowtarzanie zrobione licznikiem i flagami) Wówczas zazwyczaj (bo też nie zawsze) slave wysyła coś na SPI - to że wysyła to jest dla mnie oczywiste, ale skąd się biorą wartości to już nie wiem - w programie, w pętli główniej mam SPDR = 255, skąd zatem się biorą różne wartości? Master nadaje koło 2 bajtów na sekundę, pętla programu głównego wykonuje się w tym czasie pewnie tysiące razy. Obserwuję też na oscyloskopie MISO i MOSI jednocześnie i nie widzę korelacji między danymi - (nawet z przesunięciem w czasie). Co gorsza układ nie wraca już do normalnego stanu, ciągle wysyłana jest sekwencja brana nie wiadomo skąd. Wyświetlacze też zaczynają trochę szwankować, ale właściwie układ "prawie działa" np. nadal reaguje na przyciski.
Oczywiście prawie robi wielką różnice - potrzebuję działającego układu. Ktoś ma jakiś pomysł?
Po uwagach moderatora dodaję schemat i kod.
Jeśli chodzi o schemat to:
1. Oczywiście nie ma tam 24 przełączników - po prostu na szybko w eagle wstawiłem taki element zamiast wyswietlacza led (obudowa się zgadzała)
2. Pomiędzy nogami 8 i 7 jest wlutowany 100nF (bezpośrednio do nóg)
3. PB6 i PB7 są podciągnięte przez 1k do Vcc
4. Reset jest podciągnięty przez 10k.
5. Układ jest zasilany na 3,3V. Na SV7.5 też jest podane 3,3V
6. SV1 jest nie podłączone
7. Przyciski są podłączone do SV3..6 pomiędzy piny 2 i 3
8. SS do masy
Poniżej kod - od razu zaznaczam, że jest to wersja max okrojona (przez co użytecznie bez sensu). Nawet nie ma przycisków obsługiwanych co nie zmienia faktu, że to one wszystko psują.
I teraz jak to działa:
Jak wysyłam z mastera 254 to układ ma się wygasić.
I tak działa dopóki nie zacznę naciskać przycisków.
Jak zacznę je naciskać - szybko kilka razy - ile - nie ma reguły, to wygaszenie przestaje działać.
Jak master wysyła 254 to slave odpowiada 170 - widzę to na oscyloskopie a diody gasną.
Jak wysyła nie 254 wszystko działa i slave wysyła zwrotnie liczbę o 1 mniejszą.
Póki wszystko działa.
Teraz jak ponaciskam sobie przyciski (pomimo, że nic w programie nie robią) to po wysłaniu z mastera 254 wyświetlacz nie gaśnie - slave wysyła w odpowiedzi nie 170 a np. 250. Z mastera wysyłam bajt 2 razy na sekundę - mogę czekać godzinami zawsze dostaję 250 - oczywiście widzę, że master faktycznie wysyła 254. Jak ponaciskam znów przyciski to 250 może się zmienić.
Po resecie oczywiście wszystko jest OK do następnej zabawy z przyciskami.
Kod: text


