Приветствую Вас, Гость! Регистрация RSS

Вторник, 22.08.2017
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 6 из 9«12456789»
Форум » Форум mega-avr.ucoz.ru » Вопросы начинающих » первые вопросы (кто собрал программатор, вставил мк- а он не работает)
первые вопросы
ilvzДата: Понедельник, 10.01.2011, 22:46 | Сообщение # 101
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Форматный вывод очень популярен. И с "С" куда только не пошел.

Добавлено (10.01.2011, 22:46)
---------------------------------------------
М ещё, имей в виду, что у нас (в CV) он сильно почикан. Не всё будет работать.

 
DenisДата: Понедельник, 10.01.2011, 23:28 | Сообщение # 102
Любопытный
Сообщений: 116
Репутация: 1
Город: Москва
Статус: Отсутствует
ilvz,
В смысле почикано?
 
ilvzДата: Вторник, 11.01.2011, 00:24 | Сообщение # 103
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
В смысле урезано. Т.е. не весь стандарт реализован.
 
DenisДата: Вторник, 11.01.2011, 03:10 | Сообщение # 104
Любопытный
Сообщений: 116
Репутация: 1
Город: Москва
Статус: Отсутствует
У меня новая неясность.
У меня стоит два датчика температуры, и они когда считывают параметры в переменную немного притормаживают весь процесс программы.
Особенно это видно на часах в раздели секунды, секунды скачат через одну, а то и через две.
Мне кажется что это связанно с временем преобразования!
У меня разрядность термометра стоит на 12 бит, их как я и говорил 2, время преобразования одного равняется 750 мс, а двух 1500 мс.
Как с этим можно бороться не меняя битность термометра?

Добавлено (11.01.2011, 03:10)
---------------------------------------------
Может попробовать так:

Code
if(i==1){
temperature_one=ds18b20_temperature( &RomCode[0][0] );
i=2;
}  
if(i==2){
temperature_one=ds18b20_temperature( &RomCode[1][0] );
i=1;
}

По идеи этот алгоритм экономит время преобразования в два раза, получается что за один цикл делается одно преобразование.
Есть более перспективные варианты?

 
ilvzДата: Вторник, 11.01.2011, 13:07 | Сообщение # 105
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
А как и ты считаешь и выводишь время? Если работаешь с прерыванием, то можно засинхронизировать измерение температуры. Типа: напечатал время -> запустил измерение. Оно в одну сек. должно уложиться.
О глобальном. Так кроме измерения температуры врядли получится еще что нибудь делать smile
1) температура с мнерционного 1820 не нужна чаще 1раза в минуту. А то и реже.
2) ждать почти 1 сек тоже непозволительная роскошь. Можно замер разделить на 2-е части.
И поменять их местами. Т.е.
берём результаты ->
запускаем новый отсчёт ->
печатаем ->
делаем кучу дел и снова берём ...
Так при хорошем раскладе вообще ждать не придётся.

Ну и последнее. Точность 18в20 не более 0.5С. Надо ли устанавливать большую дискретность.

 
DenisДата: Вторник, 11.01.2011, 13:45 | Сообщение # 106
Любопытный
Сообщений: 116
Репутация: 1
Город: Москва
Статус: Отсутствует
ilvz,
Привет! Вот код который считывает и выводит дату, время, температуру.

Code
while (1)
    {
  // Конструкция If сдесь сделана для того что-бы опрашивать только один датчик за один цикл, это сокращает время в двое!   
     if(flag==1){   
   temperature_one=ds18b20_temperature( &RomCode[0][0] );  // Считываем Температуру для Дома
   flag=2;   
   }    
   if(flag==2){   
   temperature_two=ds18b20_temperature( &RomCode[1][0] );  // Считываем Температуру для Улици
   flag=1;   
   }

      
    rtc_get_time(&hour,&min,&sek); //считать время
    rtc_get_date(&day,&month,&year); //считать дату
      
    sprintf(date_st, "%02d.%02d.%02d",day, month, year); // Форматирование Даты
    sprintf(time_st, "%02d:%02d:%02d",hour, min, sek);  // Форматирование Времени
    sprintf(temperature_st, "%.1f",temperature_one); // Форматирование Температуры Дома
    sprintf(temperature_street_st, "%.1f",temperature_two); // Форматирование Температуры На улице
    display_puts( date_st,12,1,0 );  // Вывод Даты
    display_puts( time_st,12,2,0 );  // Вывод Времени
    display_puts( temperature_st,12,3,0 );  // Вывод Температуры Дома
    display_puts( temperature_street_st,12,4,0 );  // Вывод Температуры Дома
         
        }
     }

Из разряда бреда! Может под измерительные дела поставить отдельный МК?

Сообщение отредактировал Denis - Вторник, 11.01.2011, 13:46
 
ilvzДата: Вторник, 11.01.2011, 14:26 | Сообщение # 107
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
1) у 1307 есть ножка куда можно вывести секундный сигнал. Этот сигнал можно подать на прерывание. И тогда можно делать опрос 1раз в сек.
2) У тебя считывание температуру всё равно в куче, а это более 1.5 сек. Опрашивай датчики по очереди. Один раз в сек. один датчик. Второй ра второй. У них инерционность почти минута. А то и более. Нет никакого смысла так часто опрашивать.
Напр:
Если секунда чётная (sec % 1 ==0) первый нечётная второй.
Вариантов опроса масса.
Можно отслеживать переход секунд. Без прерываний.
Напр:
Прочитал значение и сравнил спредыдущим. Если они равны, то это таже секунда. Если нет, началась новая.
Запомнил это чтение для последующего сравнения.

Главное не читать более одного датчика в секунду. Потому, что это занимает более0.8 сек.

 
DenisДата: Вторник, 11.01.2011, 15:01 | Сообщение # 108
Любопытный
Сообщений: 116
Репутация: 1
Город: Москва
Статус: Отсутствует
ilvz,
Если я тебя правильно понял, мне нужно сделать внешние прерывание от DS1307 с ножки SQW/OUT.
Затем опрос датчиков поместить в прерывание с условием поочерёдного вопроса.
Правильно?
Если у меня уже заняты входа прерывания (INT0, INT1), что мне сделать? Освободить их?
Как настроить внешние прерывание, где можно прочитать?

Добавлено (11.01.2011, 15:01)
---------------------------------------------
С проблеммой завода сигнала внешнего прерывания решён на atmega16 есть ещё и INT2, который у меня свободен.

 
ilvzДата: Вторник, 11.01.2011, 15:24 | Сообщение # 109
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Про SQW/OUT правильно. Прерывания настраиваются в генераторе кода. А чем у тебя заняты прерывания?
Как внешнее прерывание можно настроить ещё и вход первого таймера ICP_1. Но это не фэншуй.
Самое главное (для тебя) засинхронизировать переход секунд и опрос датчиков температуры. Датчики (поштучно!) надо опрашивать сразу за переходом на след. секунду. Тогда он не будет влиять на индикацию секунд. Опрос поместится в секунду.

Добавлено (11.01.2011, 15:09)
---------------------------------------------
Я описал НЕСКОЛЬКО способов. Можно и без прерываний.

Добавлено (11.01.2011, 15:13)
---------------------------------------------
AHTUNG!!!
Не надо помещать опрос датчика в прерывание!!! И ВООБЩЕ ПОЧТИ НИЧЕГО В ПРЕРЫВАНИЕ НЕ ПОМЕЩАЙ!
В прерывании можно изменить какую нибудь переменную. Признак того, что оно произошло. А в цикле (основном) следишь уже за этим признаком. Реагируешь и стираешь его.

Добавлено (11.01.2011, 15:14)
---------------------------------------------
Стираешь - это обнуляешь признак.

Добавлено (11.01.2011, 15:17)
---------------------------------------------
Обнулять лучше сразу, а потом реагировать. Это чтобы не пропустить след. прерывание. Это ГЛОБАЛЬНОЕ ПРАВИЛО. Отступать от него можно только если чётко понимаешь, что делаешь.

Добавлено (11.01.2011, 15:24)
---------------------------------------------
И ещё. Время можно считать по секундным прерываниям внутри контроллера. Сэкономишь (время) на чтении ДС-ки. А ДС-ку читать только при старте конроллера и при рестарте (сбой напр. какойнибудь).

 
DenisДата: Вторник, 11.01.2011, 15:34 | Сообщение # 110
Любопытный
Сообщений: 116
Репутация: 1
Город: Москва
Статус: Отсутствует
SQW/OUT можно настроить на следующие частоты 1 Гц, 4.096 кГц, 8.192 кГц, 32.768 кГц. Следовательно мне нужно выбрать 1Гц?
Настройка прерывания INT2 предполагает настройку модов, у меня их два. Первый Rising (Наростание), а второй Falling (Падение).
Мне нужно выбрать мод Rising?

 
ilvzДата: Вторник, 11.01.2011, 15:41 | Сообщение # 111
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Любой. Ведь и спад и нарастание происходит ровно (вот в этом не уверен) один раз в сек.

Добавлено (11.01.2011, 15:41)
---------------------------------------------
Про не уверен. С большой долей вероятности часы врут. И если хочется точного времени, то их надо будет подстраивать или подстроить кварц (это сложнее)

 
DenisДата: Вторник, 11.01.2011, 16:21 | Сообщение # 112
Любопытный
Сообщений: 116
Репутация: 1
Город: Москва
Статус: Отсутствует
Генератор кода настроил прерывания следующим образом:

