А без инициализации он работать будет? Сёдня на другом компе попробую. А можете посоветовать какие нибудь нормальные библиотеки для работы с этим датчиком? А вобще у людей эта библиотека нормально работает? И задержки большие во время измерений (у меня ато в это время индикатор тухнет на пол секунды, очень неудобно)? Вчера в железе собрал, сёдня посмотрю как датчик вести себя будет, но индикатор тухнет на пол секунды во время измерений как и в протеусе (динамическая индикация на семисегмеетном индикаторе, поэтому работу его хорошо видно).
А вобще у людей эта библиотека нормально работает? И задержки большие во время измерений
там используется delay_ms, w1_write и пр. не терпящие прерываний:
Код:
floatds18b20_temperature(unsignedchar *addr) { unsignedchar resolution; if (ds18b20_read_spd(addr)==0) return-9999; resolution=(__ds18b20_scratch_pad.conf_register>>5) & 3; if (ds18b20_select(addr)==0) return-9999; w1_write(0x44); delay_ms(conv_delay[resolution]); if (ds18b20_read_spd(addr)==0) return-9999; w1_init(); return (*((int *) &__ds18b20_scratch_pad.temp_lsb) & ((int) bit_mask[resolution]))*0.0625; }
из хэлпа 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.
но индикатор тухнет на пол секунды во время измерений как и в протеусе (динамическая индикация на семисегмеетном индикаторе, поэтому работу его хорошо видно).
Проблема решена исправлением библиотеки. Нашел блок чтения температуры, убрал обращение к нему, и поставил этот код в свою программу:
Код выполняется раз в пол секунды (программный таймер так настроил). Датчик в системе один, иначе ругается на не найденную переменную addr. Я хотел её глобально объявить, но не смог найти, кто знает где она, скажите, вдруг понадобится несколько датчиков подключить. В протеусе работает, на железе гонял 30мин. Глюков не было.... Инициализация и прочие функции делаются через стандартную библиотеку...
Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт дек 19, 2013 20:37:24
Встал на лапы
Зарегистрирован: Сб май 25, 2013 21:14:11 Сообщений: 142 Откуда: Москва
Рейтинг сообщения:0
Всем привет. Как получить один конкретный бит из байта? Допустим, есть число(чар) 0x00 мне нужно из него "вернуть" 3-й бит и положить в другое число(чар)на место 3-его бита конечно, или просто вывести в переменную(1/0).
Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт дек 19, 2013 23:01:30
Встал на лапы
Зарегистрирован: Сб май 25, 2013 21:14:11 Сообщений: 142 Откуда: Москва
Рейтинг сообщения:0
Я знаю как работают &=0bxxxxxxxx единицы в нули ^=0bxxxxxxxx единицы в инвертирование |=0bxxxxxxxx единицы в единицы Но не знаю действия которое возвращало бы значение.
_________________ Если возникнут вопросы - посмотрите на мой аватар.
Я знаю как работают &=0bxxxxxxxx единицы в нули ^=0bxxxxxxxx единицы в инвертирование |=0bxxxxxxxx единицы в единицы Но не знаю действия которое возвращало бы значение.
Ну не совсем так, как вы написали. Все-таки почитайте про это где-то, например здесь.
Я знаю как работают &=0bxxxxxxxx единицы в нули ^=0bxxxxxxxx единицы в инвертирование |=0bxxxxxxxx единицы в единицы Но не знаю действия которое возвращало бы значение.
Или вы не совсем точно представляете себе как это работает, или второй вопрос куда нужно, чтобы этот бит возвращался? И вот правильнее &=~0bxxxxxxxx единицы в нули а &=0bxxxxxxxx нули в нули Эти самые операторы и вовращают некое значение, которое присваивается левому операнду. someNumber&=0bxxxxxxxx ; Аналогично более длинной форме записи someNumber= someNumber&0bxxxxxxxx ; В которой (someNumber&0bxxxxxxxx) это и есть функция, возврающая некое значение его мы и назначаем переменной someNumber
в файле из SPL для STM8 (stm8s.h) есть удобные макросы:
Код:
/*!< Signed integer types */ typedefsignedcharint8_t; typedefsignedshortint16_t; typedefsignedlongint32_t;
/*!< Unsigned integer types */ typedefunsignedcharuint8_t; typedefunsignedshortuint16_t; typedefunsignedlonguint32_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) )
Уважаемые коты пожалуйста. Программа в основном цикле считывает температуру с датчиков по запросу 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???
Сейчас этот форум просматривают: Google [Bot] и гости: 290
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения