А без инициализации он работать будет?
Сёдня на другом компе попробую.
А можете посоветовать какие нибудь нормальные библиотеки для работы с этим датчиком?
А вобще у людей эта библиотека нормально работает? И задержки большие во время измерений (у меня ато в это время индикатор тухнет на пол секунды, очень неудобно)?
Вчера в железе собрал, сёдня посмотрю как датчик вести себя будет, но индикатор тухнет на пол секунды во время измерений как и в протеусе (динамическая индикация на семисегмеетном индикаторе, поэтому работу его хорошо видно).
из хэлпа delay_ms: Before calling the functions the interrupts must be disabled, otherwise the delays will be much longer then expected.
из хэлпа w1_write: Because the 1 Wire Functions require precision time delays for correct operation, the interrupts must be disabled during their execution.
isx писал(а):но индикатор тухнет на пол секунды во время измерений как и в протеусе (динамическая индикация на семисегмеетном индикаторе, поэтому работу его хорошо видно).
Проблема решена исправлением библиотеки.
Нашел блок чтения температуры, убрал обращение к нему, и поставил этот код в свою программу:
Код выполняется раз в пол секунды (программный таймер так настроил). Датчик в системе один, иначе ругается на не найденную переменную addr. Я хотел её глобально объявить, но не смог найти, кто знает где она, скажите, вдруг понадобится несколько датчиков подключить.
В протеусе работает, на железе гонял 30мин. Глюков не было....
Инициализация и прочие функции делаются через стандартную библиотеку...
Всем привет.
Как получить один конкретный бит из байта?
Допустим, есть число(чар) 0x00 мне нужно из него "вернуть" 3-й бит и положить в другое число(чар)на место 3-его бита конечно, или просто вывести в переменную(1/0).
Я знаю как работают
&=0bxxxxxxxx единицы в нули
^=0bxxxxxxxx единицы в инвертирование
|=0bxxxxxxxx единицы в единицы
Но не знаю действия которое возвращало бы значение.
Если возникнут вопросы - посмотрите на мой аватар.
0867532 писал(а):Я знаю как работают
&=0bxxxxxxxx единицы в нули
^=0bxxxxxxxx единицы в инвертирование
|=0bxxxxxxxx единицы в единицы
Но не знаю действия которое возвращало бы значение.
Ну не совсем так, как вы написали. Все-таки почитайте про это где-то, например здесь.
0867532 писал(а):Я знаю как работают
&=0bxxxxxxxx единицы в нули
^=0bxxxxxxxx единицы в инвертирование
|=0bxxxxxxxx единицы в единицы
Но не знаю действия которое возвращало бы значение.
Или вы не совсем точно представляете себе как это работает, или второй вопрос куда нужно, чтобы этот бит возвращался?
И вот правильнее
&=~0bxxxxxxxx единицы в нули
а &=0bxxxxxxxx нули в нули
Эти самые операторы и вовращают некое значение, которое присваивается левому операнду.
someNumber&=0bxxxxxxxx ;
Аналогично более длинной форме записи
someNumber= someNumber&0bxxxxxxxx ;
В которой (someNumber&0bxxxxxxxx) это и есть функция, возврающая некое значение его мы и назначаем переменной someNumber
/*!< Signed integer types */
typedef signed char int8_t;
typedef signed short int16_t;
typedef signed long int32_t;
/*!< Unsigned integer types */
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned long uint32_t;
/*============ Handling bits ==================*/
/*-----------------------------------------------------------------------------
Method : I
Description : Handle the bit from the character variables.
Comments : The different parameters of commands are
- VAR : Name of the character variable where the bit is located.
- Place : Bit position in the variable (7 6 5 4 3 2 1 0)
- Value : Can be 0 (reset bit) or not 0 (set bit)
The "MskBit" command allows to select some bits in a source
variables and copy it in a destination var (return the value).
The "ValBit" command returns the value of a bit in a char
variable: the bit is reset if it returns 0 else the bit is set.
This method generates not an optimised code yet.
-----------------------------------------------------------------------------*/
#define SetBit(VAR,Place) ( (VAR) |= (uint8_t)((uint8_t)1<<(uint8_t)(Place)) )
#define ClrBit(VAR,Place) ( (VAR) &= (uint8_t)((uint8_t)((uint8_t)1<<(uint8_t)(Place))^(uint8_t)255) )
#define ChgBit(VAR,Place) ( (VAR) ^= (uint8_t)((uint8_t)1<<(uint8_t)(Place)) )
#define AffBit(VAR,Place,Value) ((Value) ? \
((VAR) |= ((uint8_t)1<<(Place))) : \
((VAR) &= (((uint8_t)1<<(Place))^(uint8_t)255)))
#define MskBit(Dest,Msk,Src) ( (Dest) = ((Msk) & (Src)) | ((~(Msk)) & (Dest)) )
#define ValBit(VAR,Place) ((uint8_t)(VAR) & (uint8_t)((uint8_t)1<<(uint8_t)(Place)))
Уважаемые коты пожалуйста. Программа в основном цикле считывает температуру с датчиков по запросу a001e Usart отсылает некоторые данные по нему же, но при запросе адреса она отсылает данные и перестает считывать температуру.Может со стеком надо делать чего не понимаю.
подскажите пожалуйся про ацп на тини 13
задача сделать программу для измерения разряда литиевого аккумулятора и отображать состояние 4мя светодиодами.
верхний прог заряжен это 4в
нижний порог разряжен это 2.5в разница между ними составляет 1.5в
что бы мне расчитать показания с которыми буду сравнивать показания ацп мне нужно 1024/4(количество уровней отображения)????
сли да то получается шаг в 0,255, 510, 1020.
в кавре с помощью визарда сгенерировал начальный код , кое что дописал из инета но вцелом нефига не работает(((
вот мой код
СпойлерChip type : ATtiny13
AVR Core Clock frequency: 9,600000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 16
*****************************************************/
// Read the AD conversion result
void ADC_init() // инициализация портов
{
ADMUX=0x10; //отключен внутренний ион, вход адц pinb.4
ADCSRA=0xE6; //БИТ7 АЦП включен.бит6 начать преобразование. бит5 непрерывное преобразование.бит4 установится когда будет завершено ацп.
// бит3 запрещены прерывания от ацп. бит 2-0 делитель на 64.
}
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
unsigned int resultat;
// Declare your global variables here
// ADC initialization
// ADC Clock frequency: 150,000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: ADC Stopped
// Digital input buffers on ADC0: Off, ADC1: Off, ADC2: On, ADC3: Off
DIDR0&=0x03;
DIDR0|=0x2C;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x86;
while (1)
{
ADC_init();
resultat=read_adc(0);
if(resultat> 100)
{PORTB.0=1;}
}
}
еще вопрос про внутренний ион у тини он 1.1, мне нужно его подключать или нет ???
и по поводу делителя сколько мне можно подать на ацп??что бы безболезненно для мк. а то возможно можно и без него прямо напрямую с аккумулятора подавать напряжение??
по поводу кода скажите я правильно понял что ADCW записывается в read_adc(0) ???
вот кое что тут вычитал, если включать ион внутренний то при 4в на выходе делителя должно быть 1.1в и это будет 1024???