Jakiś pomysł na komunikację po 1 drucie be

May 29, 2016 7 Replies

Cześć.



Problem: w pewnym cpu został mi 1 pin. Chce podpiąc wyświetlacz i klawiaturę, odległość naście cm, prędkość znikoma.



Wstawiam więc drugi cpu.



Cpu1 to avr, cpu2 może być byleczym.



Teraz: cpu1 jest *bardzo* zajęty. Gdzieś koło 90% mocy w przerwaniach, dwa timery wolne. W głownej pętli programu mam chwilę (nierównomierne) na obsługę czegoś, co jakieś 1000-3000 cykli 20MHz. Cpu2 od wyświetlacza (2x16) i klawiatury nie ma nic do roboty.



No i teraz się zastanawiam, czy jest jakiś pomysł na komunikację po 1 drucie w *dwie* strony:



a) nie obciąza cpu sztucznymi pętlami opóźniającymi b) nie wymaga szybkiego poolingu na liniach c) może korzystać z hardware cpu, prawie wszystko wolne (pwm, timery, uart itd) d) da radę wysłać jakieś 100 bajtów / sek i odebrać 10 bajtów sek (jakość obsługi).



Oczywiście od razu nasuwa sie 1-wire, ale powtarzam: nie mam cpu dla siebie. Przyszedł mi do głowy pomysł aby sterować szerokością impulsu



1-wire za pomocą wolnego PWM. Gorzej z czytaniem, choć może dałbym radę trafiać jako tako z czytaniem pomiędzy przerwaniami. Oczywiscie to może być "moje" 1-wire i np. mogę je znacząco spowolnić. Moge też popędzić cpu1 większym zegarem ale to ostateczność.

Zanim zaczne kombinować z 1wire - czy zna ktoś inny protokół 1-drutowy? Od biedy mogę podpiąć wspólny XTAL do obu jesli coś to da.



Nie, nie zmienię avr-a cpu1 na coś innego. Nie ma nic innego w tym zastosowaniu (szybki cykl zegarowy, 5V) co miało by ekonomiczny sens.


W dniu 29.05.2016 o 22:56, Sebastian Biały pisze:

No to może jednak UART? Pod warunkiem, że możesz tak go poustawiać żeby jeden pin był na przemian nadajnikiem i odbiornikiem.

Oczywistym rozwiazaniem jest UART w half-duplex. 1-wire to nie jest dobry pomysl, bo przy ustalonej szybkosci transmisji wymaga duzo lepszej rozdzielczosci czasowej niz UART. Niekture procesory (np. STM32) maja UART sprzetowo wspierajacy half-duplex, w AVR nie zauwazylem takiej mozliwosci... Programowo UART mozna zrobic z timera kosztem jednego przerwania na bit. Tzn. uzywasz timer do pomiaru czasu miedzy zboczami przy odbiorze, przy nadawianiu machasz GPIO z przerwania timera. 1200 bitow na sekunde powinno Ci wystarczyc, wiec jak zniesiesz dodatkowe 1200 przerwan to bedzie OK.

Mozesz uzyc tez kombinowane rozwiazanie: sprzetowy UART do odbioru, softwarowy (na tej samej linii) do nadawania.

Jeszcze jeden pomysl: sporo CPU ma UART-y ktore moga odbierac np. 5MHz. Wiec z AVR mozesz nadawac z duza szybkoscia, tak ze bajt zajmie powiedzmy 2us. Na tyle pewnie mozesz zablokowac przerwania.

Zaemuluj UARTA programowo w głównej pętli (oczywiście nieblokująco). Synchronizację (zegar) wyznaczaj przez wolny timer. W najgorszym przypadku główna pętla jest wołana co 1,5ms więc odebrać 10 znaków/s powinno się dać bez problemu, nie wiem tylko czy wyślesz tak

100bajtów/sec (chociaż jeśli cpu2 będzie dość mądre to może da radę odebrać).

jp

Użytkownik "Sebastian Biały" snipped-for-privacy@poczta.onet.pl> napisał w wiadomości news:nifl22$9um$ snipped-for-privacy@node2.news.atman.pl...

Podwieszone OC - każdy może wymusić 0. Jeden cały czas taktuje linię - impulsy 0 krótsze od odstępów. Czasy dobrane tak, aby obserwujący linię nie przegapił impulsu. Jak chce coś nadać to zaczyna od dłuższego impulsu = bit startu itd. Jak drugi chce nadać to robi to przedłużając obserwowany impuls = bit startu. P.G.

W dniu 29.05.2016 o 22:56, Sebastian Biały pisze:

Może się przyda, wprawdzie potrzebujesz w 2 strony, ale może uda się ten pomysł rozwinąć.

formatting link

Czarek Grądys pisze:

Genialne w swojej prostocie, dodane do przydasiów, dzięki.

A PJON rozważałeś? Taka alternatywa do 1W:

formatting link

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required