Witajcie mam następujący problem, mam prosty program do wysyłania 1 oraz 0 w odstępie co sekundę. Jednak zamiast tego są jakieś krzaki. Moje pytanie w czym może leżeć problem, załączam kod, oraz wygląd na terminalu, kolejne pytanie to czy muszę programować fuse bity do odpowiedniego działania UARTA czy to właśnie przez to jest problem, oraz co się mogło by stać jeśli np zamienie wejścia z kości max232 do mikrokontrolera TXD z RXD??
Dodano po 34 [minuty]:
przerobiłem troche kod ale dalej to samo, krzaki mi wysyła.
#include <avr/io.h> // dostęp do rejestrów
#include <util/delay.h>
#define F_CPU 1000000ul // częstotliwość zegara w Hz
#define UART_BAUD 9600ul // prędkość transmisji bit/s
#define cbi(sfr, b) (sfr &= ~(1<<b))
#define sbi(sfr, b) (sfr |= (1<<b))
#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)
// _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
void UART_init(void)
{
UBRRL = (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
}
void delay_ms( int ms)
{
volatile long unsigned int i;
for(i=0;i<ms;i++)
_delay_ms(1);
}
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('A'); // 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('D'); // wyślij '0' na port szeregowy
delay_ms(500);
//UART_getchar(); // czekaj na znak z portu szeregowego
}
}
Dodano po 34 [minuty]:
przerobiłem troche kod ale dalej to samo, krzaki mi wysyła.
#include <avr/io.h> // dostęp do rejestrów
#include <util/delay.h>
#define F_CPU 1000000 //częstotliwość zegara w Hz
#define UART_BAUD 9600 //prędkość transmisji
#define UART_CONST (F_CPU/(16ul*UART_BAUD)-1) // prędkość transmisji bit/s
void delay_ms( int ms)
{
volatile long unsigned int i;
for(i=0;i<ms;i++)
_delay_ms(1);
}
int main(void) // program główny
{
DDRB=0x00;
PORTB=0xFF;
UART_init();
while(1)
{
UART_putc(2);
delay_ms(1000);
}
}
void UART_init(void)
{
// ustaw prędkość transmisji
UBRRH = (unsigned char)(UART_CONST >> 8);
UBRRL = (unsigned char)(UART_CONST & 0xFF);
// załącz odbiornik i nadajnik
UCSRB = _BV(RXEN)|_BV(TXEN);
// ustalenie formatu ramki: 8bit, 2 bity stopu
UCSRC = _BV(URSEL)|_BV(USBS)|_BV(UCSZ1)|_BV(UCSZ0);
}
void UART_putc( unsigned char data )
{
while (!( UCSRA & (1<<UDRE)) ); //(bit_is_clear(UCSRA,UDRE));
{
UDR = data;
}
}