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

Обсуждаем контроллеры компании Atmel.
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

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

Сообщение a_skr »

unsigned char times;
times=printf("%d:%d:%d" ,hours, minutes, seconds);
Что возвращает printf? Правильно, кол-во выведенных символов. В ЕЕ попадет просто число (от 5 до 8, в зависимости от времени). Хотите в ЕЕ записать строку? Что-то вроде этого:

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

char str[9];
sprintf(str, "%02d:%02d:%02d", hr, min, sec);
for(i=0; i<8; i++) writeData(str[i]);
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

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

Сообщение kotriks »

a_skr писал(а):
unsigned char times;
times=printf("%d:%d:%d" ,hours, minutes, seconds);
Что возвращает printf? Правильно, кол-во выведенных символов. В ЕЕ попадет просто число (от 5 до 8, в зависимости от времени). Хотите в ЕЕ записать строку? Что-то вроде этого:

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

char str[9];
sprintf(str, "%02d:%02d:%02d", hr, min, sec);
for(i=0; i<8; i++) writeData(str[i]);

спасибо огромное!! так и думал надо str заюзать но чёто всё мимо бани ходил.
Alex тоже спасибо что откликнулись.
Mr.Ricko
Открыл глаза
Сообщения: 55
Зарегистрирован: Вт авг 24, 2010 16:10:00
Откуда: Москва)
Контактная информация:

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

Сообщение Mr.Ricko »

Помогите разобраться с проблемой, тк функция delay_us () не работает с перменными, я решил исправить ситуёвину циклом, прошил контроллер, но че-то ничего не работает....

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

#include <mega8.h>  //библиотека микрухи
#include <delay.h> //библиотека задержки
#include <io.h> //библиотека ввода/вывода
void main(void)
{
int x,u;
x=1;
u=10;
DDRC=0b00111100; //2,3,4,5 и  порты C сконфигурировавны на выход
DDRD=0b00000011; //1 и 2 порты D - выход

while (1)
{
while (u<100)
{
   PORTC.5=1; //включаем 5 ножку порта С
   for (x=1; x<=u; x++)
   {
   delay_us(5); // ждем 5 мкс   
   }
   x=1;
   PORTC.5=0; //выключаем 5 ножку
   delay_us(25); //ждем 5 мкс
   u=u+5; 
};
};
};

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

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

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

ничего не работает....
А что должно "работать" ?
Mr.Ricko
Открыл глаза
Сообщения: 55
Зарегистрирован: Вт авг 24, 2010 16:10:00
Откуда: Москва)
Контактная информация:

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

Сообщение Mr.Ricko »

на ногу повесил светодиод
Изображение
ну вот фото для наглядности...на видео нет смысла снимать тк яркость не меняется вообще
Последний раз редактировалось Аlex Пт ноя 22, 2013 21:40:35, всего редактировалось 1 раз.
Причина: -
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

А что Вы хотели увидеть на микросекундных задержках ? :roll:
Mr.Ricko
Открыл глаза
Сообщения: 55
Зарегистрирован: Вт авг 24, 2010 16:10:00
Откуда: Москва)
Контактная информация:

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

Сообщение Mr.Ricko »

как бэ программа написана так, чтобы с помощью этих задержек изменять яркость(жалкое подобие ШИМ), ну по крайней мере мне кажется что прога так написана, вопрос в том, что яркость не меняется, как и картина на осцике, значит программа выполняется не так как я хочу)
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Ну вот с этого и нужно было начинать свой пост, дабы избавить нас от гадания и доп. вопросов :)
У Вас переменная u доходит до 100 и программа тупо зацикливается без всяких действий.
Mr.Ricko
Открыл глаза
Сообщения: 55
Зарегистрирован: Вт авг 24, 2010 16:10:00
Откуда: Москва)
Контактная информация:

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

Сообщение Mr.Ricko »

типа того?

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

#include <mega8.h>  //библиотека микрухи
#include <delay.h> //библиотека задержки
#include <io.h> //библиотека ввода/вывода
void main(void)
{
int x,u;
x=1;
u=10;
DDRC=0b00111100; //2,3,4,5 и  порты C сконфигурировавны на выход
DDRD=0b00000011; //1 и 2 порты D - выход

while (1)
{
while (u<100)
{
   PORTC.5=1; //включаем 5 ножку порта С
   for (x=1; x<=u; x++)
   {
   delay_us(5); // ждем 5 мкс   
   }
   x=1;
   PORTC.5=0; //выключаем 5 ножку
   delay_us(25); //ждем 5 мкс
   u=u+5; 
};
u=10;
};
};
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Типа :)
А почему не сделать просто цикл от 10 до 100 с шагом 5 ? Зачем усложнять всякими while-ами и путать себя ?
Mr.Ricko
Открыл глаза
Сообщения: 55
Зарегистрирован: Вт авг 24, 2010 16:10:00
Откуда: Москва)
Контактная информация:

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

