Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Ответ:

Отправлено vinogradov aleksei 05 сентября 2007 г. 13:28
В ответ на: Вопрос в догонку, а как вам удалось достичь 17мкА, можно код посмотреть, и еще вопрос, как вы мерили ток потребления, а то тестером померил оказалось в районе 40-50мкА, понятно что показания не верны (хотя усреднение за 1сек.) отправлено <font color=gray>AlHakim</font> 05 сентября 2007 г. 12:51

#include

//Ñîäåðæèìîå ýòîãî áóôåðà ïåðåäàåòñÿ ïî ðàäèîêàíàëó
unsigned char rf_transmitting_buffer[38];

// ýòîò ìàññèâ çàïèñûâàåòñÿ ïðåîáðàçîâàííûé â ÷èïû 16-áàéòîâûé ïàêåò
unsigned char chips_array[32];

//Èíäåêñ ïåðåäàâàåìîãî ïî ðàäèîêàíàëó áèòà â áóôåðå "rf_transmitting_buffer"
unsigned char bit_index;

//Èíäåêñ ïåðåäàâàåìîãî ïî ðàäèîêàíàëó áàéòà â áóôåðå "rf_transmitting_buffer"
unsigned char byte_index;

//Âñïîìîãàòåëüíàÿ ïåðåìåííàÿ
unsigned char i;

//Åñëè ýòîò ôëàã ðàâåí åäèíèöå, òî ñîîáùåíèå ñëåäóåò ïåðåäàâàòü
unsigned char start_transmitting_flag;

//Åñëè ýòîò ôëàã ðàâåí åäèíèöå, òî ðàçðåøåí ïåðåõîä â ñïÿùèé ðåæèì
unsigned char sleep_enable_flag;

//Ñ÷åò÷èê âðåìåíè, â òå÷åíèå êîòîðîãî îáå êíîïêè îòïóùåíû
unsigned char release_button_duration;

//Êîïèðàéò :)
const flash unsigned char copyright[]="The simple RF remote control handheld unit. 01.06.2007";

//Êîìàíäà âêëþ÷åíèÿ íàãðóçêè
const flash unsigned char load_on[]="Device_0000_On_";
//Êîìàíäà îòêëþ÷åíèÿ íàãðóçêè
const flash unsigned char load_off[]="Device_0000_Off";

//Ïðåàìáóëà (16 áèòîâûõ èíòåðâàëîâ, ïåðåäàâàåìûõ íà ñêîðîñòè 1200 áèò/ñåê.)
const flash unsigned char preamble[]={0xCC,0xCC,0xCC,0xCC};

//Ñèíõðîíèçèðóþùàÿ ïîñëåäîâàòåëüíîñòü (òðè áèòîâûõ èíòåðâàëà ñ îáîèìè ÷èïàìè, ðàâíûìè íóëþ) ïëþñ åäèíè÷íûé ñòàðò-áèò,
//ïåðåäàâàåìûé â Ìàí÷åñòåðñêîé êîäèðîâêå (1->0)
const flash unsigned char sync_plus_start_bit=0x02;

//Ñòîï-áèò, ïåðåäàâàåìûé â Ìàí÷åñòåðñêîé êîäèðîâêå (1->0)
const flash unsigned char stop_bit=0x80;

//Áèòîâûå ìàñêè
const flash unsigned char bit_masks[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};

//Ôóíêöèÿ ïðîâåðÿåò ïðàâèëüíîñòü CRC (íà âõîä ïîäàåòñÿ ìàññèâ èç 16-òè áàéòîâ, ïîñëåäíèé èç êîòîðûõ - CRC). Ôóíêöèÿ äåëèò
//ïîëó÷åííûé ìàññèâ íà îáðàçóþùèé ïîëèíîì è âîçâðàùàåò îñòàòîê îò äåëåíèÿ. Îáðàçóþùèé ïîëèíîì: x^8 + x^4 + x^3 + x^2 + 1
unsigned char crc_counter (unsigned char *start_addr)
{
unsigned char inData;
unsigned char remainder; //Çäåñü íàêàïëèâàåòñÿ îñòàòîê îò äåëåíèÿ
unsigned char i, j;

remainder=0; //Ñíà÷àëà îñòàòîê îò äåëåíèÿ ðàâåí íóëþ

for (i=0;i<16;i++){
inData=*(start_addr + i);
for (j=0; j<8; j++){if (remainder > 127) remainder = remainder ^ 0x0e;
if ((remainder ^ inData) < 128) remainder = remainder << 1;
else {remainder = remainder << 1;
remainder = remainder | 0x01;
}
inData = inData << 1;
}
}
return remainder;
}

//Ôóíêöèÿ ïðåîáðàçóåò áèòû â ÷èïû
void convert_bits_to_chips(void)
{
unsigned char i, j, k;
unsigned char manchester_zero; //0->1
unsigned char manchester_one; //1->0

for(i=0;i<32;i++)chips_array[i]=0; //Î÷èùàåì ìàññèâ ÷èïîâ
k=0; //Íà÷èíàåì ôîðìèðîâàòü ìàññèâ ÷èïîâ ñ íóëåâîãî áàéòà

//Ïàêåò ñîñòîèò èç 16 áàéòîâ
for(i=5;i<21;i++){
//Îáðàáàòûâàåì ñòàðøèå 4 ðàçðÿäà
manchester_zero=0x40; //0->1 ñòàðøèìè ðàçðÿäàìè âïåðåä
manchester_one=0x80; //1->0 ñòàðøèìè ðàçðÿäàìè âïåðåä
for(j=0;j<4;j++){if ((rf_transmitting_buffer[i] & bit_masks[j]) != 0) chips_array[k]=chips_array[k] | manchester_one;
else chips_array[k]=chips_array[k] | manchester_zero;
manchester_one=manchester_one>>2;
manchester_zero=manchester_zero>>2;
}
k++;
//Îáðàáàòûâàåì ìëàäøèå 4 ðàçðÿäà
manchester_zero=0x40; //0->1 ñòàðøèìè ðàçðÿäàìè âïåðåä
manchester_one=0x80; //1->0 ñòàðøèìè ðàçðÿäàìè âïåðåä
for(j=4;j<8;j++){if ((rf_transmitting_buffer[i] & bit_masks[j]) != 0) chips_array[k]=chips_array[k] | manchester_one;
else chips_array[k]=chips_array[k] | manchester_zero;
manchester_one=manchester_one>>2;
manchester_zero=manchester_zero>>2;
}
k++;
}
}

//Ýòà ôóíêöèÿ ôîðìèðóåò ïåðåäàâàåìóþ ïî ðàäèîêàíàëó êîìàíäó
void create_command (flash unsigned char *start_addr)
{
PORTC.5=1; //Çàæå÷ü ñâåòîäèîä
//Íà÷èíàåì ôîðìèðîâàòü ñîîáùåíèå. Ñîîáùåíèå âñåãäà íà÷èíàåòñÿ ñ ïðåàìáóëû
for(i=0;i<4;i++) rf_transmitting_buffer[i]=preamble[i];
//Çàòåì ñëåäóåò ñèíõðîíèçèðóþùàÿ ïîñëåäîâàòåëüíîñòü ñ åäèíè÷íûì ñòàðò-áèòîì
rf_transmitting_buffer[4]=sync_plus_start_bit;
//Çàòåì èäåò ñàìî ïåðåäàâàåìîå ñîîáùåíèå
for(i=5;i<20;i++) rf_transmitting_buffer[i]=*(start_addr + i - 5);
//È ýòî ñîîáùåíèå çàâåðøàåòñÿ 16-ì áàéòîì (CRC)
rf_transmitting_buffer[20]=0;
rf_transmitting_buffer[20]=crc_counter(&rf_transmitting_buffer[5]);
//Ïðåîáðàçóåì ñîîáùåíèå â ôîðìàò, óäîáíûé äëÿ ìàí÷åñòåðñêîé ïåðåäà÷è
convert_bits_to_chips();
//È ïîìåñòèì ïðåîáðàçîâàííîå ñîîáùåíèå â ïåðåäàâàåìûé ïî ðàäèîêàíàëó áóôåð
for(i=0;i<32;i++) rf_transmitting_buffer[i+5]=chips_array[i];
//Çàâåðøèì ñîîáùåíèå åäèíè÷íûì ñòîï-áèòîì
rf_transmitting_buffer[37]=stop_bit;
//È íà÷íåì ïåðåäàâàòü åãî ïî ðàäèîêàíàëó
bit_index=0; //Íà÷èíàåì ïåðåäàâàòü ñîîáùåíèå ñ íóëåâîãî áèòà
byte_index=0; //Íà÷èíàåì ïåðåäàâàòü ñîîáùåíèå ñ íóëåâîãî áàéòà
}

