Здравствуйте! Нужна помощь начинающим. Пытаюсь изучить uart но ,что то не понимаю .
Почему при первой отправки на мк любого символа , один раз он возвращается а потом идут нули.
#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "pin_macros.h"
unsigned char data;
unsigned long long vrema;
unsigned char a=1;
#define Pin4 C,4,H
#define Pin5 C,5,H
#define Pin3 C,3,H
#define Pin2 C,2,L
#define Pin1 C,1,H
#define Pin0 C,0,H
unsigned char status, status1;
unsigned char *pstatus;
unsigned char i = 0;
//*** Инициализация UART ***//
void uart_init(void)
{
//скорость обмена данными
UBRRH = 0; //старший байт
UBRRL = 51; //младший байт
//8 бит данных, 1 стоп бит, без контроля четности
UCSRC = ( 1 << URSEL ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 );
//разрешить прием и передачу данных
UCSRB = ( 1 <<RXEN )|(1<<RXCIE) |( 1 << TXEN ) | (1<<TXCIE);//|( 1 << UDRIE )
//UCSRB |= (1<<RXCIE) | (1<<TXCIE); //Разрешаем прерывание при передаче
DRIVER(Pin4,OUT);
DRIVER(Pin5,OUT);
DRIVER(Pin3,IN);
DRIVER(Pin2,IN);
DRIVER(Pin1,IN);
DRIVER(Pin0,IN);
DRIVER(Pin3,PULLUP);
DRIVER(Pin2,PULLUP);
DRIVER(Pin1,PULLUP);
DRIVER(Pin0,PULLUP);
}
ISR(USART_RXC_vect)
{
data=UDR;
}
/*
ISR(USART_TXC_vect){
//UDR = data;
}
*/
ISR( USART_UDRE_vect )
{
}
//*** Прием данных по UART ***///*
/*unsigned char uart_receive(void)
{
while ( ! ( UCSRA & ( 1 << RXC )));
return UDR;
a=2;
}*/
//*** Передача данных по UART ***//
void uart_transmit( uint8_t data)
{
while ( ! ( UCSRA & ( 1 << UDRE )));
UDR = data;
a=0;
}
//———————————————
void timer_ini(void)
{
TCCR1B |= (1<<WGM12); // устанавливаем режим СТС (сброс по совпадению)
TIMSK |= (1<<OCIE1A); //устанавливаем бит разрешения прерывания 1ого счетчика по совпадению с OCR1A(H и L)
OCR1A = 7812;//OCR1AL = 0b00000000;//OCR1AH = 0b10000000; //записываем в регистр число для сравнения
TCCR1B = (1<<CS12)|(1<<CS10)|(1<<WGM12);//установим делитель. // Start Timer1 with prescaler 1024
}
ISR (TIMER1_COMPA_vect)
{
}
//*** Главная программа ***//
int main(void)
{ pstatus=&status;
DDRD = 0x00; //установим все порты DDRD как входы
PORTD = 0x00; //установим логический 0 на все порты DDRD
sei();// разрешаем прерывания
uart_init();
timer_ini();
while(1)
{
vrema++;
if(vrema>=10000){
a=2;
//data++;
vrema=0;}
if(data==0b00110001)
{
ON(Pin5); // PORTC |= 1 << 5; //устанавливаем логическую 1 на порт PC5 регистра DDRC
data='8';
}
if(data==0b00110010)
{
OFF(Pin5); //PORTC &= ~(1 << 5); //устанавливаем логический 0 на порту PC5 регистра DDRC
}
if(data==0b00110011)
{
ON(Pin4); //PORTC |= 1 << 4; //устанавливаем логическую 1 на порт PC4 регистра DDRC
}
if(data==0b00110100)
{
OFF(Pin4);//PORTC &= ~(1 << 4); //устанавливаем логический 0 на порту PC4 регистра DDRC
}
if(a==2){
uart_transmit(data);
}
}
}
atmega8 уарт.rar