Code
GICR|=0x20;
MCUCR=0x00;
MCUCSR=0x40;
GIFR=0x20;

Только я не как не могу понять что это за регистры!

 
ilvzДата: Вторник, 11.01.2011, 16:34 | Сообщение # 113
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Это регистры управления прерываниями. Установлено INT2 по фронту. (Глубже не буду. Об этом лучше читать.)
А обработчик? Поставил?
В ообработчике будешь изменять переменную (СЕМАФОР). Там же можно и время считать.
Кстати хорошее упражнение. (секунды-минуты-часы)
А в цикле ждать её изменения проверяя на не 0. Дождасля и сбросил опять в 0. Сделал всё, что надо, и снова ждёшь.
 
DenisДата: Вторник, 11.01.2011, 17:03 | Сообщение # 114
Любопытный
Сообщений: 116
Репутация: 1
Город: Москва
Статус: Отсутствует
ilvz,
Вначале выполняем

Code
i=1;
interrupt [EXT_INT2] void ext_int2_isr(void)
{
i++;
if(i==60){i=1;}
}

потом:

Code
while (1)
   {
   
    if(i%1==0){  
  temperature_one=ds18b20_temperature( &RomCode[0][0] );  // Считываем Температуру для Дома
  }else{  
  temperature_two=ds18b20_temperature( &RomCode[1][0] );  // Считываем Температуру для Улици
   }

Правильная мысль?

 
ilvzДата: Вторник, 11.01.2011, 17:29 | Сообщение # 115
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Не совсем.

Code

interrupt [EXT_INT2] void ext_int2_isr(void)     
     {     
       INT2_SEMAPHORE=1;
     }

Code

INT2_SEMAPHORE=0; // Это ПЕРЕМЕННАЯ

i=0;
while (1)
   {

    if(INT2_SEMAPHORE)
      {
       INT2_SEMAPHORE=0;
       if(i)
         {
           temperature_one=ds18b20_temperature( &RomCode[0][0] );
           i = 0;
         }
       else
         {
           temperature_two=ds18b20_temperature( &RomCode[1][0] );
           i = 1;
         };
     };
};

Где то так

---------------------------------------------

Сообщение отредактировал ilvz - Вторник, 11.01.2011, 17:36
 
DenisДата: Вторник, 11.01.2011, 18:58 | Сообщение # 116
Любопытный
Сообщений: 116
Репутация: 1
Город: Москва
Статус: Отсутствует
ilvz,
Что-то не контачит!

Добавлено (11.01.2011, 18:58)
---------------------------------------------
Либо DS1307 не выдаёт сигнал, либо что-то с настройками прерывания!
DS1307 настроен так: rtc_init(0,1,0);
Первый параметр 0, он задаёт чистоту сигнала. 0 это значит 1 ГЦ
Второй параметр 1, о означает что выход импульса разрешён, 0-запретить, 1- разрешить
Третий параметр определяет логический уровень в не активном состоянии.

Сообщение отредактировал Denis - Вторник, 11.01.2011, 18:37
 
ilvzДата: Вторник, 11.01.2011, 19:02 | Сообщение # 117
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Не контачит? Это как?
Надо определиться с терминологоей.
Не компилируется - это одно.
Виснет или даёт неправильные результаты это другое. Причём тоже разное.
По проге. Естественно я её не проверял. Просто отразил суть.
Напиши, что именно не идёт. Разберёмся smile

Добавлено (11.01.2011, 19:00)
---------------------------------------------
А прерывания в программе разрешены?

Добавлено (11.01.2011, 19:02)
---------------------------------------------
DS-ку нав. можно даже тестером глянуть. Частота ведь не велика.

 
DenisДата: Вторник, 11.01.2011, 19:02 | Сообщение # 118
Любопытный
Сообщений: 116
Репутация: 1
Город: Москва
Статус: Отсутствует
Глупый вопрос, как включить прерывание?
 
ilvzДата: Вторник, 11.01.2011, 19:09 | Сообщение # 119
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
#asm("sei")

Генератор должен был сгенерить эту команду сам.

Добавлено (11.01.2011, 19:09)
---------------------------------------------
Генератор нач. кода

 
DenisДата: Вторник, 11.01.2011, 19:22 | Сообщение # 120
Любопытный
Сообщений: 116
Репутация: 1
Город: Москва
Статус: Отсутствует
разрешения прерывания не помогло.

Добавлено (11.01.2011, 19:22)
---------------------------------------------
Путём небольших манипуляций выяснил что по какой-то причине не выходит сигнал с DS1307

 
Форум » Форум mega-avr.ucoz.ru » Вопросы начинающих » первые вопросы (кто собрал программатор, вставил мк- а он не работает)
Страница 6 из 9«12456789»
Поиск: