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

Вторник, 22.08.2017
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 8 из 9«126789»
Форум » Форум mega-avr.ucoz.ru » Вопросы начинающих » первые вопросы (кто собрал программатор, вставил мк- а он не работает)
первые вопросы
ilvzДата: Четверг, 13.01.2011, 16:00 | Сообщение # 141
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Таймер тебе ещё пригодится. Для чего нибудь другого.
 
DenisДата: Четверг, 13.01.2011, 17:10 | Сообщение # 142
Любопытный
Сообщений: 116
Репутация: 1
Город: Москва
Статус: Отсутствует
Вот что у меня получилось с датой и временем:

Code

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;
     }
    }
     
//--------------------Конец Функции считывания температуры-------------------------------
//--------------------Начало функции считывание с DS1307---------------------------------

   if(sek_mk==0 && min_mk==0 && hour_mk==0){
   rtc_get_date(&day_ds,&month_ds,&year_ds); //Считывания Даты
   day_mk = day_ds;
   month_mk = month_ds;
   year_mk = year_ds;
   sprintf(date_st, "%02d.%02d.%02d",day_mk, month_mk, year_mk); // Форматирование Даты
   display_puts( date_st,12,1,0 );  // Вывод Даты
}
//--------------------Конец функции считывание с DS1307----------------------------------    
//--------------------Начало функции счёта времени---------------------------------------  
          
   if(sek_mk==60)
   {
   min_mk++;
   sek_mk=0;
   }
   if(min_mk==60)
   {
   hour_mk++;
   min_mk=0;
   }
   if (hour_mk==24)
   {
   hour_mk=0;
   min_mk=0;
   sek_mk=0;
   }
//--------------------Конец функции счёта времени---------------------------------------
//--------------------Начало функции формотирования данных в строку---------------------  

   sprintf(time_st, "%02d:%02d:%02d",hour_mk, min_mk, sek_mk);  // Форматирование Времени
   sprintf(temperature_st, "%.1f",temperature_one); // Форматирование Температуры Дома
   sprintf(temperature_street_st, "%.1f",temperature_two); // Форматирование Температуры На улице
    
//--------------------Конец функции формотирования данных в строку---------------------  
//--------------------Начало функции вывода динамической части-------------------------

   display_puts( time_st,12,2,0 );  // Вывод Времени
   display_puts( temperature_st,12,3,0 );  // Вывод Температуры Дома
   display_puts( temperature_street_st,12,4,0 );  // Вывод Температуры Улице
    
//--------------------Конец функции вывода динамической части--------------------------
         }
 
ilvzДата: Четверг, 13.01.2011, 17:47 | Сообщение # 143
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Да.

Добавлено (13.01.2011, 17:39)
---------------------------------------------
Глянул. Правда не очень внимательно. Ньюансы за тобой.
Есть несколько моментов
Так работать вроде не должно sad или я чего не понял.
Бесконечный цикл поставь вокруг всёй этой программы, а не только вокруг температуры.
И... если семафор не 0 то обнуляешь его. (всё последующее в этом же иф-е)
Меряешь температуру.
Считаешь время.
Выводишь на дисплей.
Идёшь в начало цикла ждать семафор.
Так всё это будет работать 1 раз в сек.

Да ещё. Не надо обнулять мин. и сек. в конце дня. Они и так равны нулю. Лишнее.

Добавлено (13.01.2011, 17:42)
---------------------------------------------
Перед цикло поставь чтение из ДС-ки. Или редактирование значений в ней, если нужно.

Добавлено (13.01.2011, 17:46)
---------------------------------------------
И ещё замеченный момент. Если в контроллере решено, что уже завтра, то это не значит, что и в ДС-ке оно наступило. Тут нужно подумать. О синхронизации. А то на сутки может остаться вчера.

Добавлено (13.01.2011, 17:47)
---------------------------------------------
Хотя если тики идут от ДС-ки, то я нав. не прав.

Сообщение отредактировал ilvz - Четверг, 13.01.2011, 17:40
 
DenisДата: Четверг, 13.01.2011, 19:26 | Сообщение # 144
Любопытный
Сообщений: 116
Репутация: 1
Город: Москва
Статус: Отсутствует
Quote
Бесконечный цикл поставь вокруг всёй этой программы, а не только вокруг температуры.

Он и так стоит вокруг всей программы!

Вот так предлагаешь?

Code

   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;
      }
