Jump to content

    
Sign in to follow this  
zheka

AVR на 16 Мгц и питание 3.6 вольт

Recommended Posts

Наткнулся на описание контроллера ATmega128RFA1 - из последних, может работать от 3.6 вольт и разгоняться при этом до 16 МГц. Он с радиотрансивером.

 

Интересует следующее - есть ли какие-нибудь другие реинкарнации ATMega128 (важна pin-to-pin совместимость), способные работать на такой частоте при напряжении 3.3 вольт ?

 

Есть проект на ATmega128, задействованы все выводы. ИЗ-за 3 вольтовой периферии вынужден разгонять контроллер всего до 8 МГц, а так хочется 16. Согласнование не прокатит - слишком много линий связи.

 

Share this post


Link to post
Share on other sites

нда...

Что самое интересное, в том проекте как раз трансивер отдельный используется, и эта атмега могла бы убить сразу двух зайцев но... зело сложен в ней трансивер....

Edited by zheka

Share this post


Link to post
Share on other sites
зело сложен в ней трансивер....

Что значит сложен? В простейшем случае принять-отправить кадр - это программа на несколько десятков строчек.

Share this post


Link to post
Share on other sites

Taradov Alexander, а Вам приходилось работать с cc2500? Что на Ваш взгляд лучше?

Может ли ATmega работать с PCB-антенной?

 

Кстати - пытался на сайте атмель найти пример кода - не смог. Не ткнете пальцем?

Edited by zheka

Share this post


Link to post
Share on other sites
Taradov Alexander, а Вам приходилось работать с cc2500? Что на Ваш взгляд лучше?
Не работал. Я по долгу службы работаю с атмелом :)

 

Может ли ATmega работать с PCB-антенной?

Да, конечно.

 

Кстати - пытался на сайте атмель найти пример кода - не смог. Не ткнете пальцем?

 

Не знаю где это есть на сайте, но вот кусок простейшего кода, который я использовал для тестов.Код грязный, но представление дает. Используются и basic и extended режимы, для basic можно установку адресов пропустить.

 

#include <avr/io.h>
#include <avr/interrupt.h>
#include "atmega128rfa1.h"

#define DEVICE 0
//#define DEVICE 1

#define BASIC 0

#define PANID   (0x1234)
#define SADDR   DEVICE //(0x0001)
#define EADDR   (0xaabbccdd00000000LL | SADDR)

//
// Types
//
typedef struct
{
 uint8_t  phr;
 uint16_t fcf;
 uint8_t  seq;
 uint16_t dpan;
 uint16_t daddr;
 uint16_t saddr;
 uint8_t  data;
 uint16_t crc;
} Frame_t;

//
// Variables
//
uint8_t txCnt = 0;
uint8_t payload = 0;

volatile int rxReceived = 0;
volatile uint8_t rxPayload;

volatile int txWaitInt = 0;

//
// Functions
//
void infBlink(void)
{
 long i;

 cli();
 PORTE = 0;
 while (1)
 {
	PORTE ^= 0xff;
for (i = 0; i< 20000; i++)
  asm("nop");
 }
}

void setState(uint8_t state)
{
 TRX_STATE = CMD_FORCE_TRX_OFF;
 TRX_STATE = state;
 while (state != (TRX_STATUS & REG_TRX_STATUS_TRX_STATUS_MASK));
}

void sendFrame(uint8_t payload)
{
 int i;
 Frame_t frame;

#if BASIC
 setState(TRX_CMD_PLL_ON);
#else
 setState(TRX_CMD_TX_ARET_ON);
#endif

 frame.phr = sizeof(Frame_t)-1;
 frame.fcf = (1 << 0) /*data*/ | (1<<5) /*ackReq*/ | (1<<6) /*panIdComp*/  | (2<<10) /*dstAddrMode*/ | (2<<14) /*srcAddrMode*/;
 frame.dpan = PANID;
 frame.saddr = SADDR;
 frame.daddr = 1-SADDR;
 frame.seq = txCnt++;
 frame.data = payload;

 for (i = 0; i < sizeof(Frame_t); i++)
TRX_FRAME_BUFFER(i) = ((uint8_t *)&frame)[i];

 txWaitInt = 1;
 TRX_STATE = CMD_TX_START;
}

