Witam dzisiaj chciałem przetestować odbieranie znaku wysyłanego przez komputer do USART mikrokontrolera. Sprawa okazała się bardzo prosta napisałem prosty programik który po wysłaniu znaku 'a' ma włączać diodę a na wysłanie znaku 'b' ma ją gasić. Ku mojemu zdziwieniu należy wysłać aa lub bb by uzyskać jakiś efekt. Nie wiem dlaczego się tak dzieje. Wysłanie samego znaku a nie powoduje niczego dopiero gdy powtórnie wyślę a to zmienia się stan. Zamieszczam kod programu jaki i bibliotekę.
Biblioteka USART
#include <avr/io.h>
#include "biblioteki/usart.c" // Biblioteka odpowiadająca za transmisję USART / USART library
#include <avr/interrupt.h> // Biblioteka przerwań
#include <rc5.h>
volatile char zmienna;
volatile char zmienna2;
int licznik = 0; // POMOCNICZY LICZNIK do UART
int licznik1 = 0; // POMOCNICZY LICZNIK do UART
int licz = 0;
#define FOSC 16000000 // Czestotliwosc zegara w Hz / System Clock in Hz
#define BAUD 19200 // Predkosc transmisji USART / USART speed
#define MYUBRR FOSC/16/BAUD
int main (void)
{
USART_Init(MYUBRR); // Inicjalizacja transmisjii USART
DDRA = 255; // TEST dla TOGGLE LED jako wyjście
PORTA=0xFF;
while(1) // Program glowny, petla nieskonczona
{
if(licz>=1000)
{
zmienna = USART_Receive();
if(licznik>=1000)
{
USART_Transmit(13); //ENTER (CR)
USART_Putint(zmienna);
licznik=0;
}
licznik++;
licz=0;
}
licz++;
if(zmienna == 98) // jeżeli b
PORTA=0x00;
if(zmienna == 97) // jeżeli a
PORTA=0xFF;
}} //zamyka while i main
Biblioteka USART
//--------------------------------------------------------------
// inicjacja portu szeregowego
//--------------------------------------------------------------
void USART_Init(unsigned int ubrr)
{
unsigned char temp = 0;
UBRRH = ubrr>>8; // ustawianie prędkości
UBRRL = ubrr;
UCSRB |= _BV(TXEN); // włączenie nadajnika
UCSRB |= _BV(RXEN); // włączenie odbiornika
temp |= _BV(URSEL); // ustawienie parametrów przesyłu, jeden bit stopu
temp |= _BV(UCSZ1); // 8bitów danych
temp |= _BV(UCSZ0); // brak parzystości
UCSRC = temp; // zapisanie parametrów do rejestru
}
//--------------------------------------------------------------
// odbiór danych
//--------------------------------------------------------------
char USART_Receive(void)
{
unsigned char data;
while (bit_is_clear(UCSRA,UDRE)); //czekanie na zwolnienie buforu danych
data = UDR;
return data;
}
//--------------------------------------------------------------
// wysyłanie danych
//--------------------------------------------------------------
void USART_Transmit(unsigned char data)
{
while (bit_is_clear(UCSRA,UDRE)); //czekanie na zwolnienie buforu danych
UDR=data; //zapisanie danych do rejestru UDR, wysyłanie następuje automatycznie
}
//--------------------------------------------------------------
// Wysłanie liczby do 9999
//--------------------------------------------------------------
void USART_Putint(uint16_t liczba)
{
uint16_t temp,temp1; // zmienne pomocnicze
temp1 = liczba%10000/1000; // wyodrębnienie cyfry tysięcy
if(temp1) // jeżeli zerowa to pomiń wysłanie
USART_Transmit(temp1+48); // wyślij w kodzie ASCII
temp = liczba%1000/100; // wyodrębnienie cyfry setek
if(temp|temp1) // jeżeli zerowa i cyfra tys. zerowa to pomiń wysłanie
USART_Transmit(temp+48); // wyślij w kodzie ASCII
temp = liczba%100/10; // wyodrębnienie cyfry dziesiątek
USART_Transmit(temp+48); // wyślij w kodzie ASCII
temp = liczba%10; // wyodrębnienie cyfry jedności
USART_Transmit(temp+48); // wyślij w kodzie ASCII
}