Aktykuły które nie zmieściły się w żadnej kategorii

0102 /03
04Jednym z najbardziej popularnych interfejsów komunikacyjnych jest RS-232 w procesorach występuje on pod nazwą UART. Podstawową zaletą tego interfejsu komunikacyjnego jest łatwość sprzętowej realizacji wymaga tylko 3 przewodów, a w przypadku tylko monitorowania 2 przewodów. Daje nam możliwość wysłania oraz odebrania danych z terminala i wyświetlenie ich na ekranie komputera.

Przedstawione poniżej rozwiązanie można szybko uruchomić za parę złotych przy pomocy dowolnego konwertera UART na RS232 lub USB.

Biblioteka składa się z kilku procedur i została wytestowana na procesorach ATmega328 oraz ATmega644 i im pochodnych.

Pierwsze polecenie jakiego musimy użyć to rsStart, które inicjuje UART-0 w procesorze.
Od tej chwili możemy wysyłać do okna terminala teksty oraz liczby całkowite i zmiennoprzecinkowe.
Istotna uwaga! UART w procesorze, jeżeli nie utrzymuje połączenia elektrycznego z konwerterem nie powoduje zawieszenia procesora w odróżnieniu do innych rodzajów transmisji obsługiwanych w przez procesor np. TWI.

Podłączenie w dowolnym momencie ( sprzętu ) natychmiastowo daje komunikaty w oknie terminala.

Jak komuś nie pasuje moje nazewnictwo procedur oczywiście może je bez problemu zmienić na swoje, pamiętając by zmian dokonać w obu pliku jednocześnie *.h i *.c .
06
070809
  1. rsStart(9600); // inicjowanie uarta na 9600
  2. rsPrintLn("pierwsza linia tekstu"); // wysłanie tekstu
  3. rsInt(1327839); rsNext; // wysłanie liczby
Procedura inicjująca UART. W kompilacji warunkowej są wypisane procesory dla których ta procedura działa poprawnie. Oczywiście można dopisać jeszcze i inne procesory, w których występują identyczne rejestry pod względem nazwy i zastosowania ( działania ).
  1. void uart0_init( long int baud )
  2. {
  3. #if (defined(__AVR_ATmega328__)   || defined(__AVR_ATmega328P__)   || \
  4.      defined(__AVR_ATmega328PA__) || defined(__AVR_ATmega1284P__)  || \
  5.      defined(__AVR_ATmega1284__)  || defined(__AVR_ATmega1284PA__) || \
  6.      defined(__AVR_ATmega644__)   || defined(__AVR_ATmega644A__)   || \
  7.      defined(__AVR_ATmega644P__)  || defined(__AVR_ATmega644PA__)  || \
  8.      defined(__AVR_ATmega88__)    || defined(__AVR_ATmega88A__)    || \
  9.      defined(__AVR_ATmega88P__)   || defined(__AVR_ATmega88PA__) )
  10. // ustawianie UCSR0A w zależności od zegara CPU
  11. #if F_CPU >= 8000000UL
  12.      uint16_t ubrr_cal = (uint16_t) ((uint32_t) F_CPU/(16*baud) - 1);
  13.      UCSR0A &= ~(1<<U2X0); 
  14. #else
  15.      uint16_t ubrr_cal = (uint16_t) ((uint32_t) F_CPU/(8*baud) - 1);
  16.      UCSR0A |= (1<<U2X0);
  17. #endif
  18. // obliczanie prędkości i wpisywanie do rejestru UBRR0 H i L 
  19.      UBRR0H = (uint8_t)(ubrr_cal>>8);//konfiguracja baud
  20.      UBRR0L = (uint8_t)ubrr_cal;
  21.      UCSR0B = (1<<RXEN0)|(1<<TXEN0);//włączenie UART
  22.      UCSR0C = (1<<UCSZ00)|(1<<UCSZ01);
  23.           // UCSR0B |=(1<<RXCIE0); włączenie przerwania UART-a
  24. #ifdef rxISR
  25.      UCSR0B |= (1<<RXCIE0);//włączenie przerwania RX UART
  26. #endif
  27. #elif (defined(__AVR_ATmega8__) || defined(__AVR_ATmega32__) )
  28. #if F_CPU >= 8000000UL
  29.      uint16_t ubrr_cal = (uint16_t) ((uint32_t) F_CPU/(16*baud) - 1);
  30.      UCSRA &= ~(1<<U2X); 
  31. #else
  32.      uint16_t ubrr_cal = (uint16_t) ((uint32_t) F_CPU/(8*baud) - 1);
  33.      UCSRA |= (1<<U2X);
  34. #endif
  35.      UBRRH = (uint8_t)(ubrr_cal>>8);//konfiguracja baud
  36.      UBRRL = (uint8_t)ubrr_cal;
  37.      UCSRB = (1<<RXEN)|(1<<TXEN); // enable receiver and transmitter
  38.      UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); // 8bit data format(1<<URSEL)|
  39. #endif
  40. }
Zestaw procedur w bibliotece.
  1. /**********************************************
  2. * RS232.c   Stworzone 2016-07-22
  3. *                 Autor: DASEJ
  4. * ATMEGA644 16MHz  ATMEGA328 16MHz
  5. * Wysyłanie danych działa
  6. * inicjalizacja USART0 dla xxxxx b/s, 8N1, 
  7. * jako interfejs asynchroniczny: 
  8. ***********************************************/
  9. #ifndef RS232_H_
  10. #define RS232_H_
  11. #define rsNext rsNextLine() 
  12. #define rsClear rsClearScrTerminal()
  13. void uart0_init(long int baud);
  14. void rsStart(long int speed); // xxxxx b/s, 8N1, 
  15. void rsClearScrTerminal(void);
  16. void rsSend(unsigned char dane);
  17. void rsPrint(char text[]); 
  18. void rsPrintLn(char text[]); 
  19. void rsInt( long num );
  20. void rsReal( double real, uint8_t znakow, uint8_t po_przecinku );
  21. void rsNextLine(void); 
  22. unsigned char rsRead( void );
  23. #endif /* RS232_H_ */
download library

W poniższych tabelach są przedstawione ustawiania rejestrów prędkości pracy UART-a oraz współczynniki błędów dla poszczególnych częstotliwości procesora.


Tabela UART

Tabela UART

Tabela UART

Tabela UART

Tabela UART

Tabela UART

Tabela UART

Tabela UART

Tabela UART

Tabela UART

Dasej (C) 2019 : 4581