//--------------------Конец Функции считывания температуры-------------------------------
//--------------------Начало функции считывание с DS1307---------------------------------

    if(sek_mk==0 && min_mk==0 && hour_mk==0){
    rtc_get_date(&day_ds,&month_ds,&year_ds); //Считывания Даты
    day_mk = day_ds;
    month_mk = month_ds;
    year_mk = year_ds;
    sprintf(date_st, "%02d.%02d.%02d",day_mk, month_mk, year_mk); // Форматирование Даты
    display_puts( date_st,12,1,0 );  // Вывод Даты
}
//--------------------Конец функции считывание с DS1307----------------------------------
//--------------------Начало функции формотирования данных в строку---------------------   

    sprintf(time_st, "%02d:%02d:%02d",hour_mk, min_mk, sek_mk);  // Форматирование Времени
    sprintf(temperature_st, "%.1f",temperature_one); // Форматирование Температуры Дома
    sprintf(temperature_street_st, "%.1f",temperature_two); // Форматирование Температуры На улице
      
//--------------------Конец функции формотирования данных в строку---------------------   
//--------------------Начало функции вывода динамической части-------------------------

    display_puts( time_st,12,2,0 );  // Вывод Времени
    display_puts( temperature_st,12,3,0 );  // Вывод Температуры Дома
    display_puts( temperature_street_st,12,4,0 );  // Вывод Температуры Улице
      
//--------------------Конец функции вывода динамической части--------------------------   

     }
       

//--------------------Начало функции счёта времени---------------------------------------   
            
    if(sek_mk==60)
    {
    min_mk++;
    sek_mk=0;
    }
    if(min_mk==60)
    {
    hour_mk++;
    min_mk=0;
    }
    if (hour_mk==24)
    {
    hour_mk=0;

    }
//--------------------Конец функции счёта времени---------------------------------------

          }

Quote

И ещё замеченный момент. Если в контроллере решено, что уже завтра, то это не значит, что и в ДС-ке оно наступило. Тут нужно подумать. О синхронизации. А то на сутки может остаться вчера.

если контроллер решил что завтра, то он синхронизируется!
Quote

Хотя если тики идут от ДС-ки, то я нав. не прав.

Тики идут от DS


Сообщение отредактировал Denis - Четверг, 13.01.2011, 19:28
 
ilvzДата: Четверг, 13.01.2011, 22:06 | Сообщение # 145
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Буду позже

Добавлено (13.01.2011, 22:06)
---------------------------------------------
В фигурных скобка оч. тяжело разобраться. Я если что то такое срисовываю, то сразу переделываю.
Сам же придерживаюсь другого формата.
Надеюсь всё вутри первого ИФ-а? Если так, то всё, на беглый взгляд, нормально.

 
DenisДата: Четверг, 13.01.2011, 22:45 | Сообщение # 146
Любопытный
Сообщений: 116
Репутация: 1
Город: Москва
Статус: Отсутствует
Всё кроме:
Code
if(sek_mk==60)  
     {  
     min_mk++;  
     sek_mk=0;  
     }  
     if(min_mk==60)  
     {  
     hour_mk++;  
     min_mk=0;  
     }  
     if (hour_mk==24)  
     {  
     hour_mk=0;  

     }
 
ilvzДата: Пятница, 14.01.2011, 00:43 | Сообщение # 147
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
А смысл вынесения этого кусочка за ИФ?. Во всём должен быть смысл.
Форматировать, по мне, лучше так:
Code

if(sek_mk == 60)    
       {    
         min_mk++;    
         sek_mk = 0;    
       }    
if(min_mk == 60)    
       {    
         hour_mk++;    
         min_mk = 0;    
       }    
if (hour_mk == 24)    
       {    
         hour_mk = 0;    
       }

Добавлено (14.01.2011, 00:43)
---------------------------------------------
А ещё если писать сравнения задом наперёд

Code

  if(60 == min_mk)

То можно избежать очень распространённой ошибки.


Сообщение отредактировал ilvz - Пятница, 14.01.2011, 00:40
 
DenisДата: Пятница, 14.01.2011, 22:25 | Сообщение # 148
Любопытный
Сообщений: 116
Репутация: 1
Город: Москва
Статус: Отсутствует
ilvz,
Привет!
Quote
То можно избежать очень распространённой ошибки

Какой распространнённой ошибки? Расскажи по подробней!

Добавлено (14.01.2011, 22:25)
---------------------------------------------
Так с DS1307 разобрались!
Теперь осталось разобраться с DS18B20!
Ты выше уже писал что надо переделать, но я до конца не понял!)))

 
ilvzДата: Суббота, 15.01.2011, 00:59 | Сообщение # 149
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Про ошибку.

Code
if(0=temp)

не откомпилируется, а

Code
if(temp=0)

запросто. А ведь хотелось

Code
if(temp==0)
 
DenisДата: Суббота, 15.01.2011, 01:12 | Сообщение # 150
Любопытный
Сообщений: 116
Репутация: 1
Город: Москва
Статус: Отсутствует
ilvz,
Мысаль уловил! Теперь так всегда буду делать)))
Может для DS18B20 попробовать свою библиотеку написать? Хотя наврятли у меня это получится!
 
