Skocz do zawartości

[Kurs] Programowanie ARM LPC1114 cz.5 - RS-232


Elvis

Pomocna odpowiedź

Poprzednia część kursu.

[Kurs] Programowanie ARM LPC1114 cz.5 - RS-232

W poprzedniej wersji kursu komunikacja przez RS-232 została opisana dla procesora LPC-2114. Nowy procesor działa bardzo podobnie i w artykule opiszę jedynie różnice między układami. Zachęcam, więc najpierw do przeczytania poprzedniego kursu:

tutaj znajdziemy opis komunikacji

biblioteka standardowa (printf)

bootloader

Nowy procesor posiada jeden moduł UART, zamiast jak LPC2114 dwa. Pozwala to na obsługę jednego połączenia RS-232.

Część o komunikacji poprzez RS232 prawie bez zmian odnosi się do nowego procesora.

Biblioteka standardowa powoduje ogromne wydłużenie kodu, więc nie polecam jej stosowania. Niestety darmowy kompilator, jakim jest gcc nie najlepiej sobie z tym radzi.

Odcinek o bootloaderze jest w pełni aktualny na nowym procesorze. Tutaj też znajdziemy bootloader, jego działanie jest identyczne jak poprzednio.

Na początek inicjalizujemy moduł UART odpowiedzialny za komunikację przez RS-232.

#define BAUDRATE              	9600
#define BAUDRATEDIVISOR       	(48000000/(BAUDRATE*16))

void uart_init(void)
{
LPC_SYSCON->SYSAHBCLKCTRL |= 0x1000;

LPC_IOCON->PIO1_6 = 0x01;
LPC_IOCON->PIO1_7 = 0x01;
LPC_UART->FCR = 0x07;

LPC_UART->LCR = 0x80; // DLAB = 1;
LPC_UART->DLL = BAUDRATEDIVISOR & 0x00ff;
LPC_UART->DLM = (BAUDRATEDIVISOR >> 8) & 0x00ff;
LPC_UART->LCR &= ~0x80; // DLAB = 0;

//Set mode
LPC_UART->LCR = 0x03; //8 bit word length, 1 stop bit, No parity

}

Jak widać kod jest właściwie identyczny jak poprzednio. W definicji stałej BAUDRATEDIVISOR zmieniona została częstotliwość zegara, tym razem wynosi ona 48MHz, zamiast 15MHz jak poprzednio. Poza tym dostęp do rejestrów odbywa się przez znane już nam wskaźniki.

Inaczej ustawiamy też funkcję wyjść I/O. Zamiast rejestru PINSEL pojawia się kod:

LPC_IOCON->PIO1_6 = 0x01;
LPC_IOCON->PIO1_7 = 0x01;

Nie powinno być zaskoczeniem, że funkcja wysyłająca dane jest również podobna do poprzedniej wersji:

void uart_send_byte(const uint8_t byte)
{
 while(!(LPC_UART->LSR & 0x20));
 LPC_UART->THR = byte;
}

W pliku program13.zip znajdziemy przykładowy program.

Program kompilujemy i wgrywamy do procesora jak zwykle. Niestety gdy go uruchomimy, pojawiają się problemy.

Przyczyną jest znany nam z poprzedniej części bootloader. Linie RTS i DTR interfejsu RS-232 sterują resetem procesora oraz pinem uruchamiającym bootloader. W efekcie nasz program nie działa, gdy uruchamiamy terminal komunikacyjny.

Musimy zmienić program do komunikacji na taki, który pozwoli nam na sterowanie liniami RTS oraz DTR.

Polecam program Hercules, dostępny na stronie: http://www.hw-group.com/products/hercules/index_en.html

Uruchamiamy program, wybieramy zakładkę „Serial”, a następnie w ramce po prawej stronie ustawiamy parametry komunikacji:

• Name - nazwa portu do którego podłączony jest moduł

• Baud - prędkość transmisji 9600

• Data size - 8

• Parity - none

• Handshake - OFF

• Mode - Free

Następnie naciskamy przycisk „Open” i jeśli zostaną zaznaczone opcje „DTR” lub „RTS” to je wyłączamy:

Teraz jak widać mamy działającą komunikację przez RS-232, a jednocześnie możemy programować układ.

Wystarczy nacisnąć „Close” i za pomocą FlashMagic-a można wgrywać program.

Postępowanie jest więc następujące:

1) zaprogramuje procesor programem FlashMagic

2) przełącz się na Hercules, naciśnij Open

3) gdy wykonasz testy, naciśnij Close

4) zmień kod programu, skompiluj nową wersję

5) przełącz się na FlashMagic i wróć do pkt.1

Mając więc 3 uruchomione programy (LPCExpresso, FlashMagic, Hercules) możemy zmieniać, wgrywać i testować komunikację przez RS-232.

Kolejnym krokiem jest wydzielenie funkcji związanych z komunikacją do nowego modułu. W pliku program14.zip znajdziemy gotowy program.

Czas wykorzystać zdobytą wiedzę do sterowania naszym robotem. Kod programu znajdziemy w pliku program15.zip.

Sterowanie silnikiem zostało opisane w odcinku o PWM.

Odbieranie danych realizuje funkcja:

uint8_t uart_recv_byte(void)
{
 while(!(LPC_UART->LSR & 0x01));
 return LPC_UART->RBR;
}

Pętla główna programu wygląda następująco:

while(1) {
	c = uart_recv_byte();
	switch (c|32) {
	case 'w':
		pwm_set(100, 100);
		break;
	case 's':
		pwm_set(25, 25);
		break;
	case 'a':
		pwm_set(50, 0);
		break;
	case 'd':
		pwm_set(0, 50);
		break;
	default:
		pwm_set(0, 0);
	}
	uart_send_byte(c);
}

Jak widać jest to sterowanie robotem za pomocą znanej kombinacji znaków WSAD.

Sztuczka w instrukcji switch (c|32) pozwala na ignorowanie wielkości znaków. Można wysyłać małe lub duże litery, aby sterować robotem.

Mamy więc zdalnie sterowanego robota. Oczywiście jest to sterowanie przez RS-232, czyli kablowe.

Możemy łatwo to zmienić stosując gotowy moduł radiowy, np. bluetooth.

program13.zip

program14.zip

program15.zip

Link do komentarza
Share on other sites

Witam

mógłby kolega napisać jak wyglądała by funkcja odbierająca łańcuch znaków z terminala? Napisałem coś takiego:

void uart_recv_str(char *s) {
char  c;
        do{
          	 c = uart_recv_byte();
       	 if(c=='\b'){
       		 s--;
       	 }
       	 else{
       		 *s++ =c;
       	 }
       	 if(c=='\r'){
       		 *s=0;
       	 }
        }while(c !='\r');
}

Jednak funkcja w ogóle nie czeka aż przesłany zostanie jakiś znak. Zaraz po wywołaniu następuje wyjście z funkcj:/ Używam Termite jako terminala. Może ze znakiem końca linii jest coś nie tak?

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.