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

 
 
 
Reply to this topicStart new topic
> уменьшение потребления AVR, код не оптимально использует AVR
Electronic)
сообщение Nov 22 2008, 13:30
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 97
Регистрация: 15-04-08
Пользователь №: 36 783



Здравствуйте форумчане. Задача стоит в минимализации поребления AVR что бы устройство работало от батарейки годами. Столкнулся с такой проблемой:

для большей ясности использовал только режими idele в котором потребелние составило - 414мка (прерывания запрещены). при запушеной программе и без использования Idle потребление ~ 1000 мка.

в перывание avr входит по таймеру Т2 который работает в асинхронном режиме и по прерыванию с ножки С1.
в main только if(idle==1){idle=0;SMCR=0x01;asm("sleep");} и if(sleep==1){sleep=0;SMCR=0x07;asm("sleep");} .

некоторые тех данные
частота 1Мц. питание 5В (потом будет 3.6)
PRR=0x8f.
компилятор ICC 6.31A с кряком

вся программа довольно не большая и ясная. Потребеление привёл для того что бы можно было оценивать скорость работы кода.

и теперь сама суть:

#pragma interrupt_handler timer2_compa_isr:8
void timer2_compa_isr(void){ OCR2A+=16;idle=1;

if(bit==10){
if(bit==2){OCR2A+=H1;if(START==0){TCCR0A=0x42;st_T0();TCCR0B=0x01;}idle=1;}
if(bit==3){OCR2A+=(12-H1);TCCR0A=0xc0;TCCR0B=0x80;st_T0();bit=0;idle=1;}
if(bit==6){OCR2A+=14;PCIFR=7;PCICR=2;PCMSK1=2;bit=0;idle=1;}
}
потребляемый ток 455мка

а если

#pragma interrupt_handler timer2_compa_isr:8
void timer2_compa_isr(void){ OCR2A+=16;idle=1;

if(bit==10){/*
if(bit==2){OCR2A+=H1;if(START==0){TCCR0A=0x42;st_T0();TCCR0B=0x01;}idle=1;}
if(bit==3){OCR2A+=(12-H1);TCCR0A=0xc0;TCCR0B=0x80;st_T0();bit=0;idle=1;}
if(bit==6){OCR2A+=14;PCIFR=7;PCICR=2;PCMSK1=2;bit=0;idle=1;}*/
}

потребляемый ток 435мка.
это при том что bit=0;

вобщем понятно что что то не так. изменение потребления составило 20мкА от 1000мкА тоесть 3 структуры if исполнялись 2% времени. это 20000 тактов. код повторяется 128 раз в секунду. поэтому 3 структуры if исполняются получается ~ 156 тактов!?

что посоветуете ? может использовать структуру switch c breack, или дргой компилятор ? асемблер учить очень не хотелось бы... как минимум потому что нет времени на это.


--------------------
Самурай без меча - такой же, как самурай с мечом, только без меча
Go to the top of the page
 
+Quote Post
uriy
сообщение Nov 22 2008, 14:21
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Цитата
что посоветуете ?
Взять контроллер MSP430
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Nov 22 2008, 15:46
Сообщение #3


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



или xmega
Go to the top of the page
 
+Quote Post
Electronic)
сообщение Nov 22 2008, 16:03
Сообщение #4


Частый гость
**

Группа: Новичок
Сообщений: 97
Регистрация: 15-04-08
Пользователь №: 36 783



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


--------------------
Самурай без меча - такой же, как самурай с мечом, только без меча
Go to the top of the page
 
+Quote Post
Rst7
сообщение Nov 22 2008, 16:53
Сообщение #5


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
что посоветуете ?


Для начала взять IAR или Гнусь.

После чего уяснить, что
а) Не стоит вызывать в прерывании другие фунцкии (это я про st_T0(), лучше ее написать прямо по месту или заинлайнить);
б) Произвести выпрямление рук и мозгов в части понимания разницы между локальными и глобальными переменными (особенно, когда глобальные переменные еще и volatile), я про дикий набор "OCR2A+=..."

Рекомендую оформить код вот так
Код
#pragma interrupt_handler timer2_compa_isr:8
void timer2_compa_isr(void){
unsigned char ocr=OCR2A;

ocr+=16;idle=1;

if(bit==10){/*
if(bit==2){ocr+=H1;if(START==0){TCCR0A=0x42;st_T0();TCCR0B=0x01;}idle=1;}
if(bit==3){ocr+=(12-H1);TCCR0A=0xc0;TCCR0B=0x80;st_T0();bit=0;idle=1;}
if(bit==6){ocr+=14;PCIFR=7;PCICR=2;PCMSK1=2;bit=0;idle=1;}*/
}

OCR2A=ocr;
}



И на посошок - посматривайте в листинг, который генерит компилятор, будет сразу понятно, где самая большая дупа.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Electronic)
сообщение Nov 22 2008, 17:32
Сообщение #6


Частый гость
**

Группа: Новичок
Сообщений: 97
Регистрация: 15-04-08
Пользователь №: 36 783



большое спасибо , уже воплощаю.
IAR качается
изменения в программе будут только в названии прерываний , или проблем возникнуть может много?
листинги это расширение lst или lis ?

ещё хотел услышать switck с break будет быстрее работать чем if / else ?


--------------------
Самурай без меча - такой же, как самурай с мечом, только без меча
Go to the top of the page
 
+Quote Post
Electronic)
сообщение Nov 22 2008, 19:47
Сообщение #7


Частый гость
**

Группа: Новичок
Сообщений: 97
Регистрация: 15-04-08
Пользователь №: 36 783



IAR это тёмный лес ( . а там библиотека на подобие iom88v.h есть?


--------------------
Самурай без меча - такой же, как самурай с мечом, только без меча
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Nov 22 2008, 20:59
Сообщение #8


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(Electronic) @ Nov 22 2008, 16:30) *
Задача стоит в минимализации поребления AVR что бы устройство работало от батарейки годами. Столкнулся с такой проблемой:

для большей ясности использовал только режими idele в котором потребелние составило - 414мка (прерывания запрещены). при запушеной программе и без использования Idle потребление ~ 1000 мка.


вобщем понятно что что то не так.
что посоветуете ? может использовать структуру switch c breack, или дргой компилятор ? асемблер учить очень не хотелось бы... как минимум потому что нет времени на это.

Даже вникать в логику работы программы лениво. Что не так ? Если использовать именно idele - полмиллиампера она и должна жрать, согласно даташиту. Даже если загнать в idle с закрытыми прерываниями. Для "работы годами" от батарейки такое, IMHO, неприемлемо - батарейка потребуется здоровущая. Надо использовать power-save, при питании 3.6V и запущенном осцилляторе 32 kHz на втором таймере потребление где-то 2 uA. Сейчас у меня работает обработчик прерываний с частотой 32 Hz, сам обработчик занимает 1/32768 sec (меньше в асинхронном режиме таймера нельзя) - это прибавка 3 uA (RC, 7.3728 MHz). Вот это - "годами" (для того и предназначено).
Go to the top of the page
 
+Quote Post
Electronic)
сообщение Nov 22 2008, 23:22
Сообщение #9


Частый гость
**

Группа: Новичок
Сообщений: 97
Регистрация: 15-04-08
Пользователь №: 36 783



вы пропустили фразу "для ясности" ))


--------------------
Самурай без меча - такой же, как самурай с мечом, только без меча
Go to the top of the page
 
+Quote Post
Electronic)
сообщение Nov 23 2008, 22:19
Сообщение #10


Частый гость
**

Группа: Новичок
Сообщений: 97
Регистрация: 15-04-08
Пользователь №: 36 783



вот кажется немного конкретизировать могу . только немного изменилось потребление потому что не много не так вычеркнул другие пункты програмы. но суть таже.
bit=0 и не меняется нигде в программе
если так:
#pragma interrupt_handler timer2_compa_isr:8
void timer2_compa_isr(void){
unsigned char ocr=OCR2A;idle=1;

if(bit==2){/*ocr+=H1;if(START==0){TCCR0A=0x42;st_T0();TCCR0B=0x01;}*/}
if(bit==3){/*ocr+=(12-H1);TCCR0A=0xc0;TCCR0B=0x80;st_T0();bit=0;*/}
if(bit==6){/*ocr+=14;PCIFR=7;PCICR=2;PCMSK1=2;bit=0;*/}

OCR2A=ocr+16;}

потребление 495.

если так :
#pragma interrupt_handler timer2_compa_isr:8
void timer2_compa_isr(void){
unsigned char ocr=OCR2A;idle=1;

if(bit==2){ocr+=H1;if(START==0){TCCR0A=0x42;st_T0();TCCR0B=0x01;}}
if(bit==3){ocr+=(12-H1);TCCR0A=0xc0;TCCR0B=0x80;st_T0();bit=0;}
if(bit==6){ocr+=14;PCIFR=7;PCICR=2;PCMSK1=2;bit=0;}

потребление 520!

ну и ещё немного

if(bit==10){
if(bit==2){/*ocr+=H1;if(START==0){TCCR0A=0x42;st_T0();TCCR0B=0x01;}*/}
if(bit==3){/*ocr+=(12-H1);TCCR0A=0xc0;TCCR0B=0x80;st_T0();bit=0;*/}
if(bit==6){/*ocr+=14;PCIFR=7;PCICR=2;PCMSK1=2;bit=0;*/}
}
потребление 492!

и ещё одна непонятка
if(bit==10){
if(bit==2){ocr+=H1;if(START==0){TCCR0A=0x42;st_T0();TCCR0B=0x01;}}
if(bit==3){ocr+=(12-H1);TCCR0A=0xc0;TCCR0B=0x80;st_T0();bit=0;}
if(bit==6){ocr+=14;PCIFR=7;PCICR=2;PCMSK1=2;bit=0;}
}
тоже потребление меньше и = 518! даже не больше 520 как думается.

все токи перепроверял для всех 4-х вариантов. думал может плавают показания...

что скажите ? мне лично на голову не налазит как добавление ещё одной инструкции уменьшило ток и почему не исполняющие инструкции увеличивают ток когда открываю их!? bit обьявлена как unsigned char и нигде не изменяется в программе.

сейчас хочу перекочевать на IAR и тоже всё сравнить. но остановился на описании заголовков прерываний(


--------------------
Самурай без меча - такой же, как самурай с мечом, только без меча
Go to the top of the page
 
+Quote Post
Electronic)
сообщение Nov 24 2008, 00:37
Сообщение #11


Частый гость
**

Группа: Новичок
Сообщений: 97
Регистрация: 15-04-08
Пользователь №: 36 783



разобрался с IAR. ДА! ICC это гавно полное. я вобще замечал частенько что вроде не ракету сделал а уже avr тормозит . незнаю чем думают имейдж крайфтовци но наверное это лучше незнать.

потреблениес тало 491-2 в любом из 4-х случаев.
и код меньше эдак раза в два
да и переходить на него не тяжело хотя не и нехватает IAR генерилки простейших случаев.

вот та инфа что помогла мне
http://www.avr.nikolaew.org/iarcompiler.htm
http://avr.nikolaew.org/uroki.htm

и плюс поюзать немного iom88p.h и хелп с поиском по слову interrupt

БОЛЬШОЕ СПАСИБО RS7 и остальным участникам

ксатати может в IAR програматор есть? если да то что надо сделать что бы начать им пользоватся?


--------------------
Самурай без меча - такой же, как самурай с мечом, только без меча
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 07:39
Рейтинг@Mail.ru


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