Ponieważ jest to mój pierwszy post chciałbym wszystkich serdecznie powitać
.
Mój problem polega na tym, że nie mogę ustawić połączenia uC <-> PC z Atmegą 128. Przy AT16 wszystko jest w porządku, a ze 128 wyświetla mi nieprawidłowe znaki w Terminalu. Przy transmisji dioda się świeci i i wszystko poza tym działa jak powinno.
Dodam tylko, że przejrzałem posty dotyczące podobnych tematów lecz niestety nie znalazłem rozwiązania.
Mój problem polega na tym, że nie mogę ustawić połączenia uC <-> PC z Atmegą 128. Przy AT16 wszystko jest w porządku, a ze 128 wyświetla mi nieprawidłowe znaki w Terminalu. Przy transmisji dioda się świeci i i wszystko poza tym działa jak powinno.
#include <avr/io.h> // dostęp do rejestrów
// Zmieniając poniższe definicje można dostosować program do potrzeb
#define F_CPU 14745600ul // częstotliwość zegara w Hz
#define UART_BAUD 19200ul // prędkość transmisji bit/s
#define LED_PORT PORTB // port diody LED
#define LED_BIT 7 // 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)
// _UCR_
#ifdef UCR
#define _UCR_ UCR
#endif
#ifdef UCSRB
#define _UCR_ UCSRB
#endif
#ifdef UCSR1B
#define _UCR_ UCSR1B
#endif
// _USR_
#ifdef USR
#define _USR_ USR
#endif
#ifdef UCSRA
#define _USR_ UCSRA
#endif
#ifdef UCSR1A
#define _USR_ UCSR1A
#endif
// Definicje funkcji
// inicjalizacja portu szeregowego
void UART_init(void)
{
UBRR1L = (unsigned char)UART_CONST; // ustaw prędkość transmisji
_UCR_ = _BV(RXEN1)|_BV(TXEN1); // załącz tx, rx
}
// wysyła znak podany jako parametr na port szeregowy
void UART_putchar (char c)
{
UDR1 = c; // wpisz c do rejestru UDR
loop_until_bit_is_set(_USR_,TXC1); // czekaj na zakończenie transmisji
_USR_ |= _BV(TXC1);//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_,RXC1); // czekaj na zakończenie odbioru
_USR_ &=~_BV(RXC1);//cbi(_USR_,RXC); // skasuj bit RXC w rej. USR
return UDR1; // zwróć zawartość rejestru UDR
}
int main(void) // program główny
{
UART_init(); // inicjalizacja portu szeregowego
LED_PORT_D |= _BV(LED_BIT);//sbi(LED_PORT_D,LED_BIT); // użyj linii jako wyjścia
while(1) // pętla nieskończona
{
LED_PORT_O &= ~_BV(LED_BIT);//cbi(LED_PORT_O,LED_BIT); // zapal diodę LED
UART_putchar('m'); // wyślij '1' na port szeregowy
UART_getchar(); // czekaj na znak z portu szeregowego
LED_PORT_O |= _BV(LED_BIT);//sbi(LED_PORT_O,LED_BIT); // zgaś diodę LED
UART_putchar('n'); // wyślij '0' na port szeregowy
UART_getchar(); // czekaj na znak z portu szeregowego
}
}
Dodam tylko, że przejrzałem posty dotyczące podobnych tematów lecz niestety nie znalazłem rozwiązania.
