Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

obustronna komunikacja ATmega 5V-SRAM 3,3V

schabik89 17 Oct 2011 20:52 2628 20
  • #1
    schabik89
    Level 9  
    Witam,

    Chciałbym do mojej ATmegi w projekcie podłączyć kość SRAM z komunikacją szeregową po SPI "23k256"

    Problem jest taki, że jej zasilanie to 3,3V (nie mogę znaleźć innych szeregowych SRAMów na 5 V), a Atmega koniecznie musi pójść na zasilanie 5V.

    Pytanie do was czy mogę po prostu linie SCK i MOSI jako wejściowe do SRAMu puścić przez dzielniki napięcia a linie MISO czyli wyjście RAMu puścić przez jakiś konwerter z 3,3 na 5.

    Proszę o odpowiedz czy dobrze kombinuje, a jeżeli tak to doradźcie mi jak mam dokonać tej konwersji 3,3-5
  • #2
    tmf
    Moderator of Microcontroller designs
    Ze względu na częstotliwość pracy SPI (a dokładniej szybkość narastania/opadania zboczy) dzielniki rezystorowe są możliwe, ale to będzie raczej kiepsko działać. Lepiej zastosować scalone konwertery napięć. Z tym że akurat dla SPI to trochę przerost formy. Dlaczego nie możesz obniżyć napięcia zasilania ATMegi? Jeśli chodzi tylko o częstotliwość maksymalną to XMega działa ok dla napięcia 3V3.
  • #3
    asembler
    Level 32  
    A może da sie bezpośrednio podłączyc?
    Identycznie podłaczyłem szeregowy flash i dziala - tylko nie wiem jak długo.
  • #4
    schabik89
    Level 9  
    Nie mogę niestety obniżyć napięcia zasilania ATmegi bo potrzebuje ją taktować jak największym kwarcem po za tym mam w układzie max232 no i przetwornik ADS7816 który musi mieć przynajmniej 4,5V
  • #5
    tmf
    Moderator of Microcontroller designs
    No to użyj jak pisałem XMega, przy 3V3 masz 32MHz, a więc 2xtyle co wyciśniesz z ATMega, w dodatku masz wbudowane dwa dobre ADC, dzięki czemu ten zewnętrzny ADS nie będzie potrzebny. Max też można wymienić na wersję zasilaną niższym napięciem.
  • #6
    schabik89
    Level 9  
    Ja wiem, że Xmega by wszystko rozwiązała niestety nie mam funduszy na kupowanie minimodułu z nią oraz programatora, nie mówiąc już o tym, że nie mam czasu sie uczyć C, bo programuję w BASCOMie. W procesorze jest dużo obliczeń i nieustanny odczyt ADC wiec chciałbym moją ATmege644p taktować na 20 MHz. Niestety z zasilania 3,3 V wycisnę tylko 10MHz.
    Jeśli chodzi o połączenie bezpośrednie to raczej nie pójdzie ponieważ z datasheetów wynika, że ATmega przy wysokim stanie wysyła minimum 4,2V, a dla SRAMu maximum do przyjęcia to 3,9V. Natomiast RAM w stanie wysokim to min 2,7V a atmega potrzebuje na wejściu min 0,6Vcc co przy zasilaniu 5V daje 3V.

    Proszę was o jakieś pomysły związane z procesorem zasilanym na 5V. Xmega to naprawdę ostateczność, chyba że można by ją zaprogramować w BASCOMie
  • #7
    tmf
    Moderator of Microcontroller designs
    No to pomysł już dostałeś w pierwszym poście - są scalone konwertery poziomów napięć.
  • #8
    piotrva
    VIP Meritorious for electroda.pl
    Zaraz, zaraz, skoro to jest komunikacja SPI to masz:
    1. SCK -> do pamięci - dajesz dzielnik 5V->3,3V
    2. MOSI -> do pamięci - dajesz dzielnik 5V->3,3V
    3. MISO <- do procesora - dajesz odpowiedni tranzystor (szczególnie zwróć uwagę na częstotliwość przełączania i "opóźnienia") lub jakiś bufor z serii 74hc(t) (np. 74HCT08 - bramka and) zasilany napięciem 5V, wejścia podpięte do układu dającego 3,3V
    Oczywiście zależy ile chcesz z tego SPI wycisnąć - bo rezystory w pewnym momencie będą dawać za duże zmiany w sygnałach i jak pisali już koledzy - przy wyższych SCK nie zadziała jak powinno lub będzie sypać błędami.
    Względnie GTL2003 lub MAX3002 lub podobne konwertery specjalizowane.

    Nb. Xmega (np. klasy 128a1) da się programować w bascom 1.11.9.8 i wyższych,
  • #9
    asembler
    Level 32  
    schabik89 wrote:
    J
    Niestety z zasilania 3,3 V wycisnę tylko 10MHz.
    Jeśli chodzi o połączenie bezpośrednie to raczej nie pójdzie ponieważ z datasheetów wynika, że ATmega przy wysokim stanie wysyła minimum 4,2V, a dla SRAMu maximum do przyjęcia to 3,9V. Natomiast RAM w stanie wysokim to min 2,7V a atmega potrzebuje na wejściu min 0,6Vcc co przy zasilaniu 5V daje 3V.


    A próbowałeś?
    Odkąd to odczyt z zewnętrznego ADC trwa krócej?
  • #10
    piotrva
    VIP Meritorious for electroda.pl
    Co do napięcie/taktowanie -> to są normy podane przez producenta - powyżej nie gwarantuje on stabilnej pracy układu, ale zwykle też działa w pewnym zakresie powyżej tych zaleceń.
    A co do napięć, to zwykle układy zasilane 3,3V dają te 3,3-3,1V i atmega rozpoznaje ten stan jako wysoki.
  • #11
    dondu
    Moderator on vacation ...
    asembler wrote:
    schabik89 wrote:
    Jeśli chodzi o połączenie bezpośrednie to raczej nie pójdzie ...

    A próbowałeś?

    Niestety to oznacza niepewność:

    asembler wrote:
    Identycznie podłaczyłem szeregowy flash i dziala - tylko nie wiem jak długo.

    Oczywiście można zaryzykować, ale czy autor dopuszcza takie ryzyko?
  • #12
    asembler
    Level 32  
    To żadne ryzyko tylko próba.
    Ja tu raczej widze problem od strony programowej/programisty a nie od strony sprzetu.
  • #14
    asembler
    Level 32  
    Skoro widać że to ma być tylko prototyp i jednostkowa sztuka to nie jest to żadne ryzyko podłaczyć bezpośrednio, Sam tak robie w prototypach bo mi sie nie chce wlutowywać dodatkowych rezystorów. SPI chodzi z pełną prędkością, a kłopoty z osiągnieciem u niektórych maksymalnej przepustowości pewnie biorą sie ze złego programatora, bo nie wyobrażam sobie aby odłączać programator za kazdym razem.

    Ciekawe co to za skomplikowane obliczenia?
    Ile tego RAM-u faktycznie potrzeba?
  • #15
    schabik89
    Level 9  
    Faktycznie spróbuje to podpiąć i zobaczyć czy działa, ale chciałbym mieć jeszcze w zanadrzu jeszcze jakaś alternatywę. Poszukam jeszcze jakiś konwerterów napięć jak już wyżej wspomniano.

    Co do obliczeń to chciałbym odczytywać z ADC na bieżąco ciśnienie z czujnika ciśnienia, wyświetlać go na LCD, i wysyłać po SPI do SRAMU(do 2 minut pomiaru) i po skończonym pomiarze wysłać go przez rs232 na PC. Oczywiście po drodze jeszcze parę obliczeń związanych z uśrednianiem trzech próbek po sobie i tych z kolejnych odstępów jako, że odczyt z takiego czujnika jest podobno całkiem poszarpany. Wszystko to na Atmega644p taktowanej 20MHz. Nad ADC sie jeszcze zastanawiam czy wystarczy użyć wewnętrznego o wydajności 15ksps czy na spi podpiąć taki na 200ksps docelowy pomiar ciśnienia to ok 20Hz
  • #16
    tmf
    Moderator of Microcontroller designs
    Zdradź mi po co ci samplowanie 200ksps, 16-bit, jeśli masz przetwornik ciśnienia, który samplujesz 20Hz? Nawet robiąc jakiś oversampling to wbudowany w ATMegę ADC wystarczy. A po co ci do tego aż 20MHz to tylko ty wiesz :) Przecież nawet te uśrednienia to śmiesznie proste obliczenia, które procesor taktowany z ułamkiem tej częstotliwości pociągnie. Kolejna sprawa - 20 sampli/s przez 2 minuty to 4800 bajtów na próbki, jeśli próbki miałby mieć tylko 10 bitów co IMHO wystarcza, to potrzebujesz 3000 bajtów pamięci - lepiej dobrać procesor który ma 4-8kB SRAM wewnętrznego i po kłopocie. No i ten przetwornik ciśnienia, nie możesz dobrać taki, który ma wyjście np. I2C?
  • #17
    asembler
    Level 32  
    I do tego ci potrzebne 20MHz?
    Na moje oko to wystarczy 1Mhz nawet w Bascomie podejrzewam.
    20hz *120s to zaledwie 2400 wyników dwubajtowych.
    Czyli spokojnie zmiescic mozna w wewnetrznej pamieci RAM.
    Jak już koniecznie chcesz jeszcze więcej minut to zastosuj atmege1284p która ma 16kB RAM-u.
    Po co taki szybki ADC skoro pomiary co 20Hz a dodatkowo chcesz uśredniac.
    A moze mozna ustawic wewnętrzny preskaler przetwornika ADC tak aby usrednianie dodatkowo realizowane było sprzetowo? i w miarę potrzeby dalej usredniac cyfrowo.
    Ja tu nie widze potrzeby szukania innej alternatywy.


    Skoro ci dwóch niezależnie identycznie radzi to coś w tym musi być.
    Myśle że kolega niedoczytał iż przetwornik ADC jest sprzetowy i stąd to asekuracyjne 20MHz lub próba zastosowania zewnetrzengo mającego odciązyć obliczenia, a realnie pewnie spowoduje dociązenie procesora.
  • #18
    schabik89
    Level 9  
    Źle zostałem zrozumiany, albo w niezrozumiały sposób napisałem to co chciałem.

    Chodzi o to, że za tymi 20Hz kryją się pewne obliczenia. 20Hz to tylko,że tak powiem próbkowanie na potrzeby wyświetlacza LCD. Wynik co prawda w 50ms odstępach ale próbki w założeniu będą zbierane w paczkach po 3(dla uśrednienia) co powiedzmy 2ms (500Hz) i to zostaje wysłane na RAM. Po tych 25 próbkach, a za razem na nich będą następowały obliczenia- jakieś interpolacje,uśrednienia, wygładzanie postrzępionego wykresu, sam do końca nie jestem w stanie jeszcze powiedzieć co to będzie bo się dopiero za projekt biorę. Wszystko to się będzie stało za jednym z pośród tych 20 herców.
    W każdym razie chciałbym się z tymi obliczeniami jeszcze wyrobić za nim zostanie pobrana następna próbka, czyli mam na nie powiedzmy te 2ms stąd asekuracyjnie przyjąłem jak największy kwarc.

    Rzeczywiście Atmega 644p ma 4kB RAMu jeśli wykorzystam powiedzmy 3kB na pomiary to zmieszczę na niej 1500 dwu bajtowych pomiarów. Wszystko razy 2ms i daje mi to zaledwie 3s pomiaru. Ja potrzebuję do zarejestrowania minimum 30s. Dlatego zewnętrzny RAM minimum 32kB jest koniecznością.

    Oczywiście to wszystko jest na razie wymysłem w mojej głowie. Wiem, że to kwestia optymalizacji. Mogę z tego 2 ms próbkowania zrobić sobie 5 ms i wszystko będzie wyglądało inaczej.

    Z tego co piszę wyżej i wy mi uświadomiliście jeszcze wyżej myślę, że wewnętrzne ADC powinno spokojnie wystarczyć.

    Jeśli chodzi o przetwornik ciśnienia to nie mogę użyć niczego na I2C, ponieważ jest to zwyczajny analogowy przemysłowy przetwornik do wysokich ciśnień o sygnale 0-10V.
  • #19
    mirekk36
    Level 42  
    schabik89 wrote:
    ... będą następowały obliczenia- jakieś interpolacje,uśrednienia, wygładzanie postrzępionego wykresu, sam do końca nie jestem w stanie jeszcze powiedzieć co to będzie bo się dopiero za projekt biorę.


    To jeszcze dobitniej świadczy o tym, że koledzy, którzy ci wyżej doradzają mają rację. Wystarczy taktowanie 1MHz a już 8MHz to będzie aż za szybko ;)

    Poza tym podoba mi się określenie "jakieś" .... albo "postrzępionego wykresu". Wcale nie chcę być złośliwy, jednak takie podejście nawet do prototypu świadczy o tym, że jeśli nawet nie legnie on w gruzach to sam sobie gotujesz problemy. Nie można tak podchodzić do analizy problemu. A żeby nie pisać i co ważniejsze nie myśleć nawet o "jakichś tam interpolacjach" itp ... to weź że sobie lepiej "jakiś"/dowolny procek AVR nawet podłączony na płytce stykowej czy w jakimś zestawie uruchomieniowym i sprawdź sobie te obliczenia. Zobacz i dotknij ADC - bo tak to piszesz niechcąco niestworzone historie no i problem nawet w twoich własnych oczach urasta do postaci wielkiego JEŻA do którego ciężko podejść a przynajmniej bez 20-30MHz się nie obejdzie.
  • #20
    schabik89
    Level 9  
    Chciałbym zadać jeszcze pytanie nie związanie z tematem odnośnie programowania w Bascomie.
    Wiem, że jeśli postawie flagę w procedurze obsługi przerwania będzie ona widzialna w pętli głównej. Czy w odwrotną stronę też to działa? Chciałbym aby procedura obsługująca przerwanie wykonywała się inaczej w zależności od flag, które ustawie w głównej pętli DO..LOOP END.
  • Helpful post
    #21
    GienekS
    Level 32  
    Jeżeli zmienna jest globalna, to masz dostęp do niej zarówno w przerwaniu jak i poza ciałem przerwania.