CodeVision AVR в вопросах и ответах
Re: CodeVision AVR в вопросах и ответах
А без инициализации он работать будет?
Сёдня на другом компе попробую.
А можете посоветовать какие нибудь нормальные библиотеки для работы с этим датчиком?
А вобще у людей эта библиотека нормально работает? И задержки большие во время измерений (у меня ато в это время индикатор тухнет на пол секунды, очень неудобно)?
Вчера в железе собрал, сёдня посмотрю как датчик вести себя будет, но индикатор тухнет на пол секунды во время измерений как и в протеусе (динамическая индикация на семисегмеетном индикаторе, поэтому работу его хорошо видно).
Сёдня на другом компе попробую.
А можете посоветовать какие нибудь нормальные библиотеки для работы с этим датчиком?
А вобще у людей эта библиотека нормально работает? И задержки большие во время измерений (у меня ато в это время индикатор тухнет на пол секунды, очень неудобно)?
Вчера в железе собрал, сёдня посмотрю как датчик вести себя будет, но индикатор тухнет на пол секунды во время измерений как и в протеусе (динамическая индикация на семисегмеетном индикаторе, поэтому работу его хорошо видно).
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: CodeVision AVR в вопросах и ответах
isx писал(а):А без инициализации он работать будет?
пробовал в протеусе проект с LCD индикатором (без прерываний) - правильно работало
А можете посоветовать какие нибудь нормальные библиотеки для работы с этим датчиком?
этого сейчас полно в интернете, имхо лучше переделать под себя примеры, которые на сайте производителя - понятнее будет
http://www.maximintegrated.com/app-note ... mvp/id/162
А вобще у людей эта библиотека нормально работает? И задержки большие во время измерений
там используется delay_ms, w1_write и пр. не терпящие прерываний:
Код: Выделить всё
float ds18b20_temperature(unsigned char *addr)
{
unsigned char 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.
Re: CodeVision AVR в вопросах и ответах
Как отправить по юарту двубайтную переменную функцией putchar (); ?
int abc ;
int abc ;
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: CodeVision AVR в вопросах и ответах
Код: Выделить всё
#define Hi(Int) (char) (Int>>8)
#define Low(Int) (char) (Int)
int abc ;
putchar ( Hi(abc) );
putchar ( Low(abc) );- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Также, как и перенести 2 литра жидкости с помощью литровой банкиR_ura писал(а):Как отправить по юарту двубайтную переменную функцией putchar (); ?
Re: CodeVision AVR в вопросах и ответах
isx писал(а):но индикатор тухнет на пол секунды во время измерений как и в протеусе (динамическая индикация на семисегмеетном индикаторе, поэтому работу его хорошо видно).
Проблема решена исправлением библиотеки.
Нашел блок чтения температуры, убрал обращение к нему, и поставил этот код в свою программу:
Код: Выделить всё
if (ontemp == 0) {
ontemp = 1;
if (ds18b20_read_spd(0)==0) {temper = -9999; goto endoff;}
if (ds18b20_select(0)==0) {temper = -9999; goto endoff;}
w1_write(0x44);
} else {
ontemp = 0;
if (ds18b20_read_spd(0)==0) {temper = -9999; goto endoff;}
temper = (*((int *) &__ds18b20_scratch_pad.temp_lsb) & ((int) bit_mask[resolution]))*0.0625;Код выполняется раз в пол секунды (программный таймер так настроил). Датчик в системе один, иначе ругается на не найденную переменную addr. Я хотел её глобально объявить, но не смог найти, кто знает где она, скажите, вдруг понадобится несколько датчиков подключить.
В протеусе работает, на железе гонял 30мин. Глюков не было....
Инициализация и прочие функции делаются через стандартную библиотеку...
- 0867532
- Встал на лапы
- Сообщения: 142
- Зарегистрирован: Сб май 25, 2013 21:14:11
- Откуда: Москва
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Всем привет.
Как получить один конкретный бит из байта?
Допустим, есть число(чар) 0x00 мне нужно из него "вернуть" 3-й бит и положить в другое число(чар)на место 3-его бита конечно, или просто вывести в переменную(1/0).
Как получить один конкретный бит из байта?
Допустим, есть число(чар) 0x00 мне нужно из него "вернуть" 3-й бит и положить в другое число(чар)на место 3-его бита конечно, или просто вывести в переменную(1/0).
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
С помощью битовых масок.
- 0867532
- Встал на лапы
- Сообщения: 142
- Зарегистрирован: Сб май 25, 2013 21:14:11
- Откуда: Москва
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Я знаю как работают
&=0bxxxxxxxx единицы в нули
^=0bxxxxxxxx единицы в инвертирование
|=0bxxxxxxxx единицы в единицы
Но не знаю действия которое возвращало бы значение.
&=0bxxxxxxxx единицы в нули
^=0bxxxxxxxx единицы в инвертирование
|=0bxxxxxxxx единицы в единицы
Но не знаю действия которое возвращало бы значение.
Если возникнут вопросы - посмотрите на мой аватар.
- Apparatchik
- Держит паяльник хвостом
- Сообщения: 908
- Зарегистрирован: Вс май 23, 2010 13:55:42
- Откуда: Украина, Александрия
Re: CodeVision AVR в вопросах и ответах
0867532 писал(а):Я знаю как работают
&=0bxxxxxxxx единицы в нули
^=0bxxxxxxxx единицы в инвертирование
|=0bxxxxxxxx единицы в единицы
Но не знаю действия которое возвращало бы значение.
Ну не совсем так, как вы написали. Все-таки почитайте про это где-то, например здесь.
«И всё-таки она вертится!»
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Это действие называется - условие (if)0867532 писал(а):Но не знаю действия которое возвращало бы значение.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
0867532 писал(а):Я знаю как работают
&=0bxxxxxxxx единицы в нули
^=0bxxxxxxxx единицы в инвертирование
|=0bxxxxxxxx единицы в единицы
Но не знаю действия которое возвращало бы значение.
Или вы не совсем точно представляете себе как это работает, или второй вопрос куда нужно, чтобы этот бит возвращался?
И вот правильнее
&=~0bxxxxxxxx единицы в нули
а &=0bxxxxxxxx нули в нули
Эти самые операторы и вовращают некое значение, которое присваивается левому операнду.
someNumber&=0bxxxxxxxx ;
Аналогично более длинной форме записи
someNumber= someNumber&0bxxxxxxxx ;
В которой (someNumber&0bxxxxxxxx) это и есть функция, возврающая некое значение его мы и назначаем переменной someNumber
Можно назначить тот же бит переменной так:
Код: Выделить всё
temp=someNumber&0b0000 0001;
NumberForCopy&=~0b0000 0001;
NumberForCopy |= temp; По варианту Алекса:
Код: Выделить всё
if(!(someNumber&0b0000 0001)){
NumberForCopy&=~0b0000 0001;}
else {NumberForCopy |= temp;} Как то так или что то около того...
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: CodeVision AVR в вопросах и ответах
в файле из SPL для STM8 (stm8s.h) есть удобные макросы:
Код: Выделить всё
/*!< 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)))Re: CodeVision AVR в вопросах и ответах
Уважаемые коты пожалуйста. Программа в основном цикле считывает температуру с датчиков по запросу a001e Usart отсылает некоторые данные по нему же, но при запросе адреса она отсылает данные и перестает считывать температуру.Может со стеком надо делать чего не понимаю.
- Вложения
-
- Голова комата.rar
- (17.33 КБ) 183 скачивания
-
- голова_примерно.rar
- (114.58 КБ) 166 скачиваний
- 0867532
- Встал на лапы
- Сообщения: 142
- Зарегистрирован: Сб май 25, 2013 21:14:11
- Откуда: Москва
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Apparatchik писал(а):здесь.
Спасибо за ссылку, нашел более оптимизированный и логичный способ добиться желаемого сдвигом битов.
Если возникнут вопросы - посмотрите на мой аватар.
- pashaumnov
- Прорезались зубы
- Сообщения: 236
- Зарегистрирован: Чт июн 25, 2009 16:00:25
- Откуда: нижний новгород
Re: CodeVision AVR в вопросах и ответах
подскажите пожалуйся про ацп на тини 13
задача сделать программу для измерения разряда литиевого аккумулятора и отображать состояние 4мя светодиодами.
верхний прог заряжен это 4в
нижний порог разряжен это 2.5в разница между ними составляет 1.5в
что бы мне расчитать показания с которыми буду сравнивать показания ацп мне нужно 1024/4(количество уровней отображения)????
сли да то получается шаг в 0,255, 510, 1020.
в кавре с помощью визарда сгенерировал начальный код , кое что дописал из инета но вцелом нефига не работает(((
вот мой код
AVR Core Clock frequency: 9,600000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 16
*****************************************************/
#include <tiny13.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x00
// 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
void main(void)
{
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
PORTB=0x00;
DDRB=0x2F; //PINB4 (ADC2) на вход с делителя.
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
GIMSK=0x00;
MCUCR=0x00;
ACSR=0x80;
ADCSRB=0x00;
DIDR0=0x00;
// 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???
задача сделать программу для измерения разряда литиевого аккумулятора и отображать состояние 4мя светодиодами.
верхний прог заряжен это 4в
нижний порог разряжен это 2.5в разница между ними составляет 1.5в
что бы мне расчитать показания с которыми буду сравнивать показания ацп мне нужно 1024/4(количество уровней отображения)????
сли да то получается шаг в 0,255, 510, 1020.
в кавре с помощью визарда сгенерировал начальный код , кое что дописал из инета но вцелом нефига не работает(((
вот мой код
Спойлер
Chip type : ATtiny13AVR Core Clock frequency: 9,600000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 16
*****************************************************/
#include <tiny13.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x00
// 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
void main(void)
{
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
PORTB=0x00;
DDRB=0x2F; //PINB4 (ADC2) на вход с делителя.
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
GIMSK=0x00;
MCUCR=0x00;
ACSR=0x80;
ADCSRB=0x00;
DIDR0=0x00;
// 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???
- Mechanicalhand
- Первый раз сказал Мяу!
- Сообщения: 25
- Зарегистрирован: Вт дек 10, 2013 13:57:37
Re: CodeVision AVR в вопросах и ответах
Ув. коты подскажите пожалуйста как покрасивей запилить значение переменной unsigned long в массив unsigned char[10];
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Сделать код разноцветный ?Mechanicalhand писал(а):как покрасивей запилить
- Mechanicalhand
- Первый раз сказал Мяу!
- Сообщения: 25
- Зарегистрирован: Вт дек 10, 2013 13:57:37
Re: CodeVision AVR в вопросах и ответах
Аlex писал(а):Сделать код разноцветный ?Mechanicalhand писал(а):как покрасивей запилить
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Я предложил вариант, что не так ?Mechanicalhand писал(а):
Где то, красивее чего нужно запилить ? И что означает "покрасивей" ?