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.

Atmega32 / Bascom - Dwa SPI programowe

maximus22_kr 12 Sie 2016 12:45 1881 20
  • #1 12 Sie 2016 12:45
    maximus22_kr
    Poziom 18  

    Witam
    Mam program budzika, który jako dodatkową atrakcję miał mieć możliwość mówienie czasu na żądanie i odtwarzanie oprócz buzzera utworu jako alarmu.
    Atmega steruje przez jedno SPI programowe układem MAX7219, a przez konwerter poziomów i drugie SPI programowe odtwarzaczem WTV020SD.
    O ile
    sam WVT020SD + PCF8563 ( wyjście CLK do INT1 ) działają dobrze,
    to konfiguracja
    WVT020SD + PCF8563 ( wyjście CLK do INT1 ) + MAX7219 już nie, tzn. po wciśnięciu przycisku pilota OK ( który ma wywołać podprogram "mówienia czasu" ), wyświetlacz się zatrzymuje na ostatnim wskazaniu. Próbowałem kod do "mówienie" dać w pętli głównej, ale efekt taki sam.

    Wygląda jakby dwa SPI programowe nie lubiły się ze sobą.


    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    z prezentowanego kodu musiałem "wyrzucić" obsługę przycisków i pilota oraz deklaracje zmiennych, bo treść była za długa.

    0 20
  • #2 12 Sie 2016 14:16
    373522
    Użytkownik usunął konto  
  • #3 12 Sie 2016 15:45
    maximus22_kr
    Poziom 18  

    Niestety nie dało to poprawy - zwiększyłem do 128 ( takich wartości używam dla kart SD ).
    Zastanawiam się, czy przerwanie INT1 co sekundę od PCF8563 nie przeszkadza ?

    0
  • #4 12 Sie 2016 16:41
    kamyczek
    Poziom 34  

    Bascom tak właśnie działa w wielu przypadkach . Takie rzeczy pisze się w c lub asemblerze i działać poza tym programowe spi wykorzstuje mikrokontroler raz do przesuwania zmiennej dwa do obsługi portów trzy do odbierania . Do takiej zabawy stosuje sie mikrokontroler z 2 lub więcej sprzętowymi spi w wielu mikrokontrolerach uart moze pracować jako spi poza tym nigdy 2 programowe nie zadziałają jednocześnie i tak samo szybko pozostaje więc albo dwa sprzętowe albo jedno sprzętowe i jedno programowe . Dodatkowo zapytam czemu nie wszystko na jednym sprzętowe spi i kilka sygnałów cs .

    0
  • #5 12 Sie 2016 16:54
    maximus22_kr
    Poziom 18  

    Cytat:
    Dodatkowo zapytam czemu nie wszystko na jednym sprzętowe spi i kilka sygnałów cs .


    Przeprojektowałem już istniejącą płytkę, dokładając z boku miejsce na WTV020SD + konwerter poziomów, wykorzystałem najbliższe możliwe piny Atmegi.

    Czyli nie ma szans, że to ruszy ?
    W takim razie będę musiał pokombinować z playerem na UART, który Chińczycy sprzedają

    0
  • #6 12 Sie 2016 17:17
    373522
    Użytkownik usunął konto  
  • #7 12 Sie 2016 23:45
    kamyczek
    Poziom 34  

    Kolego jeśli nie masz wiedzy jak działa programowe spi to proszę nie pisz o mnie lub do mnie . Żeby wysłać bit po bicie trzeba z bajta danych wyłuskać jakoś bit do wysłania najszybciej przez wysunięcie go do znacznika przeniesienia w tej samej operacji można wsunąć z drugiej strony bit odebrany z wejścia MISO, data in . wszystkie te operacje robi alu a jak robi w jednym programowym spi to w drugim nie robi nic . Wniosek jest z tego prosty po co ładować procedurę obsługi kolejnego programowego spi skoro można to zrobić pierwszym używając jedynie dodatkowego sygnału cs W sprzętowym spi musisz obsłużyć sygnał cs i załadować daną do wysłania oraz odebrać to co odebrał rejestr i nawet tam przy maksymalnej prędkości spi obciążenie mikrokontrolera jest spore . Programowe spi będzie wolniejsze co najmniej dwa razy do tego nie będzie działało jednocześnie wepnij sobie analizator i sprawdź jak działa 2 sprzętowe spi a jak dwa programowe . Twój żaden problem to zajęty mikrokontroler w trakcie wysyłania i odbierania ...

    0
  • #8 13 Sie 2016 00:43
    373522
    Użytkownik usunął konto  
  • #9 13 Sie 2016 13:42
    kamyczek
    Poziom 34  

    niveasoft napisał:
    Gdybyś nie był taki zadufany w sobie to może by dotarło w końcu, że Shiftout to tylko połówka SPI i niczego nie odbiera. Jest tam tylko Clock i Data
    Do wysłania są tylko dwa bajty.

    Po pierwsze to może kolega umieści obrazek jak dwa działają równocześnie , po drugie shiftout to nie spi tylko jego połowa . Napisałem że programowe spi nie działa razem dlaczego bo jest jeden alu i jak realizuje jedno to nie realizuje drugiego spi . Tu się nie ma po co sprzeczać szybciej niż dwa sprzętowe spi nie będzie na żadnym mikrokontrolerze . Musisz zrozumieć ze sprzętowo prawie całe zadanie robi układ zewnętrzny i w wielu aplikacjach nawet sygnalizowanie czegoś migającą diodą lepiej zrobić zegarem z PWM bo to zajmuje tylko raz kilka taktów a nie co określony czas alu . Masz kolego darmowych robotników w postaci peryferii a zwalasz wszystko na jedno alu dlatego wielu jęczy że się avr nie wyrabia ...

    0
  • #10 13 Sie 2016 13:58
    373522
    Użytkownik usunął konto  
  • #11 13 Sie 2016 19:09
    kamyczek
    Poziom 34  

    niveasoft napisał:
    Ten program tak samo źle można napisać w ASM, Basicu, C czy nawet Pascalu.


    Oczywiście każdy program w każdym języku można napisać lepiej i gorzej . Tu kolego chodzi o to żeby utrwalać w programiście dobre zwyczaje . Co daje twoim zdaniem napisanie dwóch takich samych kawałów kodu ,które nie można jednocześnie wykorzystać bo alu jest po prostu jedno . Ja już pominę że w takich układach można tak napisać program żeby w końcowym rozrachunku postał mikrokontroler parę rezystorów, tranzystorów i rezonator zegarkowy . Jest jak jest działać będzie , tyle że dla mnie to rozwiązanie na 3 nie na 5 czy 6 . Możesz mieć inne zdanie , ja mam swoje mi się to rozwiązanie niezbyt podoba tak sprzętowo jak i programowo . Można lepiej , taniej . Po co wsadzać mikrokontroler który nic nie robi ? Ja bym wywalił MAX7219 i multipleksowy wyświetlacz obsłużył na mikrokontrolerze . Obecne rozwiązanie jest jak wożenie 1 osoby autokarem ...

    0
  • #12 13 Sie 2016 21:59
    MirekCz
    Poziom 35  

    Kamyczek: I masz rację.. jak robisz urządzenia do masowej produkcji.

    Jak to jest jedna sztuka ( albo nawet mała seria ) kilka zł na podzespołach może nie mieć znaczenia jak zaoszczędzi się kilka czy nawet kilkadziesiąt godzin na programowaniu.

    0
  • #13 14 Sie 2016 14:21
    kamyczek
    Poziom 34  

    To zależy jak ktoś podchodzi do tematu projektowania urządzeń ale ja budując dla kogoś zawsze robię to najlepiej jak potrafię a dla siebie ,jak nic mnie nie goni jeszcze lepiej ,bo patrząc na coś co zbudowałem miał bym cały czas przeświadczenie że odwaliłem lipę i prowizorkę . U mnie musi być dopieszczone , przemyślane i działające za każdym razem .

    0
  • #14 17 Sie 2016 21:32
    maximus22_kr
    Poziom 18  

    Witam
    Propozycja Kolegi niveasoft wygląda zachęcająco, muszę coś jeszcze wcisnąć jeśli chodzi o opóźnienia, bo WTV020SD jest wymagający - muszą być opóźnienia po stanie niskim linii CLK i drugie po wysłaniu, a przed podaniem stanu wysokiego na linię CLK.

    Widzę, że Kolega często stosuje Case, też staram się stosować, tylko, ostatnio mam z nim problem - nie podchodzi mi w kodzie zegara zagnieżdżenia Case ( ten zegarek, w którym Kolega mi pomagał z alarmami ), wydaje mi się, ze przez odpowiedni odczyt parametrów alarmu i kod, można go uprościć.

    Mam jeszcze taki kod z Case

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    chciałem, żeby zmieniały się parametry pracy, a tutaj nic, tzn wartość zmiennej program_nr się zmienia, ale nie odświeża parametrów na LCD, więc nie wiem, czy je w ogóle podstawia

    0
  • #15 26 Mar 2017 23:59
    maximus22_kr
    Poziom 18  

    Odświeżę temat
    Zrobiłem tak, jak zasugerował niveasoft, czyli na Case
    Nie wiem czy tak to miało wyglądać.

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    I tak zrobione działa OK.
    Ale połączenie tego z obsługą MAX7219 nie daje efektów.
    Próbowałem wywołać o danej godzinie granie utworu.

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    Różnica w odniesieniu do początkowego kodo to brak blokowania - MAX7219 wyświetla czas, a poprzednio się blokował - no ale wiadomo to zasługa braku Sub. Dałem nawet warunek, żeby nie zaczynał grać, gdy coś jest wysyłane do MAX7219.
    Cytat:
    Zostaje ~994ms na inne sprawy
    do mnie przemawia, tylko może trzeba inaczej do tego podejść.

    Póki co będę próbował przenieść MAX na sprzętowe SPI - Wtv020SD nie ma pinu CS, więc może sterowanie obydwu układów poprzez pin CS może być utrudnione.

    0
  • #16 27 Mar 2017 06:41
    373522
    Użytkownik usunął konto  
  • #17 27 Mar 2017 11:28
    maximus22_kr
    Poziom 18  

    Dziękuję za pomoc.
    Nie za bardzo rozumiem tylko

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    Bo nigdzie nie jest wykorzystywana ta zmienna

    Może chodziło o
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    czyli, jeśli jakimś warunkiem uruchomię granie to odliczam od zadanych milisekund do 0 i wtedy wchodzę w kolejny krok Play_step.

    0
  • #18 27 Mar 2017 11:29
    373522
    Użytkownik usunął konto  
  • #19 28 Mar 2017 16:22
    maximus22_kr
    Poziom 18  

    Witam ponownie
    Jeśli chodzi o uproszczenie wysyłania do MAX7219 to
    Kod Kolegi:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    nie za bardzo działa,
    Ale działa coś takiego
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    podobnie jest z regulacją jasności - kod podany przez Kolegę nie działa
    Jeszcze tylko przerobię inicjowanie MAX7219 na starcie i zawsze jakaś oszczędność.

    0
  • #20 28 Mar 2017 18:42
    373522
    Użytkownik usunął konto  
  • #21 29 Mar 2017 13:35
    maximus22_kr
    Poziom 18  

    Niech się Kolega nie tłumaczy, niestety takie czasy, że większość ludzi zabiegana.

    Jeszcze nie próbowałem, jutro w pracy spróbuję ( chyba najwięcej ostatnio robię w pracy, jak się odrobię to mam 1-2 godziny luzu do końca pracy, niestety duża konkurencja w branży i obroty spadły - mniej pracy ). Trochę mi zeszło nad dopasowaniem kodu MAX7219 - próbowałem z zamianą na 1 opcjach z kodu Kolegi, ale nie działało - stopniowo doszedłem do tego co umieściłem w poście o 16:22.
    Dodano po 13 [godziny] 49 [minuty]:
    Witam
    W konfiguracji wyjść/wejść dla WtV020 brakło ustawienia pinu RESET na stan wysoki
    Powinno być tak:

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    i dalej już:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    "dorobiłem" "mówienie" czasu, ale mówi tylko godzinę - wyjście Busy powinno go wstrzymywać do czasu zakończenia pierwszego utworu. Myślę, że trzeba też dodać jakieś dodatkowe zabezpieczenie, żeby nie wysyłał do WTV020, gdy coś idzie do MAX7219.

    Zmieniłem odtwarzanie godziny na coś takiego:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    i to działa

    0