Skocz do zawartości

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


Mily2001

Pomocna odpowiedź

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 🙂

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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).

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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ę 😃

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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ć 😅

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.