Работа ATMega8 с UART
Добавлено: Пт сен 21, 2012 23:26:02
Пожалуйста, подскажите, что не так:
И вот что имею в выводе:
86 87 88 89 8A 8B 8C 8D 8E * 8F 80 * 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E * 8F 90 * 91
Т.е. иногда бит переносится правильно, иногда нет.
Проблема не только при переходе с 8F:
CB CC CD CE CF *ок!* D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF *fail!* D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF *уже ок!* E0 E1
Я не вижу очевидной ошибки?
Смена uint8_t j = 0; на int j; эффекта не дает.
p.s. При этом тот же контроллер, если перепрошить, с ENC28J60 работает нормально, включая розетки по сети. И счетчик web-команд там работает корректно, специально дописал. Купил UART, думал отлаживать попроще будет.
Код: Выделить всё
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
void lUartInit (void)
{
PORTD |= 0x03;
DDRD &= ~0x01;
DDRD |= 0x02;
UCSRB = 0x00;
UBRRH = 0x00; // UBRR = (Fck/(16*BAUD)) – 1 ;
UBRRL = 0x03; // Для 8Мгц и 115200; UBRR = 8000000/(16*115200) – 1 = 3,34...
UCSRA = 0;
UCSRB =
(1<<RXEN) | // разрешает работу приёмника
(1<<TXEN) ; // разрешает работу передатчика
UCSRC =
(1<<URSEL) | // если установлен в 1 запись производится к UCSRC (иначе в UBRRH)
(1<<USBS) | // кол-во стоп битов 0-1; 1-2
(1<<UCSZ1) |
(1<<UCSZ0) ;
}
void lUartSend ( uint8_t data )
{
while ( !(UCSRA & (1 << UDRE)) );
UDR = data;
}
void delay_ms(unsigned int ms)
{
while(ms){
_delay_ms(0.96);
ms--;
}
}
int main(void)
{
lUartInit();
uint8_t j = 0;
while(1)
{
_delay_ms(1000);
j++;
lUartSend(j);
}
}
И вот что имею в выводе:
86 87 88 89 8A 8B 8C 8D 8E * 8F 80 * 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E * 8F 90 * 91
Т.е. иногда бит переносится правильно, иногда нет.
Проблема не только при переходе с 8F:
CB CC CD CE CF *ок!* D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF *fail!* D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF *уже ок!* E0 E1
Я не вижу очевидной ошибки?
Смена uint8_t j = 0; на int j; эффекта не дает.
p.s. При этом тот же контроллер, если перепрошить, с ENC28J60 работает нормально, включая розетки по сети. И счетчик web-команд там работает корректно, специально дописал. Купил UART, думал отлаживать попроще будет.