ilvzДата: Суббота, 15.01.2011, 01:47 | Сообщение # 151
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Запросто smile Открой блокнотом 1820.lib в одноимённом (.lib)каталоге CVAVR, и поразбирайся. Я вообще своё писал. Есть библиотека под 1wire. Все необходимые комманды там есть.

Добавлено (15.01.2011, 01:44)
---------------------------------------------
У меня было где то так:

Code

             w1_init();      // общий сброс
             w1_write(0xcc); // пропуск ПЗУ
             w1_write(0xbe); // команда чтения             
             termo.in_byte[0]=w1_read();
             termo.in_byte[1]=w1_read();

.
.
.
            //------- следующий расчёт
             w1_init();      // общий сброс
             w1_write(0xcc); // пропуск ПЗУ
             w1_write(0x44); // запуск счета

Добавлено (15.01.2011, 01:46)
---------------------------------------------
После запуска счёта делаешь, что хочешь не менее 600мс по моему.
И снова возвращаешься к чтению.

Добавлено (15.01.2011, 01:47)
---------------------------------------------
ВЫшеприведённый код под один датчик.

Сообщение отредактировал ilvz - Суббота, 15.01.2011, 01:48
 
DenisДата: Суббота, 15.01.2011, 15:47 | Сообщение # 152
Любопытный
Сообщений: 116
Репутация: 1
Город: Москва
Статус: Отсутствует
ilvz,
Спасибо буду пробовать!

Подскажите что обозначает эта строка?

Code


struct __ds1820_scratch_pad_struct __ds1820_scratch_pad;
 
ilvzДата: Суббота, 15.01.2011, 19:24 | Сообщение # 153
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Составные данные
Code

extern struct __ds18b20_scratch_pad_struct
         {
         unsigned char temp_lsb,temp_msb;
         signed char   temp_high,temp_low;
         unsigned char conf_register,
                       res1,
                       res2,
                       res3,
                       crc;
         } __ds18b20_scratch_pad;

под общим именем.
См. тип данных структура

Сообщение отредактировал ilvz - Суббота, 15.01.2011, 19:26
 
DenisДата: Воскресенье, 16.01.2011, 16:36 | Сообщение # 154
Любопытный
Сообщений: 116
Репутация: 1
Город: Москва
Статус: Отсутствует
ilvz,
Спасибо понял!
Начал потихоньку разбираться с DS18B20

Добавлено (16.01.2011, 16:36)
---------------------------------------------
Нашёл ошибку!
Не правильно:

Code
if(0==sek_mk && 0==min_mk && 0==hour_mk)

Правильно:
Code
if(0<=sek_mk && 0==min_mk && 0==hour_mk)
 
ilvzДата: Воскресенье, 16.01.2011, 17:42 | Сообщение # 155
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Так всю первую минуту сравнение будет давать истину.
 
DenisДата: Воскресенье, 16.01.2011, 18:32 | Сообщение # 156
Любопытный
Сообщений: 116
Репутация: 1
Город: Москва
Статус: Отсутствует
ilvz,
Почему?
у нас же условие && а не or!?
 
ilvzДата: Воскресенье, 16.01.2011, 22:16 | Сообщение # 157
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Потому что 0<=sek_mk продолжается всегда, кроме начала минуты. 00сек. А всё остальное выполняется в течении 1-вой минуты суток. Вот и получается 59сек.
 
DenisДата: Понедельник, 17.01.2011, 00:45 | Сообщение # 158
Любопытный
Сообщений: 116
Репутация: 1
Город: Москва
Статус: Отсутствует
ilvz,
Да, но истина только одно условие из трёх!?


Сообщение отредактировал Denis - Понедельник, 17.01.2011, 00:46
 
ilvzДата: Понедельник, 17.01.2011, 01:35 | Сообщение # 159
Любопытный
Сообщений: 143
Репутация: 2
Город: Almaty
Статус: Отсутствует
Проглядел. Пардон! Соответственно всё,что писал выше, неправильно.

Только для сек. сравнение будет срабатывать тоже при 0, т.к. они не бывают отрицательными. Сек. не может быть меньше 0.

 
us4ilqДата: Вторник, 18.01.2011, 14:17 | Сообщение # 160
Опытный
Сообщений: 173
Репутация: 2
Город: Донецк
Статус: Отсутствует
Отправил "Скифу" даташит на Мега 128 на русском языке, в формате ПДФ.
Тоже самое что было у меня , только не мое, нашел в инете.
Так что скоро появится здесь на сайте.
 
Форум » Форум mega-avr.ucoz.ru » Вопросы начинающих » первые вопросы (кто собрал программатор, вставил мк- а он не работает)
Страница 8 из 9«126789»
Поиск: