Witam!
Mam problem z odbieraniem danych wysłanych przez ATmege po RS232. Program na ATMedze jest następującyMa on za zadanie gasić i zapalać diodę po każdym odebranym znaku i odesłać znak '1' lub '0' w zależności od tego czy dioda świeci czy nie. Dioda zapala się lub gaśnie przy wysłaniu znaku przez terminal ale do terminala dochodzą tylko krzaczki. Próbowałem już zmieniać parametry transmisji na mniejsze prędkości ale zawsze jeżeli uda mi się zmusić diodę do poprawnego działania to i tak nie dostaję poprawnej odpowiedzi. Czy ma ktoś jakiś pomysł dlaczego tak się dzieje i jak jak to naprawić?
Mam problem z odbieraniem danych wysłanych przez ATmege po RS232. Program na ATMedze jest następujący
// Sterownie diodą LED podłączoną do dowolnej linii mikrokontrolera
// za pomocą dowolnego znaku odebranego z portu szeregowego
// mikrokontrolera i wysyłanie jej stanu na port szeregowy
#include <avr/io.h> // dostęp do rejestrów
// Zmieniając poniższe definicje można dostosować program do potrzeb
#define F_CPU 8000000ul // częstotliwość zegara w Hz
#define UART_BAUD 19200ul // prędkość transmisji bit/s
#define LED_PORT PORTD // port diody LED
#define LED_BIT 4 // bit diody LED
#define DDR(x) _SFR_IO8(_SFR_IO_ADDR(x)-1) // adr. rej. kier. PORTx
#define PIN(x) _SFR_IO8(_SFR_IO_ADDR(x)-2) // adr. rej. wej. PORTx
#define LED_PORT_O LED_PORT // rejestr wyjściowy
#define LED_PORT_D DDR(LED_PORT) // rejestr kierunkowy
#define LED_PORT_I PIN(LED_PORT) // rejestr wejściowy
#define UART_CONST (F_CPU/(16ul*UART_BAUD)-1)
#define cbi(sfr, b) (sfr &= ~(1<<b)) // bit 0 na pin portu
#define sbi(sfr, b) (sfr |= (1<<b)) // bit 1 na pin portu
// _UCR_
#ifdef UCR
#define _UCR_ UCR
#endif
#ifdef UCSRB
#define _UCR_ UCSRB
#endif
#ifdef UCSR0B
#define _UCR_ UCSR0B
#endif
// _USR_
#ifdef USR
#define _USR_ USR
#endif
#ifdef UCSRA
#define _USR_ UCSRA
#endif
#ifdef UCSR0A
#define _USR_ UCSR0A
#endif
// Definicje funkcji
// inicjalizacja portu szeregowego
unsigned char UBRR = (unsigned char)UART_CONST;
void UART_init(void)
{
UBRR = (unsigned char)UART_CONST; // ustaw prędkość transmisji
_UCR_ = _BV(RXEN)|_BV(TXEN); // załącz tx, rx
}
// wysyła znak podany jako parametr na port szeregowy
void UART_putchar (char c)
{
UDR = c; // wpisz c do rejestru UDR
loop_until_bit_is_set(_USR_,TXC); // czekaj na zakończenie transmisji
sbi(_USR_,TXC); // ustaw bit TXC w rej. USR
}
// odbiera znak z portu szeregowego i zwraca go jako wartość funkcji
char UART_getchar (void)
{
loop_until_bit_is_set(_USR_,RXC); // czekaj na zakończenie odbioru
cbi(_USR_,RXC); // skasuj bit RXC w rej. USR
return UDR; // zwróć zawartość rejestru UDR
}
int main(void) // program główny
{
UART_init(); // inicjalizacja portu szeregowego
sbi(LED_PORT_D,LED_BIT); // użyj linii jako wyjścia
while(1) // pętla nieskończona
{
cbi(LED_PORT_O,LED_BIT); // zapal diodę LED
UART_putchar('1'); // wyślij '1' na port szeregowy
UART_getchar(); // czekaj na znak z portu szeregowego
sbi(LED_PORT_O,LED_BIT); // zgaś diodę LED
UART_putchar('0'); // wyślij '0' na port szeregowy
UART_getchar(); // czekaj na znak z portu szeregowego
}
}