реклама на сайте
подробности

 
 
> AVR на 16 Мгц и питание 3.6 вольт
zheka
сообщение Dec 16 2010, 08:00
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



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

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

Есть проект на ATmega128, задействованы все выводы. ИЗ-за 3 вольтовой периферии вынужден разгонять контроллер всего до 8 МГц, а так хочется 16. Согласнование не прокатит - слишком много линий связи.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zheka
сообщение Dec 16 2010, 09:33
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



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

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

Сообщение отредактировал zheka - Dec 16 2010, 09:34
Go to the top of the page
 
+Quote Post
ataradov
сообщение Dec 16 2010, 09:43
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202



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


Сообщение отредактировал Taradov Alexander - Dec 16 2010, 09:44
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 18:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.02304 секунд с 7
ELECTRONIX ©2004-2016