Сообщение Mr.Ricko »

поэтому и не сделал, с миллисекундами слишком заметно мерцание, на микросекундах же получается очень даже красиво.
Последний раз редактировалось Аlex Вс ноя 24, 2013 20:48:47, всего редактировалось 1 раз.
Причина: Не цитируйте полностью предыдущее сообщение !
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

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

Сообщение pashaumnov »

помогите пожалуйста с режимом сна в тини 13. не как не разберусь , что же надо делать. и даташит прочитал и кучу всяких примеров пересмотрел, но они как правило на асамблее, на си не видел да к тому же еще в cvavr. понял что нужно разрешить сон а что нужно писать не знаю.(( нужен сон глубокий (повер довн) на sm1 (1) sm0 (0), пробуждение от внешнего прерывания только мне надо не 0 будить а 1цей. алгоритм работы устройства такой
// смотрим состояние pinb.3 если 0 то не чего не делаем и уходим в сон
// если 1 то пробуждаемся и запускаем таеймер на 20 секунд. на portb.4 подаем 1
// если в течении 20 секунд на pinb.3 состояние не изменилось и там до сих пор 1 то накидываем еще 20 сек
// если изменилось то завершаем работу и уходим в сон.
ну не как не пойму что нужно писать что бы разрешить сон. вот моя программа с кусками из других примеров для сна но компилироватьт не хочет выдает ошубку в строке void main void((
Спойлер#include <tiny13.h>
#include <sleep.h>
unsigned int counter;
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)

{
if(++counter > 10) PORTB.4= 0; // если истекли 20 сек

}
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if(PINB.3)
{
sleep_disable();
}
else
{
sleep_enable();
}
// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=Out Func3=In Func2=Out Func1=Out Func0=Out
// State5=T State4=0 State3=T State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0x17;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 9,375 kHz
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x05;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x02;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;
DIDR0=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// Global enable interrupts
#asm("sei")
#asm("sleep")

while (1)
{
if(PINB.3) // если вход == 1
{
counter= 0; // сбрасываем счетчик
PORTB.4= 1; // устанавливаем порт в "1"
}
};


}
}
Amstron
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Вт дек 21, 2010 21:18:52

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

Сообщение Amstron »

У меня контроллер мега 168, работает на частоте 16 Мгц.
За одну секунду АЦП опрашивается примерно 1200 раз.
Проблема такая: не измеряется температура (датчик цифровой DS18b20) из за частого опрашивания АЦП.
Если закоментировать измерения АЦП, то температура измеряется.

Я думаю проблему можно решить так: запретить прерывания по окончанию преобразования АЦП. Как это сделать?

Второй вариант: не мерить АЦП в момент измерения температуры. Как это сделать?

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

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

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

Amstron, у Вас проблема с работой с DS18(B)20, а для этого есть отдельная тема, почитайте её и, если не найдёте ответа, задайте там.
CVAVR тут совсем не причём - тут обсуждается конкретный компилятор, и проблемы, связанные конкретно с ним.
К стати, это касается и остальных пользователей, особенно, оставивших 2 предыдущих перед Вами сообщения.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

pashaumnov писал(а):помогите пожалуйста с режимом сна в тини 13. не как не разберусь , что же надо делать. и даташит прочитал и кучу всяких примеров пересмотрел, но они как правило на асамблее, на си не видел да к тому же еще в cvavr. понял что нужно разрешить сон а что нужно писать не знаю.(( нужен сон глубокий (повер довн) на sm1 (1) sm0 (0), пробуждение от внешнего прерывания только мне надо не 0 будить а 1цей. алгоритм работы устройства такой
// смотрим состояние pinb.3 если 0 то не чего не делаем и уходим в сон
// если 1 то пробуждаемся и запускаем таеймер на 20 секунд. на portb.4 подаем 1
// если в течении 20 секунд на pinb.3 состояние не изменилось и там до сих пор 1 то накидываем еще 20 сек
// если изменилось то завершаем работу и уходим в сон.
ну не как не пойму что нужно писать что бы разрешить сон. вот моя программа с кусками из других примеров для сна но компилироватьт не хочет выдает ошубку в строке void main void((

Вот засунул в автоматический анализатор ошибок и получил ответ:

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

#include <tiny13.h>
#include <sleep.h>
unsigned int counter;
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
//Open TIM0_OVF
      if(++counter > 10) PORTB.4= 0; // если истекли 20 сек
}//Close TIM0_OVF

interrupt [EXT_INT0] void ext_int0_isr(void) 
{// Open EXT_INT0
      if(PINB.3) 
         
{//open if
         sleep_disable();
         }//close if
      else
         
{//oper else
         sleep_enable(); 
         
}//close else
//were the closing parenthesis '}' EXT_INT0 goes?
// Declare your global variables here         


PS И пользуйтесь отступами уровня, они иногда помогают найти такие ошибки :wink:

Amstron писал(а):За одну секунду АЦП опрашивается примерно 1200 раз.
А оно вам надо? Может проще запуск преобразования сделать после считывания с датчика?
И тем более еще неизвестно как вы там этот ацп опрашиваете :roll: если value=read_adc(x); То в топку ваш код вместе с программистом, который написал эту функцию :facepalm:
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

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

Сообщение pashaumnov »

vitalik_1984 писал(а):Вот засунул в автоматический анализатор ошибок и получил ответ:

а что за программка такая?? можно название , очень полезная штуковина.))
по поводу мк буду разбираться по строчно.
для того что бы разрешить sleep в тини 13 нужно в 5ом регистре MСUCR прописать 1 для режима (pwr down) в регистрах sm0 поставить 1 а в регистре sm1 поставить 0
вопрос как это оформить в MCUCR нужно добавить sm0 и sm1 тогда буде выглядеть так MCUCR=0x10 правильно???
или как то надо по другому
второе , прерывание сна будет происходить при подаче на INT0 логического ноля. а если мне нужно делать прерывание 1цей??? и возможно ли это ??
Bit 5 - SE: Sleep Enable - Разрешение режима Sleep
Установленный в 1 бит SE разрешает перевод MCU в режим sleep по команде SLEEP.ИЛИ ЖЕ ТАК НАДО ??? MCUCR=0x20
ИЛИ ТАК MCUCR|=(1<<5)
ИЛИ ТАК MCUCR |= (1<<SE)|(1<<SM1)|(0<<SM0);И можно мне подробную расшифровку последней строчки.??MCUCR потом идет побитовое или и сдвиг se без изменения остальных битов , так??
можно ли было это записать по другому MCUCR = (SE=1);(SM1=1);(SM0=0);
Amstron
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Вт дек 21, 2010 21:18:52

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

Сообщение Amstron »

Подскажите как настроить конфигурацию проекта, если использованно много глобальных переменных.
Вложения
для форума конфигурация компилятора.jpeg
(61.84 КБ) 394 скачивания
edds
Встал на лапы
Сообщения: 91
Зарегистрирован: Пт авг 28, 2009 16:08:48
Откуда: г.Вязьма Смоленская обл

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

Сообщение edds »

Может не в тему, или уже было это, вы меня извините, весь вечер еб..сь ....проект в CVAVR 2.05.0 отлаживаю AVR Studio 4.19 ... почему конструкции типа flag&=~(1<7); ,ADCSRA|=(1<6) ; не работают . Работают flag&=0b01111111;, ADCSRA|=0b01000000 ; ??? Работает PORTB|=1<num_digit ;.....
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

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

Сообщение pashaumnov »

edds писал(а): почему конструкции типа flag&=~(1<7); ,ADCSRA|=(1<6) ; не работают . Работают flag&=0b01111111;, ADCSRA|=0b01000000 ; ??? Работает PORTB|=1<num_digit ;.....

попробуйте так flag&=~(1<<7); ,ADCSRA|=(1<<6) ;
edds
Встал на лапы
Сообщения: 91
Зарегистрирован: Пт авг 28, 2009 16:08:48
Откуда: г.Вязьма Смоленская обл

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

Сообщение edds »

пол часа назад нашёл.... так и есть, как пишешь, теперь переменную не хочет увеличивать, flag...
while (( flag&0b00111111)<32) {

//// flag |=(1<<7);
flag |=0b10000000;
flag++;
// while (0!=( flag&(1<<7))) { };
while ( flag&&0b10000000) { };
}

в отладчике не работает и всё, переменная обьявлена как volatile char flag=0 ; ...
Ответить

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