Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

atmega8 - SPI dziwne działanie

diga 13 Sie 2014 02:30 942 3
  • #1 13 Sie 2014 02:30
    diga
    Poziom 11  

    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
    atmega8 - SPI dziwne działanie

    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: cpp
    Zaloguj się, aby zobaczyć kod

    0 3
  • #3 13 Sie 2014 08:12
    diga
    Poziom 11  

    Oczywiście - ISP i SPI raczej się kłócą.
    Dodam jeszcze, że próbowałem proca wymieniać również proca.

    0
  • #4 13 Sie 2014 08:35
    BlueDraco
    Specjalista - Mikrokontrolery

    Podsumujmy:

    Szukamy błędu w nieznanym programie działającym w urządzeniu o nieznanym schemacie i częstotliwości timera dobranej "na oko".
    Na moje wyczucie chodzi o błędne podstawienie w linii numer 57. Jeśli to nie pomoże - proponuję zwrócić się do wróżki.

    0