Buduję pewien układ zawierający dwa mikrokontrolery ATMega328. Nazwijmy je A i B. Mikrokontroler A ma kwarc 16MHz, a mikrokontroler B ma kwarc 8MHz.
Mikrokontrolery są połączone przewodem 4-żyłowym o długości ok. 30cm, z których dwie żyły to zasilanie i masa, trzecia żyła łączy B0 mikrokontrolera A z C4 mikrokontrolera B, czwarta żyła łączy B1 mikrokontrolera A z C5 mikrokontrolera B.
Wszystko jest prawie dobrze, ale jest pewien problem z napięciami. Wszystkie pomiary robię w miejscu mikrokontrolera B.
Na mikrokontrolerze A uruchamiam ten program (z kodu usunąłem wszystko, co nie jest związane z przedmiotem wątku, jednak podkreślam, że w mikrokontrolerze A korzystam z przetwornika ADC):
W mikrokontrolerze B mam taki kod (cały kod bez zmian, pierwsze testy i już widzę problem):
Podstawy czasu wszystkich przebiegów oprócz ostatniego to 0,2ms/div
Pierwszy pomiar przeprowadzam bez mikrokontrolera B, jest wstawiony tylko mikrokontroler A.
Przebieg na C4 mikrokontrolera B (a właściwie podstawki, bo mikrokontroler jest wyjęty) jest prawidłowy i zgodny z oczekiwaniem:
Przebieg na C5 mikrokontrolera B nosi jakby przebicia z C4, teoretycznie powinna być stała 5V, jednak to ma być wejście a nie wyjście, więc załóżmy, że to nie przeszkadza:
Teraz wstawiam mikrokontroler B i teraz tak się prezentuje przebieg na C4, w tym przypadku również jest zgodny z oczekiwaniem:
Natomiast przebieg na C5 już na pierwszy rzut oka nie jest prawidłowy. Na tej linii w ogóle nie powinno być przebiegu z C4:
W chwili obecnej na C5 powinny być impulsy z częstotliwością 150kHz. Po zmianie podstawy czasu na 5us/div, impulsy są generowane prawidłowo, ale wygląda na to, że ze stanem wysokim na tej linii jest jakiś problem:
Co może być przyczyną niechcianego przebicia przebiegów pomiędzy liniami?
Co może być przyczyną zaniżania napięcia stanu wysokiego przy przebiegu generowanego z mikrokontrolera B?
Jak mikrokontroler B był osadzony w programatorze, to przebieg na linii C5 był generowany prawidłowo, z prawidłowymi poziomami napięć.
Dodano po 25 [minuty]:
Do mikrokontrolera A wgrałem poniższy program (zamieszczam całość) i problem nadal występuje:
Dodano po 18 [minuty]:
Robię dalsze testy. Jak wyłączyłem podciągnięcie w B1 mikrokontrolera A, to przebieg bez mikrokontrolera B wygląda następująco:
Pomiar z mikrokontrolerem B:
Co ciekawe, powtórzyłem pomiary podłączając masę i sondę przy mikrokontrolerze A i wyniki są takie same. Następnie odłączyłem od przewodu płytkę z mikrokontrolerem B i pomiar przy mikrokontrolerze A również wykazywał przebicia. Następnie odłączyłem przewód i żadnych przebić nie było.
Sam przewód jest przewodem USB 4-żyłowym pozyskanym z jakiegoś uszkodzonego gadżetu, więc mało prawdopodobne, żeby taki przewód nie nadawał się do przesyłania sygnałów cyfrowych wysokiej częstotliwości. Czy to jest możliwe, że sam przewód powoduje problemy? Jeżeli tak, to na na co zwracać uwagę przy wyborze przewodu?
Mikrokontrolery są połączone przewodem 4-żyłowym o długości ok. 30cm, z których dwie żyły to zasilanie i masa, trzecia żyła łączy B0 mikrokontrolera A z C4 mikrokontrolera B, czwarta żyła łączy B1 mikrokontrolera A z C5 mikrokontrolera B.
Wszystko jest prawie dobrze, ale jest pewien problem z napięciami. Wszystkie pomiary robię w miejscu mikrokontrolera B.
Na mikrokontrolerze A uruchamiam ten program (z kodu usunąłem wszystko, co nie jest związane z przedmiotem wątku, jednak podkreślam, że w mikrokontrolerze A korzystam z przetwornika ADC):
Kod: C / C++
W mikrokontrolerze B mam taki kod (cały kod bez zmian, pierwsze testy i już widzę problem):
Kod: C / C++
Podstawy czasu wszystkich przebiegów oprócz ostatniego to 0,2ms/div
Pierwszy pomiar przeprowadzam bez mikrokontrolera B, jest wstawiony tylko mikrokontroler A.
Przebieg na C4 mikrokontrolera B (a właściwie podstawki, bo mikrokontroler jest wyjęty) jest prawidłowy i zgodny z oczekiwaniem:
Przebieg na C5 mikrokontrolera B nosi jakby przebicia z C4, teoretycznie powinna być stała 5V, jednak to ma być wejście a nie wyjście, więc załóżmy, że to nie przeszkadza:
Teraz wstawiam mikrokontroler B i teraz tak się prezentuje przebieg na C4, w tym przypadku również jest zgodny z oczekiwaniem:
Natomiast przebieg na C5 już na pierwszy rzut oka nie jest prawidłowy. Na tej linii w ogóle nie powinno być przebiegu z C4:
W chwili obecnej na C5 powinny być impulsy z częstotliwością 150kHz. Po zmianie podstawy czasu na 5us/div, impulsy są generowane prawidłowo, ale wygląda na to, że ze stanem wysokim na tej linii jest jakiś problem:
Co może być przyczyną niechcianego przebicia przebiegów pomiędzy liniami?
Co może być przyczyną zaniżania napięcia stanu wysokiego przy przebiegu generowanego z mikrokontrolera B?
Jak mikrokontroler B był osadzony w programatorze, to przebieg na linii C5 był generowany prawidłowo, z prawidłowymi poziomami napięć.
Dodano po 25 [minuty]:
Do mikrokontrolera A wgrałem poniższy program (zamieszczam całość) i problem nadal występuje:
Kod: C / C++
Dodano po 18 [minuty]:
Robię dalsze testy. Jak wyłączyłem podciągnięcie w B1 mikrokontrolera A, to przebieg bez mikrokontrolera B wygląda następująco:
Pomiar z mikrokontrolerem B:
Co ciekawe, powtórzyłem pomiary podłączając masę i sondę przy mikrokontrolerze A i wyniki są takie same. Następnie odłączyłem od przewodu płytkę z mikrokontrolerem B i pomiar przy mikrokontrolerze A również wykazywał przebicia. Następnie odłączyłem przewód i żadnych przebić nie było.
Sam przewód jest przewodem USB 4-żyłowym pozyskanym z jakiegoś uszkodzonego gadżetu, więc mało prawdopodobne, żeby taki przewód nie nadawał się do przesyłania sygnałów cyfrowych wysokiej częstotliwości. Czy to jest możliwe, że sam przewód powoduje problemy? Jeżeli tak, to na na co zwracać uwagę przy wyborze przewodu?
