Технический форум по робототехнике.
0-range » 04 июн 2009, 22:54
Есть микроконтроллер atmega644p и соединённый с ним bluetooth-модуль spkebm001a. Установлено соединение между ноутбуком и bluetooth-модулем. На модуль данные вроде как приходят (моргает светодиод) но вот до контроллера они не доходят. Пробовали UART и SPI, результат один и тот же. При попытке сохранения полученного символа в eeprom контрллера, сохранятеся либо 00 либо ничего вообще. В чём проблема непонятно. Также пробовали ещё и соединение по COM-порту через схемы собранную на max232.Результат тот же.
Листинг для SPI
- Код: Выделить всё • Развернуть
void SPI_MasterInit(void)
{
DDRB = (1<<DDB5)|(1<<DDB7)
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
void SPI_MasterTransmit(char cData)
{
SPDR = cData;
while(!(SPSR & (1<<SPIF)))
;
}
void SPI_SlaveInit(void)
{
DDRB = (1<<DDB6);
/* Enable SPI */
SPCR = (1<<SPE);
}
char SPI_SlaveReceive(void)
{
while(!(SPSR & (1<<SPIF)))
;
return SPDR;
}
void main()
{
SPI_SlaveInit();
while (1)
{
char vh = SPI_SlaveReceive();
eeprom_write(0x00, vh);
}
}
Листинг для UART
- Код: Выделить всё • Развернуть
void USART_Init( unsigned int baud )
{
UBRRH0 = (unsigned char)(baud>>8);
UBRRL0 = (unsigned char)baud;
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
/* Set frame format: 8data, 2stop bit */
UCSR0C = (1<<USBS0)|(3<<UCSZ00);
}
void USART_Transmit( unsigned char data )
{
while ( !( UCSR0A & (1<<UDRE0)) )
;
UDR0 = data;
}
unsigned char USART_Receive( void )
{
while ( !(UCSR0A & (1<<RXC0)) )
;
return UDR0;
}
void main()
{
USART_Init(9600);
while (1)
{
char vh = USART_Receive();
eeprom_write(0x00, vh);
}
}
=DeaD= » 04 июн 2009, 22:56
Вы бы задачи разделили - уарт+блютуз отдельно, еепром отдельно. Может у вас еепром глючит?
Просто возвращайте по уарту всё что пришло, но в скобках, типа отправляете абв, обратно приходит (а)(б)(в)
Если работает - значит с уартом всё ок, ищите грабли в работе с еепром.
0-range » 05 июн 2009, 10:04
eeprom работает точно. Сам по себе записывает то, что нужно. Проблема явно в UART/SPI. Вот только какая, понять мы никак не можем
=DeaD= » 05 июн 2009, 10:27
Фраза "работает точно" звучит регулярно и это не мешает чему-то не работать
Повторюсь - сделайте эхо со скобками и посмотрите что возвращается.
0-range » 05 июн 2009, 10:50
Эхо сделать не можем, так как до контроллера данные не доходят. И от контроллера они тоже не уходят
ЕЕПРОМ работает, мы писали туда символ и потом читали с помощью программатора.
Последний раз редактировалось
EdGull 05 июн 2009, 12:27, всего редактировалось 1 раз.
Причина: Излишнее цитирование!!! В следующий раз будет предупреждение!
EdGull » 05 июн 2009, 12:29
закоротите на bluetooth-модуле ноги Rx-Tx.
и если не получите эха на ПК, то ваш модуль лажает.
yak-40 » 05 июн 2009, 12:33
На схемку бы посмотреть, может что с железом?
0-range » 08 июн 2009, 17:23
EdGull писал(а):закоротите на bluetooth-модуле ноги Rx-Tx.
и если не получите эха на ПК, то ваш модуль лажает.
Закоротили RX/TX ноги у контроллера. Оказалось что лажает именно он.... (Без прерываний)
Пробовали использовать прерывания. Ничего не получилось, такое ощущения что он их просто не чухает. Вызывали sei(), не помогло. Что мы делаем не так? Может быть инициализировали UART неправильно? Код прилагаю
- Код: Выделить всё • Развернуть
#include <avr/io.h>
//#define F_CPU 1000000UL
#include <util/delay.h>
#include <avr/eeprom.h>
//#include <avr/iom644.h>
#include <avr/interrupt.h>
//#define USART0_RX 0x0028
//#define USART0_TX 0x002C
#ifndef F_CPU
#define F_CPU 11059200//Hz
#endif
/*********** set desired baud rate *************************************************/
#define BAUDRATE 19200 //bod//calculate UBRR value
#define UBRRVAL ((F_CPU/(BAUDRATE*16UL))-1) //UBRVAL - Èíäåêñ ñêîðîñòè
unsigned char USART_Receive( void )
{
/* Wait for data to be received */
while ( !(UCSR0A & (1<<RXC0)) )
;
/* Get and return received data from buffer */
return UDR0;
}
ISR(USART0_TX_vect)
{
//char rc = USART_Receive();
//eeprom_write_byte(0x01, rc);
eeprom_write_byte(0x02, '$');
}
void USART_Init()
{
/* Set baud rate */
//UBRR0 = (unsigned char)(baud>>8);
UBRR0 = (unsigned char)UBRRVAL;
/* Enable receiver, transmitter and interrupts on RX*/
UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0)|(1<<TXCIE0);
/* Set frame format: 8data, 2stop bit */
UCSR0C = (1<<USBS0)|(3<<UCSZ00);
eeprom_write_byte(0x03, ']');
}
void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSR0A & (1<<UDRE0)) )
;
/* Put data into buffer, sends the data */
UDR0 = data;
}
int main(void)
{
//sei();
asm("sei");
char tc = '?';
USART_Init();
USART_Transmit(tc);
eeprom_write_byte(0x00, '!');
}
=DeaD= » 08 июн 2009, 17:28
А в протеусе гонять не пробовали?
0-range » 10 июн 2009, 19:28
Вобщем мы идиоты. Компилировали под atmega644P а у нас был просто atmega644 =)))))
Теперь есть другой вопрос. С помощью какой микросхемы можно трансформировать напряжение с 5 вольт на 3.3 =)
Duhas » 10 июн 2009, 19:57
если надо переходник на уарт - я выкладывал схемку в ветке что-то типа "чайник и OR-BT-..."
EdGull » 10 июн 2009, 20:58
0-range писал(а):С помощью какой микросхемы можно трансформировать напряжение с 5 вольт на 3.3 =)
самое простое LM1117-33
Duhas » 10 июн 2009, 22:25
я думаю вопрос о сигнальных линиях в том числе, поэтому:
EdGull » 10 июн 2009, 22:29
что сие творение означает?
почему не читаем стандарт на робобас?
Duhas » 10 июн 2009, 22:30
в чем проблема со стандартом?