CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: CodeVision AVR в вопросах и ответах

Сообщение isx »

А без инициализации он работать будет?
Сёдня на другом компе попробую.
А можете посоветовать какие нибудь нормальные библиотеки для работы с этим датчиком?
А вобще у людей эта библиотека нормально работает? И задержки большие во время измерений (у меня ато в это время индикатор тухнет на пол секунды, очень неудобно)?
Вчера в железе собрал, сёдня посмотрю как датчик вести себя будет, но индикатор тухнет на пол секунды во время измерений как и в протеусе (динамическая индикация на семисегмеетном индикаторе, поэтому работу его хорошо видно).
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: CodeVision AVR в вопросах и ответах

Сообщение oleg110592 »

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.
R_ura
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

Re: CodeVision AVR в вопросах и ответах

Сообщение R_ura »

Как отправить по юарту двубайтную переменную функцией putchar (); ?

int abc ;
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: CodeVision AVR в вопросах и ответах

Сообщение oleg110592 »

Код: Выделить всё

#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 в вопросах и ответах

Сообщение Аlex »

R_ura писал(а):Как отправить по юарту двубайтную переменную функцией putchar (); ?
Также, как и перенести 2 литра жидкости с помощью литровой банки :)
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: CodeVision AVR в вопросах и ответах

Сообщение isx »

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 в вопросах и ответах

Сообщение 0867532 »

Всем привет.
Как получить один конкретный бит из байта?
Допустим, есть число(чар) 0x00 мне нужно из него "вернуть" 3-й бит и положить в другое число(чар)на место 3-его бита конечно, или просто вывести в переменную(1/0).
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

С помощью битовых масок.
Аватара пользователя
0867532
Встал на лапы
Сообщения: 142
Зарегистрирован: Сб май 25, 2013 21:14:11
Откуда: Москва
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение 0867532 »

Я знаю как работают
&=0bxxxxxxxx единицы в нули
^=0bxxxxxxxx единицы в инвертирование
|=0bxxxxxxxx единицы в единицы
Но не знаю действия которое возвращало бы значение.
Если возникнут вопросы - посмотрите на мой аватар.
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Re: CodeVision AVR в вопросах и ответах

Сообщение Apparatchik »

0867532 писал(а):Я знаю как работают
&=0bxxxxxxxx единицы в нули
^=0bxxxxxxxx единицы в инвертирование
|=0bxxxxxxxx единицы в единицы
Но не знаю действия которое возвращало бы значение.

Ну не совсем так, как вы написали. Все-таки почитайте про это где-то, например здесь.
«И всё-таки она вертится!»
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

0867532 писал(а):Но не знаю действия которое возвращало бы значение.
Это действие называется - условие (if) :)
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

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 в вопросах и ответах

Сообщение oleg110592 »

в файле из 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)))
dimka86
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вт фев 21, 2012 15:05:12

Re: CodeVision AVR в вопросах и ответах

Сообщение dimka86 »

Уважаемые коты пожалуйста. Программа в основном цикле считывает температуру с датчиков по запросу a001e Usart отсылает некоторые данные по нему же, но при запросе адреса она отсылает данные и перестает считывать температуру.Может со стеком надо делать чего не понимаю.
Вложения
Голова комата.rar
(17.33 КБ) 183 скачивания
голова_примерно.rar
(114.58 КБ) 166 скачиваний
Аватара пользователя
0867532
Встал на лапы
Сообщения: 142
Зарегистрирован: Сб май 25, 2013 21:14:11
Откуда: Москва
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение 0867532 »

Apparatchik писал(а):здесь.

Спасибо за ссылку, нашел более оптимизированный и логичный способ добиться желаемого сдвигом битов.
Если возникнут вопросы - посмотрите на мой аватар.
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

Re: CodeVision AVR в вопросах и ответах

Сообщение pashaumnov »

подскажите пожалуйся про ацп на тини 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
*****************************************************/

#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 в вопросах и ответах

Сообщение Mechanicalhand »

Ув. коты подскажите пожалуйста как покрасивей запилить значение переменной unsigned long в массив unsigned char[10];
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

Mechanicalhand писал(а):как покрасивей запилить
Сделать код разноцветный ? :roll:
Аватара пользователя
Mechanicalhand
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вт дек 10, 2013 13:57:37

Re: CodeVision AVR в вопросах и ответах

Сообщение Mechanicalhand »

Аlex писал(а):
Mechanicalhand писал(а):как покрасивей запилить
Сделать код разноцветный ? :roll:

:shock:
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

Mechanicalhand писал(а): :shock:
Я предложил вариант, что не так ? :)
Где то, красивее чего нужно запилить ? И что означает "покрасивей" ?
Ответить

Вернуться в «AVR»