• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Komunikacja SPI
#1
Photo 
Mam pytanie czy jest możliwość zastąpienia czymś innym te delay co zastosowałem??

Kod:
void ACData(){

   digitalWrite(CS, LOW);   //Pull CS Line Low
   delayMicroseconds(90);
   digitalWrite(CS, HIGH);
   delayMicroseconds(100);
   digitalWrite(CS, LOW);
   SPI.write(0x4a);
   SPI.write(0x61);
   SPI.transfer(0x72);
   SPI.transfer(0x65);
   SPI.transfer(0x6b);
   digitalWrite(CS, HIGH);                    //Pull CS Line High

I drugie pytanie 
   

Jak zrobić by 


Kod:
   SPI.write(0x4a);
   SPI.write(0x61);
   SPI.transfer(0x72);
   SPI.transfer(0x65);
   SPI.transfer(0x6b);

Nie przerywało zegara było w postaci ciągłej. Szybkość SPI to 10kHz i tak musi być.
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#2
Odp 1: użyj timerów ostatecznie millis, przerwań, można użyć RTOS ale to nie na AVR z małą ilością RAM (na Mega1284 jest ok).

Odp 2: chodzi o przerwy pomiędzy bajtami? Jeśli tak użyj przerwań co z tym idzie, nie możesz nigdzie w programie ich blokować (np Arduinowe libs 1-Wire) no i na AVR, pewnie więcej jak jakieś 1..2Mb/s nie wyciągniesz. Można użyć USART, wyciągniesz 3 może i więcej Mb/s ale AVR są ubogie w USART (najczęściej 1, czasem 2, 4 to szczyt szczytów).
Nie wiem ile danych chcesz przesyłać ale trzeba je zbuforować w RAM i małe AVR mogą się nie nadawać.
Zasadniczo, do szybkiej transmisji dużej ilości danych trzeba wybrać uC z DMA i odpowiednią ilością RAM. Może to być Xmega (ma DMA ale RAM już niekoniecznie, no i tanie te uC nie są a ograniczenia 8-bit odczuwalne), może być ARM.
 
Odpowiedź
#3
Aj zapomniałem :/ to jest na ESP8266...

Po prostu biorę twój podpis do serca Wink i każde delay chciał bym wykluczyć. Dlatego zapytałem o te dwa opóźniacze blokujące bo to jest w "us" i czy millis poradzi sobie z 90us czyli 0,09ms?

Z tym drugim już sobie poradziłem pierw dane do bufora a potem żeby bufor zapisał do SPI wtedy zapisuje znaki i bez przerw. Na prędkości mi nie zalezy bo to komunikacja z urządzeniem z epoki kamienia łupanego z lat 90. Tam oryginalna transmisja była na poziomie ok 10kHZ.
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#4
Millis sobie nie poradzi bo ma rozdzielczość ok 1ms.
Jak często transmisja jest realizowana? Pewnie niezbyt często skoro 10kHz. Ile trwa transmisja? Jeśli delay stanowią kilka procent czasu to należałoby je wywalić, jeśli jakieś promile, można zostawić delay.
Czemu te 90us jest wymagane? Układ peryferyjny tego wymaga?

Pozbycie się delay rzędu dziesiątek us może być problematyczne, zwłaszcza na AVR. Na ESP8266, którego używasz, też za dobrze nie ma. Jak pamiętam jest tylko jeden timer dla programisty. Co innego ESP32 czy ARM.
W ESP8266 jest jeszcze jedna pułapka - RTOS. ESP32 ma dwa rdzenie, jeden dla użytkownika i problemu nie ma, w ESP8266 jeden. RTOS pewnie na przerwaniu 1ms, więc nie ma gwarancji, że task użytkownika zostanie wskrzeszony po 90us, może to być nawet po 1ms.
Sprawdzałeś te 90us na oscyloskopie? Czasami nie jest dużo więcej niż 90us?

Jeśli dopuszczalne jest aby te czasy były dłuższe, to używając millis i maszyny stanów zrealizujesz opóźnienie 1..2ms.
Pchanie się w RTOS ma sens, jak nad wszystkim się panuje albo kryteria czasowe nie są restrykcyjne. W większych projektach używam ESP-01 w roli mostka a wszystkim rządzi ARM.
 
Odpowiedź
#5
Transmisja trwa około 6ms,  Realizowana co 1s ale podejrzewam ze zejdę  czasami do 0,5s  bo na tyle pozwala urządzenie peryferyjne. 

Te opóźnienie 90us i drugie 100 us  jest na lini CS (SS) ja to używam jako EN wymaga tego urządzenie peryferyjne pobudza układ do odbioru danych  podejrzewam że to takie pobudzenie że będą przychodzić dane 

Czas sprawdzam na  analizatorze stanów logicznych.  Nie są idealne jest pomyłka

   

To jest oryginalna transmisja podejrzana niby 500us/div z 95r  ja muszę się "podszyć" i wysterować po swojemu znaki Wink

   

Taki czas pokazuje mi na analizatorze ustawione na 90/110 delay  bo tak gdzieś przeczytałem  by było wypełnienie na poziomie 55% pomyłka o 4us.

Wiem ze sygnały mam odwrócone ale to jeszcze przed testami głównymi.
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#6
W to co pokazuje SaleAE nie możesz wierzyć. 4us mogą być równie dobrze 2..3 czy 5..6us (próbkowanie masz 1us). Dodatkowo, nie wiesz jak wyglądają zbocza. Raczej nie masz się co przejmować tymi czasami. Pewni ważne aby nie były zbyt krótkie, a dłuższe mogą być, może nawet i kilka ms czy więcej.
 
Odpowiedź
#7
Odpowiednikiem funkcji millis() jest micros(), ale to może nie być dobry pomysł jeśli obieg pętli będzie trwał dłużej, a te czasy są krytyczne to lepiej zostawić jak jest. Dokładność micros() to też już około 5us.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#8
Panowie może takie głupie pytanie czy jak w "setup" ustawie sobie spi sprzętowe częstotliwość i tak dalej potem dam komendę SPI.end bo będę korzystał też inaczej z tych pinów w "viod" to czy potem znów muszę ustawiać??
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#9
Napisz po polsku dla pewności, ale chyba tak.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości