niveasoft napisał: Nie napisałeś jaki to procesor. Przykładowo dla Atmega8/Atmega32 wystarczy gdzieś napisać
UCSRB.TXEN = 0
Dla Mega328P UCSR0B.TXEN0 = 0
Mowa o Atmega16. Instrukcja UCSRB.TXEN = 0 rzeczywiście działa ale tylko do czasu, kiedy nie połączę się z drugą Atmegą.
Tak wygląda początek programu dla Atmega16 (odbiornik):
Zaloguj się, aby zobaczyć kod
A tak fragment programu Atmega8 wysyłającej dane:
Zaloguj się, aby zobaczyć kod
Obydwa mikrokontrolery połączone są ze sobą masą oraz jedną linią do przesyłu danych (TXD z Atmega8 do RXD Atmega16). Pinu TXD Atmega16 używam do uruchamiania przekaźnika (PK2).
Problem w tym, że nie mogę kontrolować portu PORTD.1 Atmegi16. Przy takim połączeniu na tym pinie występuje ciągle stan niski. Jeśli usunę instrukcję
Zaloguj się, aby zobaczyć kod
to na pinie pojawi się stan wysoki.
Zauważyłem, że przekaźnik załącza się jeśli nie ma połączenia między dwoma mikrokontrolerami lub jeśli w programie Atmegi8 (nadawczej) nie ma żadnych instrukcji związanych z transmisją szeregową (np. Print).
Dodano po 2 [godziny] 4 [minuty]: Znalazłem jeszcze taką informację:
"Blokowanie nadajnika (ustawienie TXEN na zero) nie będzie miało skutku dopóki trwająca i nie zakończona transmisja jest ukończona, np.: kiedy rejestr przesuwny nadajnika i rejestr buforu nadajnika nie zawierają danych do transmisji."
Pewnie ma to związek z 6. bitem rejestru USCRA:
"• Bit 6 – TXC: USART Transmit Complete
This flag bit is set when the entire frame in the transmit Shift Register has been shifted out and
there are no new data currently present in the transmit buffer (UDR). The TXC Flag bit is automatically cleared when a transmit complete interrupt is executed, or it can be cleared by writing a one to its bit location."
Czy dobrze rozumiem, że instrukcja UCSRB.TXEN = 0 zadziała dopiero, kiedy na USCRA.TXC pojawi się flaga 1?