Witam wszystkich.
Mam problem odnośnie synchronizacji dwóch atmega8 za pomocą jednej linii.
Mam do wykorzystania jeden przewód, którymi płyną dane w obu kierunkach (po 3 bajty). Nie ma możliwości dodania kolejnego z sygnałem zegarowym.
Tak więc sygnały zegarowe muszą być generowane przez oba mikroprocesory oddzielnie za pomocą timer'ów. I wszystko byłoby w porządku gdyby nie to, że identyczny program wgrany do obu uc działa "nie identycznie" tzn. generowane przerwania lekko różną się czasowo (co można dostrzec jedynie na oscyloskopie), skutkuje to "rozjeżdżaniem" obu zegarów przez co dane odbierane są niepoprawnie.
Dodam, że oba mikroprocesory taktowane są zewnętrznymi kwarcami 16MHz oraz kondensatory 33pF oraz będą pracowały w zupełnie różnych warunkach (wilgotność, temperatura...)
Dotykając lub zbliżając palec (zmieniając pojemność) do tych kondensatorów generowane przerwania lekko zmieniają się w czasie, więc ewidentnie dobierając odpowiednie pojemności kondensatorów timer'y ustabilizowałyby się względem siebie.
Dołączam kod programu napisanego w bascom'ie (na 100% nie jest to wina języka):
Moje pytanie brzmi:
Jak idealnie zsynchronizować częstotliwość kwarców tych atmeg (jeżeli to w ogóle możliwe)?
W przeciwnym wypadku jak ma wyglądać transmisja danych na jednym przewodzie tak aby można było wysyłać dane synchronizacji timer'ów (i jak je przestawiać)?
Z góry dziękuję za pomoc.
Mam problem odnośnie synchronizacji dwóch atmega8 za pomocą jednej linii.
Mam do wykorzystania jeden przewód, którymi płyną dane w obu kierunkach (po 3 bajty). Nie ma możliwości dodania kolejnego z sygnałem zegarowym.
Tak więc sygnały zegarowe muszą być generowane przez oba mikroprocesory oddzielnie za pomocą timer'ów. I wszystko byłoby w porządku gdyby nie to, że identyczny program wgrany do obu uc działa "nie identycznie" tzn. generowane przerwania lekko różną się czasowo (co można dostrzec jedynie na oscyloskopie), skutkuje to "rozjeżdżaniem" obu zegarów przez co dane odbierane są niepoprawnie.
Dodam, że oba mikroprocesory taktowane są zewnętrznymi kwarcami 16MHz oraz kondensatory 33pF oraz będą pracowały w zupełnie różnych warunkach (wilgotność, temperatura...)
Dotykając lub zbliżając palec (zmieniając pojemność) do tych kondensatorów generowane przerwania lekko zmieniają się w czasie, więc ewidentnie dobierając odpowiednie pojemności kondensatorów timer'y ustabilizowałyby się względem siebie.
Dołączam kod programu napisanego w bascom'ie (na 100% nie jest to wina języka):
$regfile = "m8def.dat"
$crystal = 8000000
Config Portb = Output
Portb = 0
Config Timer0 = Timer , Prescale = 1
Enable Timer0
Enable Interrupts
On Timer0 Io_data
Do
Loop
End
Io_data:
Toggle Portb.2
Return
Moje pytanie brzmi:
Jak idealnie zsynchronizować częstotliwość kwarców tych atmeg (jeżeli to w ogóle możliwe)?
W przeciwnym wypadku jak ma wyglądać transmisja danych na jednym przewodzie tak aby można było wysyłać dane synchronizacji timer'ów (i jak je przestawiać)?
Z góry dziękuję za pomoc.
