roboforum.ru

Технический форум по робототехнике.

ATMEGA644P + UART/SPI

ATMEGA644P + UART/SPI

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);
  }
}

Re: ATMEGA644P + UART/SPI

=DeaD= » 04 июн 2009, 22:56

Вы бы задачи разделили - уарт+блютуз отдельно, еепром отдельно. Может у вас еепром глючит?

Просто возвращайте по уарту всё что пришло, но в скобках, типа отправляете абв, обратно приходит (а)(б)(в)

Если работает - значит с уартом всё ок, ищите грабли в работе с еепром.

Re: ATMEGA644P + UART/SPI

0-range » 05 июн 2009, 10:04

eeprom работает точно. Сам по себе записывает то, что нужно. Проблема явно в UART/SPI. Вот только какая, понять мы никак не можем :( :cry:

Re: ATMEGA644P + UART/SPI

=DeaD= » 05 июн 2009, 10:27

Фраза "работает точно" звучит регулярно и это не мешает чему-то не работать :)

Повторюсь - сделайте эхо со скобками и посмотрите что возвращается.

Re: ATMEGA644P + UART/SPI

0-range » 05 июн 2009, 10:50

Эхо сделать не можем, так как до контроллера данные не доходят. И от контроллера они тоже не уходят :cry: ЕЕПРОМ работает, мы писали туда символ и потом читали с помощью программатора.
Последний раз редактировалось EdGull 05 июн 2009, 12:27, всего редактировалось 1 раз.
Причина: Излишнее цитирование!!! В следующий раз будет предупреждение!

Re: ATMEGA644P + UART/SPI

EdGull » 05 июн 2009, 12:29

закоротите на bluetooth-модуле ноги Rx-Tx.
и если не получите эха на ПК, то ваш модуль лажает.

Re: ATMEGA644P + UART/SPI

yak-40 » 05 июн 2009, 12:33

На схемку бы посмотреть, может что с железом?

Re: ATMEGA644P + UART/SPI

0-range » 08 июн 2009, 17:23

EdGull писал(а):закоротите на bluetooth-модуле ноги Rx-Tx.
и если не получите эха на ПК, то ваш модуль лажает.

Закоротили RX/TX ноги у контроллера. Оказалось что лажает именно он.... (Без прерываний) :cry: :cry:
Пробовали использовать прерывания. Ничего не получилось, такое ощущения что он их просто не чухает. Вызывали 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, '!');
}


Re: ATMEGA644P + UART/SPI

=DeaD= » 08 июн 2009, 17:28

А в протеусе гонять не пробовали?

Re: ATMEGA644P + UART/SPI

0-range » 10 июн 2009, 19:28

Вобщем мы идиоты. Компилировали под atmega644P а у нас был просто atmega644 =)))))
Теперь есть другой вопрос. С помощью какой микросхемы можно трансформировать напряжение с 5 вольт на 3.3 =)

Re: ATMEGA644P + UART/SPI

Duhas » 10 июн 2009, 19:57

если надо переходник на уарт - я выкладывал схемку в ветке что-то типа "чайник и OR-BT-..."

Re: ATMEGA644P + UART/SPI

EdGull » 10 июн 2009, 20:58

0-range писал(а):С помощью какой микросхемы можно трансформировать напряжение с 5 вольт на 3.3 =)

самое простое LM1117-33

Re: ATMEGA644P + UART/SPI

Duhas » 10 июн 2009, 22:25

я думаю вопрос о сигнальных линиях в том числе, поэтому:
RoboBus_UART_LVL_shift.pdf
(3.34 КиБ) Скачиваний: 16

level_shifter.pdf
(16.81 КиБ) Скачиваний: 26

Re: ATMEGA644P + UART/SPI

EdGull » 10 июн 2009, 22:29

что сие творение означает?
почему не читаем стандарт на робобас?

Re: ATMEGA644P + UART/SPI

Duhas » 10 июн 2009, 22:30

в чем проблема со стандартом?


Rambler\'s Top100 Mail.ru counter