Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AVR на 16 Мгц и питание 3.6 вольт
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
zheka
Наткнулся на описание контроллера ATmega128RFA1 - из последних, может работать от 3.6 вольт и разгоняться при этом до 16 МГц. Он с радиотрансивером.

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

Есть проект на ATmega128, задействованы все выводы. ИЗ-за 3 вольтовой периферии вынужден разгонять контроллер всего до 8 МГц, а так хочется 16. Согласнование не прокатит - слишком много линий связи.
Dx!
Нет. ATmega128RFA1 уникальна по многим параметра. 16MHz у ней с 1.8V.
zheka
нда...
Что самое интересное, в том проекте как раз трансивер отдельный используется, и эта атмега могла бы убить сразу двух зайцев но... зело сложен в ней трансивер....
ataradov
QUOTE (zheka @ Dec 16 2010, 14:23) *
зело сложен в ней трансивер....

Что значит сложен? В простейшем случае принять-отправить кадр - это программа на несколько десятков строчек.
zheka
Taradov Alexander, а Вам приходилось работать с cc2500? Что на Ваш взгляд лучше?
Может ли ATmega работать с PCB-антенной?

Кстати - пытался на сайте атмель найти пример кода - не смог. Не ткнете пальцем?
ataradov
QUOTE (zheka @ Dec 16 2010, 15:33) *
Taradov Alexander, а Вам приходилось работать с cc2500? Что на Ваш взгляд лучше?
Не работал. Я по долгу службы работаю с атмелом sm.gif

QUOTE (zheka @ Dec 16 2010, 15:33) *
Может ли ATmega работать с PCB-антенной?

Да, конечно.

QUOTE (zheka @ Dec 16 2010, 15:33) *
Кстати - пытался на сайте атмель найти пример кода - не смог. Не ткнете пальцем?


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

CODE
#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;
}
zheka
блин, у них на сайте даже нормального описания evaluation kit нет.
То ли дело у TI...
ataradov
QUOTE (zheka @ Dec 16 2010, 16:19) *
блин, у них на сайте даже нормального описания evaluation kit нет.
Да, есть такая проблема. Но схема есть, и она не сильно сложная - разобраться можно sm.gif
zheka
да схема и в даташите есть. Мне бы пример топологии с PCB антенной....
ataradov
QUOTE (zheka @ Dec 16 2010, 16:23) *
да схема и в даташите есть. Мне бы пример топологии с PCB антенной....

Для примера PCB антены можно посмотреть на документацию на кит Raven. Он на отдельном трансивере, но антена не меняется.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.