Форум myROBOT.ru » Шаг за шагом » Программирование микроконтроллеров » attiny2313+UART

Страниц (1): [1]
 

1. dossalab - 26 Ноября, 2013 - 02:41:58 - перейти к сообщению
Эксперементирую с bluetooth модулями. Подсоединил tx модуля напрямик к rx тиньки. Пишу в cvavr такой код:
CODE:

#include <tiny2313.h>
#include <stdio.h>
char BluetoothData;
void main(void)
{
UCSRA=0x00;
UCSRB=0x10;
UCSRC=0x06;
UBRRH=0x00;
UBRRL=0x33;

while (1)
{
BluetoothData=UDR;
PORTB.4=1;

if(BluetoothData=='1')
{
PORTB.2=1;
PORTB.3=0;
}
if(BluetoothData=='2')
{
PORTB.2=0;
PORTB.3=1;
}
if(BluetoothData=='a')
{
PORTB.2=0;
PORTB.3=0;
}

if(BluetoothData=='3')
{
PORTB.5=1;
PORTB.6=0;
}

if(BluetoothData=='4')
{
PORTB.5=0;
PORTB.6=1;
}

if(BluetoothData=='b')
{
PORTB.5=0;
PORTB.6=0;
}

if(BluetoothData=='5')
{
PORTB.1=1;
}

if(BluetoothData=='c')
{
PORTB.1=0;
}

};
}


На PORTB.1 - Фары, PORTB.5; PORTB.6;PORTB.2;PORTB.3 - двигатели, PORTB.4 - вывод enable L293D.

Но работает не очень хорошо, с перебоями. Включенные фары время от времени выключаются, или включаются самостоятельно. Двигатели иногда не выключаются, или включаются не с первого раза.
В чем дело?Есть ли другие способы приема/обработки UART?
2. Роботов - 26 Ноября, 2013 - 18:03:44 - перейти к сообщению
Кварц какой стоит?
3. dossalab - 27 Ноября, 2013 - 18:26:42 - перейти к сообщению
тактирование от внутреннего на 8 МГЦ. Сегодня привязал работу к таймеру. стало немного лучше, но все равно фары иногда отключаются Замешательство Добавил сигнал.
CODE:

#include <tiny2313.h>
#include <stdio.h>
#include <delay.h>
char BluetoothData;
char beep;

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
BluetoothData=UDR;
PORTB.4=1;

if(BluetoothData=='1')
{
PORTB.2=1;
PORTB.3=0;
}
if(BluetoothData=='2')
{
PORTB.2=0;
PORTB.3=1;
}
if(BluetoothData=='a')
{
PORTB.2=0;
PORTB.3=0;
}

if(BluetoothData=='3')
{
PORTB.5=1;
PORTB.6=0;
}

if(BluetoothData=='4')
{
PORTB.5=0;
PORTB.6=1;
}

if(BluetoothData=='b')
{
PORTB.5=0;
PORTB.6=0;
}

if(BluetoothData=='5')
{
PORTB.1=1;
}

if(BluetoothData=='c')
{
PORTB.1=0;
}

if(BluetoothData=='6')
{
beep = 1;
}

if(BluetoothData=='d')
{
beep = 0;
}

}

void main(void)
{
// Port B initialization
PORTB=0x00;
DDRB=0xFF;

// Timer/Counter 0 initialization
TCCR0A=0x00;
TCCR0B=0x01;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter Interrupt initialization
TIMSK=0x02;

// USART initialization
UCSRA=0x00;
UCSRB=0x10;
UCSRC=0x06;
UBRRH=0x00;
UBRRL=0x33;

// Global enable interrupts
#asm("sei")

while (1)
{
if (beep==1)
{
PORTB.0=1;
delay_ms(5);
PORTB.0=0;
delay_ms(5);
}
};
}

Роботов, вы же, кажется, делали управление роботом по Bluetooth? Можно посмотреть программу?
4. Роботов - 27 Ноября, 2013 - 22:47:41 - перейти к сообщению
Ну чего же вы хотите? От внутреннего генератора USART не будет нормально работать. Это я вам как создатель роботов говорю Голливудская улыбка
(Добавление)
Ставьте кварц, и желательно кратный частоте порта. Например 11.0592 Мгц
5. mihail - 28 Ноября, 2013 - 00:11:04 - перейти к сообщению
Роботов пишет:
кварц
Не поможет. Человек читает садержимое регистра данных UART когда ему вздумается и совершенно не обращает внимание на состояние UART.

Передача
void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) ) ;
/* Put data into buffer, sends the data */
UDR = data;
}


Прием
unsigned char USART_Receive( void )
{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) ) ;
/* Get and return received data from buffer */
return UDR;
}


Возможно потребуется немного модифицировать код для Ваших нужд. Но, принцип думаю ясен. Прежде чем читать из UDR или писать в UDR нужно проверить бит RXC или бит UDRE регистра UCSRA.

Примеры кода взяты из [url]http://www.atmel.com/images/doc2543.pdf‎[/url]
6. dossalab - 29 Ноября, 2013 - 23:16:37 - перейти к сообщению
поставил кварц 12 мгц, пересчитал uart. Поставил подтяжку на ресет. Поставил конденсаторы по питанию. Не помогает. Может быть, дело в коде? Роботов, можете выложить программу для управления по bluetooth?
7. Роботов - 01 Декабря, 2013 - 16:20:41 - перейти к сообщению
Да нивопрос. Вот, разбирайся.
(Добавление)
Там весь проект, вынь нужное. Самому вспоминать лень.