Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.03.2017, 10:06   #11
sunjob
Member
 
Регистрация: 16.11.2013
Сообщений: 32
Вес репутации: 0
sunjob is an unknown quantity at this point
По умолчанию Re: Ускоряем работу Arduino

шо же мы делаем? :о)

Развернуть для просмотра

Код:
#define A0_Read (AnRead(B01000000))
#define A1_Read (AnRead(B01000001))
#define A2_Read (AnRead(B01000010))
#define A3_Read (AnRead(B01000011))
#define A4_Read (AnRead(B01000100))
#define A5_Read (AnRead(B01000101))
#define A6_Read (AnRead(B01000110))
#define A7_Read (AnRead(B01000111))	

uint16_t AnRead(uint8_t An_pin)
{
ADMUX = An_pin;
...
}
[свернуть]


мать моя женчина!!!
принудительное выставление Aref/ИОН-а на DEFAULT
я чуть не рехнулся, когда до этого дорыл, не мог понять, что у меня за капец ... ну да ладно...

нельзя же так делать!!! ...не, конечно, ни кто нам не запретит..., ну давайте минимизировать хотя бы предполагаемые разрушения от возможного ядерного взрыва, а?!

p.s.
для себя рихтанул "примерно так" (при быстром "набеге" на тесте и текущем проекте - работает), ну а далее смотрим сами ...
все имхо, удачных гонок!

Развернуть для просмотра

Код:
// 
// CyberLib.h
//

uint16_t AnRead(uint8_t pin);

#define A0_Read (AnRead(B000))
#define A1_Read (AnRead(B001))
#define A2_Read (AnRead(B010))
#define A3_Read (AnRead(B011))
#define A4_Read (AnRead(B100))
#define A5_Read (AnRead(B101))
#define A6_Read (AnRead(B110))
#define A7_Read (AnRead(B111))	

#define ADC_AREF_EXTERNAL   0
#define ADC_AREF_DEFAULT    1
#define ADC_AREF_INTERNAL   3

#define ADC_K_2   B001 // 8   MHz
#define ADC_K_4   B010 // 4   MHz
#define ADC_K_8   B011 // 2   MHz
#define ADC_K_16  B100 // 1   MHz 
#define ADC_K_32  B101 // 500 kHz
#define ADC_K_64  B110 // 250 kHz
#define ADC_K_128 B111 // 125 kHz

struct {
uint8_t ref = ADC_AREF_DEFAULT; 
uint8_t k   = ADC_K_128; 
} adc;

void adc_set_ref(uint8_t ref);
void adc_set_k  (uint8_t k  );

//
// CyberLib.cpp
//

////////////////////////////////////////////////////////////////////////////////
uint16_t AnRead(uint8_t pin)
////////////////////////////////////////////////////////////////////////////////
{
uint16_t adch; 

ADMUX = (adc.ref << REFS0) | (pin);
delay_us(10);	  

//
// старшие два бита ADEN & ADSC
// младшие три бита - это как раз и есть предделитель 
//
ADCSRA = (1<<ADEN | 1<<ADSC | adc.k);

while (ADCSRA & (1 << ADSC));

pin  = ADCL;
adch = ADCH; 

return (adch<<8) + pin;
}
////////////////////////////////////////////////////////////////////////////////
void adc_set_ref(uint8_t ref)
////////////////////////////////////////////////////////////////////////////////
{
adc.ref = ref;
ADMUX   = (ADMUX & (B00<<REFS0)) | (adc.ref << REFS0);
}
////////////////////////////////////////////////////////////////////////////////
void adc_set_k(uint8_t k)
////////////////////////////////////////////////////////////////////////////////
{
adc.k  = k;
ADCSRA = (ADCSRA & B000) | adc.k;	
}
////////////////////////////////////////////////////////////////////////////////
[свернуть]

Последний раз редактировалось sunjob; 21.03.2017 в 15:03.
sunjob вне форума   Ответить с цитированием
 


Здесь присутствуют: 30 (пользователей: 0 , гостей: 30)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 02:53. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика