Jakiś pomysł na komunikację po 1 drucie be

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.

Reply to
Sebastian Biały
Loading thread data ...

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.

Reply to
Jakub Rakus

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.

Reply to
antispam

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

Reply to
jacek pozniak

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.

Reply to
Piotr Gałka

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

Reply to
Czarek Grądys

Czarek Grądys pisze:

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

Reply to
AlexY

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

formatting link

Reply to
Marek

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.