ISR(TRX24_RX_END_vect)
{
 setState(TRX_CMD_PLL_ON);

 PORTE ^= (1<<3);

 rxPayload = TRX_FRAME_BUFFER(9);
 rxReceived = 1;
}

ISR(TRX24_TX_END_vect)
{
 PORTE ^= (1<<2);

 if (txWaitInt)
txWaitInt = 0;
 else
infBlink();
}

void rfInit(void)
{
 TRXPR_struct._trxrst = 1;

 setState(TRX_CMD_TRX_OFF);

 CSMA_SEED_1_struct._aack_set_pd = 1;
 CSMA_SEED_1_struct._aack_dis_ack = 0;

 IRQ_STATUS = IRQ_STATUS_CLEAR_VALUE;
 IRQ_MASK_struct._rx_end_en = 1;
 IRQ_MASK_struct._tx_end_en = 1;
 sei();

 PHY_CC_CCA_struct._channel = 0x0f;
 TRX_CTRL_2_struct._rx_safe_mode = 1;

 CSMA_SEED_0 = (uint8_t)SADDR;

 {
uint16_t vPanId = PANID;
uint8_t *panId = (uint8_t *)&vPanId;
PAN_ID_0 = panId[0];
PAN_ID_1 = panId[1];
 }

 {
uint16_t vShortAddr = SADDR;
uint8_t *shortAddr = (uint8_t *)&vShortAddr;
SHORT_ADDR_0 = shortAddr[0];
SHORT_ADDR_1 = shortAddr[1];
 }

 {
uint64_t vExtAddr = EADDR;
uint8_t *extAddr = (uint8_t *)&vExtAddr;
IEEE_ADDR_0 = extAddr[0];
IEEE_ADDR_1 = extAddr[1];
IEEE_ADDR_2 = extAddr[2];
IEEE_ADDR_3 = extAddr[3];
IEEE_ADDR_4 = extAddr[4];
IEEE_ADDR_5 = extAddr[5];
IEEE_ADDR_6 = extAddr[6];
IEEE_ADDR_7 = extAddr[7];
 }

}

int main()
{
 long i;

 DDRE = 0xff;
 PORTE = 0xff;

 rfInit();

#if DEVICE == 0
#if BASIC
 setState(TRX_CMD_RX_ON);
#else
 setState(TRX_CMD_RX_AACK_ON);
#endif
 while (1)
 {
// Wait for frames
if (rxReceived)
{
  for (i = 0; i < 10000; i++) // Wait a bit
	asm("nop");

  rxReceived = 0;
  sendFrame(rxPayload);
  while (txWaitInt)
	asm("nop");
#if BASIC
  setState(TRX_CMD_RX_ON);
#else
  setState(TRX_CMD_RX_AACK_ON);
#endif
}
 }
#endif

#if DEVICE == 1
 while (1)
 {
for (i = 0; i < 1000000; i++)
  asm("nop");

// Send frame
sendFrame(payload);
while (txWaitInt)
  asm("nop");

// Wait for response
rxReceived = 0;
#if BASIC
setState(TRX_CMD_RX_ON);
#else
setState(TRX_CMD_RX_AACK_ON);
#endif
for (i = 0; i < 1000000; i++)
{
  if (rxReceived)
  {
	if (payload == rxPayload)
	  payload++;
	else
	  infBlink();
	break;
  }
}
 }
#endif

 while (1);

 return 0;
}

Edited by Taradov Alexander

Share this post


Link to post
Share on other sites
блин, у них на сайте даже нормального описания evaluation kit нет.
Да, есть такая проблема. Но схема есть, и она не сильно сложная - разобраться можно :)

 

Share this post


Link to post
Share on other sites
да схема и в даташите есть. Мне бы пример топологии с PCB антенной....

Для примера PCB антены можно посмотреть на документацию на кит Raven. Он на отдельном трансивере, но антена не меняется.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this