Skocz do zawartości

[C] Komunikacja między atmegą8 i atmegą16


Pomocna odpowiedź

Napisano

Witam,
Ostatnio dokupiłem sobie atmegę16. Programuję sobie układ i chciałbym wykorzystać atmegę16 jako podstawowy procek a atmegę8 jako wyjście (2x7segmentowe wyświetlacze). Moje pytanie jest takie: Jak połączyć i zaprogramować oba procki tak żeby wysyłać 8 bitową liczbę z atmegi16 do atmegi8?

Z góry dzięki za pomoc 🙂

Polecam wykorzystać USART. Jest prosty w obsłudze. Łączysz następująco:

ATMega16_TXD do ATMega8_RXD (wysyłasz z ATMega 16 do ATMega8)

ATMega16_RXD do ATMega8_TXD (to podłączasz jeżeli chcesz wysyłać w drugą stronę. jeżeli nie to to pomijasz).

A mógłbyś wytłumaczyć co konkretnie trzeba połączyć i jak mniej więcej powinien wyglądać taki program? Wystarczy komunikacja w jedną stronę 🙂

Połączenie tak jak napisałem:

ATMega16_TXD do ATMega8_RXD (wysyłasz z ATMega 16 do ATMega8)

Po prostu łączysz przewodem nóżkę 15 (PD1) ATMegi16 z nóżką 2 (PD0) ATMegi8 i tyle.

Natomiast program powinien wyglądać tak.. Musisz w obydwu prockach zainicjalizować USART.

Do nadajnika proponuje wpisać coś takiego:

UBRRL = 51;
UBRRH = 0;
UCSRC |= (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
UCSRB |= (1<<TXEN);

Liczba 51 da ci prędkość transmisji 34,8 kBps przy zegarze 8MHz. Możesz ustawić inna prędkość oczywiście. Poszukaj w tabelach jakie prędkości przy jakich zegarach są dostępne bez dużych błędów.

Bit TXEN uruchamia nadajnik.

Odbiornik inicjujesz na przykład takim kodem:

UBRRL = 51;
UBRRH = 0;
UCSRC |= (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
UCSRB |= (1<<RXEN) | (1<<RXCIE);

Prędkość oczywiście ta sama co w nadajniku. RXEN uruchamia odbiornik. RXCIE zezwala na przerwanie od odbiornika. Najlepiej odbierać dane w przerwaniu. Gdy uC odbierze całą liczbę to uruchomi sie przerwanie i tylko sobie ją odczytasz.

Odbiornik i nadajnik muszą mieć takie same ustawienia odnośnie rodzaju danej którą przesyłają. W tym kodzie jest dana 8-bitów, jeden bit stopu i brak kontroli parzystości.

A tu masz jakieś proste funkcje do wysyłania i odbioru.

Wysyłanie zmiennej typu char:

void UART_Wyslij(char znak)
{
while(bit_is_clear(UCSRA,UDRE)) {}
UDR=znak;
}

Odbiór zmiennej typu char.

char UART_Odbierz()
{
return UDR;
}
  • Pomogłeś! 1

Wielkie dzięki, działa w 98% dobrze. Jedynym problemem jest częstotliwość która jest za wysoka (8MHz). Jakbyś mógł podać jakiegoś linka czy coś do tabelki o której mówiłeś w poprzednim poście bo ja nie mam pojęcia pod jakim hasłem szukać tego w google. Jeszcze raz dzię-ku-ję 😃

Ustawiłem UBRRL na 12 przy prędkości 1MHz w obu prockach. Próbuję wysyłać inty w zakresie 0-999 a następnie wyświetlam je przy pomocy Atmegi8 na 7 segmentowym wyświetlaczu. Niestety liczenie do 999 kończy się na 255. Zapewne jest to spowodowane jakimś ograniczeniem bo wyraźnie widać tu górną granicę char-a. Więc pierwsze pytanie jest takie czy da się to jakoś zmienić żeby wysyłać wartości >255?

Kolejnym problemem jest to że zawsze tuż przed zmianą liczby na wyższą (przykładowo aktualnie wyświetla się 10) zapala się na kilka ms 11, potem znów 10 i po kilkudziesięciu ms już 11. Jest to dosyć irytujący błąd. Więc kolejne pytanie to to czy można to jakoś naprawić?

Testowałem wyświetlacze na pętli for i<1000 i wszystko działało bez problemów. Dopiero przy wysyłaniu intów z Atmegi16 do Atmegi8 występują te błędy.

Wysyłasz i odbierasz bajty, czyli 0-255. Jeśli chcesz wysłać i odebrać dwubajtowe (pow. 255) dane, musisz je sobie w odbiorniku "poskładać" do kupy w jedną zmienną np. int.

Jeśli masz mało danych i ramka jest zawsze stała, możesz na sztywno ustalić jak składać bajty na odbiorniku. Nadajnik zawsze wysyła (mogę się mylić) zmienną dwubajtową w kolejności MSB, LSB. Tak też musisz to złożyć w odbiorniku.

Jeśli dane są zmienne (tzn. zmiennej długości - np. znaki tekstu) potrzebny jest start i stop - ale to już kwestia tzw. protokołu transmisji danych.

A czy mógłby ktoś pokazać jakiś przykładowy kod do nadajnika i odbiornika przynajmniej dla liczb <1024 bo próbowałem sam coś zakodzić ale nie za bardzo chce działać 😅

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...