//Îáðàáîò÷èê ïðåðûâàíèÿ ïî íàæàòèþ êíîïêè "On"
interrupt [EXT_INT0] void ext_int0_isr(void)
{
sleep_enable_flag=0; //Çàïðåòèòü ïåðåõîä â ñïÿùèé ðåæèì
create_command(&load_on[0]);
GICR&=0x3f; //Çàïðåòèòü ïðåðûâàíèÿ îò êíîïîê
start_transmitting_flag=1; //Íà÷àòü ïåðåäà÷ó
}

//Îáðàáîò÷èê ïðåðûâàíèÿ ïî íàæàòèþ êíîïêè "Off"
interrupt [EXT_INT1] void ext_int1_isr(void)
{
sleep_enable_flag=0; //Çàïðåòèòü ïåðåõîä â ñïÿùèé ðåæèì
create_command(&load_off[0]);
GICR&=0x3f; //Çàïðåòèòü ïðåðûâàíèÿ îò êíîïîê
start_transmitting_flag=1; //Íà÷àòü ïåðåäà÷ó
}

//Îáðàáîò÷èê ïðåðûâàíèÿ îò Ò/Ñ1. Îí âûïîëíÿåò ïåðåäà÷ó äàííûõ
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
if (start_transmitting_flag==0) return; //Ïðîâåðèì, íóæíî ëè ïåðåäàâàòü äàííûå
if (byte_index==38){PORTC.5=0; //Ïîãàñèòü èíäèêàòîð ïåðåäà÷è
PORTB.2=0; //Ñáðîñèòü â íîëü ëèíèþ äàííûõ ïåðåäàò÷èêà
if ((PIND.2==0) | (PIND.3==0)) {release_button_duration=0; return;}
if (release_button_duration<240) {release_button_duration++; return;} else {
release_button_duration=0;
start_transmitting_flag=0; //Ïåðåäà÷à îêîí÷åíà
GIFR|=0xC0; //Ñáðîñèòü ôëàãè ïðåðûâàíèé ïî ëèíèÿì INT0 è INT1
GICR|=0xC0; //Ðàçðåøèòü ïðåðûâàíèÿ îò êíîïîê
sleep_enable_flag=1; //Ðàçðåøèòü ïåðåõîä â ñïÿùèé ðåæèì
return; //Âûéòè èç îáðàáîò÷èêà, åñëè ïðåàìáóëà ïåðåäàíà
}
}

PORTB.2=rf_transmitting_buffer[byte_index] & bit_masks[bit_index];
if (bit_index==7) {bit_index=0;
byte_index++; //Åùå îäèí áàéò ïåðåäàí
}
else bit_index++;
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;

// Port C initialization
// Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTC=0x00;
DDRC=0x7F;

// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=P State2=P State1=0 State0=0
PORTD=0x0C;
DDRD=0xF3;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 7370,000 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x0C;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Low level
// INT1: On
// INT1 Mode: Low level
GICR|=0xC0;
MCUCR=0x00;
GIFR=0xC0;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

start_transmitting_flag=0; //Âíà÷àëå ïåðåäàò÷èê äîëæåí "ìîë÷àòü"
sleep_enable_flag=1; //Ðàçðåøèòü ïåðåõîä â ñïÿùèé ðåæèì
release_button_duration=0; //È ïðè ýòîì íè îäíà êíîïêà íå íàæàòà

// Global enable interrupts
#asm("sei")
//Ïåðåõîäèì â ñïÿùèé ðåæèì (Power Down), åñëè ýòî ñåé÷àñ äîïóñòèìî
while (1){if ((PIND.2==1) & (PIND.3==1)) {if (sleep_enable_flag==1){MCUCR=MCUCR & 0xaf;
MCUCR=MCUCR | 0xa0;
#asm("sleep");
}
}
};
}



Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
увеличьте 3 в два раза:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru