Serg24 0 22 ноября, 2008 Опубликовано 22 ноября, 2008 · Жалоба Здравствуйте форумчане. Задача стоит в минимализации поребления 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, или дргой компилятор ? асемблер учить очень не хотелось бы... как минимум потому что нет времени на это. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 4 22 ноября, 2008 Опубликовано 22 ноября, 2008 · Жалоба что посоветуете ?Взять контроллер MSP430 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VCucumber 0 22 ноября, 2008 Опубликовано 22 ноября, 2008 · Жалоба или xmega Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serg24 0 22 ноября, 2008 Опубликовано 22 ноября, 2008 · Жалоба в данном случае проблема в качестве компиляции, 88p тоже очень экономный в тех режимах что мне нужы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 22 ноября, 2008 Опубликовано 22 ноября, 2008 · Жалоба что посоветуете ? Для начала взять 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; } И на посошок - посматривайте в листинг, который генерит компилятор, будет сразу понятно, где самая большая дупа. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serg24 0 22 ноября, 2008 Опубликовано 22 ноября, 2008 · Жалоба большое спасибо , уже воплощаю. IAR качается изменения в программе будут только в названии прерываний , или проблем возникнуть может много? листинги это расширение lst или lis ? ещё хотел услышать switck с break будет быстрее работать чем if / else ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serg24 0 22 ноября, 2008 Опубликовано 22 ноября, 2008 · Жалоба IAR это тёмный лес ( . а там библиотека на подобие iom88v.h есть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rx3apf 0 22 ноября, 2008 Опубликовано 22 ноября, 2008 · Жалоба Задача стоит в минимализации поребления 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). Вот это - "годами" (для того и предназначено). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serg24 0 22 ноября, 2008 Опубликовано 22 ноября, 2008 · Жалоба вы пропустили фразу "для ясности" )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serg24 0 23 ноября, 2008 Опубликовано 23 ноября, 2008 · Жалоба вот кажется немного конкретизировать могу . только немного изменилось потребление потому что не много не так вычеркнул другие пункты програмы. но суть таже. 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 и тоже всё сравнить. но остановился на описании заголовков прерываний( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serg24 0 24 ноября, 2008 Опубликовано 24 ноября, 2008 · Жалоба разобрался с 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 програматор есть? если да то что надо сделать что бы начать им пользоватся? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться