Witam,
od kilku dni walczę z tą nieszczęsną transmisją szeregową. Uprościłem kod niemalże maksymalnie. Jedynie odbiór znaku z terminala i odesłanie go. Aczkolwiek wciąż coś jest nie tak. Mianowicie powracający znak do terminala nie pokrywa się z wysłanym. Z analizy binarnej wygląda mniej więcej na coś takiego, że podczas odbioru znaku przez mikrokontroler jego postać binarna zostaje zanegowana oraz przesunięta o jeden w prawo, a następnie podczas wysyłania ponownie zanegowana i przesunięta o jeden w prawo i zostaje dodana jedynka na LSB. Dla niektorych znaków zostaje dodana dwójka lub trójka. A czasami podczas przesyłu do terminala przesunięcie bitowe wynosi dwa lub trzy.
Czy ktoś kiedykolwiek spotkał się z takim problemem i może wie w czym tkwi problem??? Bo ja zaraz osiwieje od rozgryzania tego :/
Korzystam z:
IC: ATmega32
Boud: 9600
F_CPU 16MHz
przejściówka USB-RS Prolific TTL, bezpośrednio podpięta pod piny ATmegi32
płytka testowa ZL3AVR
od kilku dni walczę z tą nieszczęsną transmisją szeregową. Uprościłem kod niemalże maksymalnie. Jedynie odbiór znaku z terminala i odesłanie go. Aczkolwiek wciąż coś jest nie tak. Mianowicie powracający znak do terminala nie pokrywa się z wysłanym. Z analizy binarnej wygląda mniej więcej na coś takiego, że podczas odbioru znaku przez mikrokontroler jego postać binarna zostaje zanegowana oraz przesunięta o jeden w prawo, a następnie podczas wysyłania ponownie zanegowana i przesunięta o jeden w prawo i zostaje dodana jedynka na LSB. Dla niektorych znaków zostaje dodana dwójka lub trójka. A czasami podczas przesyłu do terminala przesunięcie bitowe wynosi dwa lub trzy.
Czy ktoś kiedykolwiek spotkał się z takim problemem i może wie w czym tkwi problem??? Bo ja zaraz osiwieje od rozgryzania tego :/
Korzystam z:
IC: ATmega32
Boud: 9600
F_CPU 16MHz
przejściówka USB-RS Prolific TTL, bezpośrednio podpięta pod piny ATmegi32
płytka testowa ZL3AVR
Code:
#define F_CPU 16000000UL
#include <stdio.h>
#include <avr/io.h>
#include <util/delay.h>
// zmienne globalne
volatile uint8_t znak;
int wyslano = 0;
// inicjalizacja USART dla podanego BAUD
void USART_Init(unsigned long int baud)
{
UBRRH = (unsigned char)((F_CPU/16UL/baud-1)>>8);
UBRRL = (unsigned char)(F_CPU/16UL/baud-1);
UCSRB |= _BV(RXEN) |_BV(TXEN); //aktywacja odbiornika
UCSRC |= _BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0); //transmisja 8 bitów i 1 bit stopu
}
/////////////// PROGRAM GŁÓWNY //////////////////
void main(void)
{
USART_Init(9600); //ustawienie prędkości transmisji
while(1)
{
if(bit_is_set(UCSRA,RXC))
{
znak=UDR; // wartość z RX do zmiennej a
wyslano = 0;
}
// Wait if a byte is being transmitted
if(bit_is_set(UCSRA,UDRE))
{
if (wyslano == 0)
{
UDR = znak;
wyslano = 1;
}
}
}
}