Модераторы: PILOT, ManiaK, Mazzi

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Таймер-счётчик на WinAVR под Mega48 
:(
    Опции темы
kaspersky89
Дата 11.1.2008, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 7.12.2007

Репутация: 1
Всего: 1



  Как и обещал выкладываю исходник который делал сегодня ночью на скорую руку, нервно выкуривая сигарету за сигаретой когда какойнить алгоритим не хотел правильно работать. 
  Комментарии не поставил, нет времени распыляться на это, кому надо поймут что за код, хотя надо постараться чтоб проследить логику работы нек-х функций smile 

   Просьба к гуру в программинге МК, как мне оптимизировать код чтоб он правильней выглядел и чётче работал, а то компиленый файл чёто большой получается. Критикуйте если есть желание и время. 
   Мне кажется главный косяк в коде, так это таймер, я сделал его без делителя, и программной задержкой выставлял время ровно на 1 секунду. Мне кажется таймер этот всю программу будет тормозить.

  На данном этапе покачто алгоритм, будет шлифоваться.

  Следующий этап эволюции это надо приладить к схеме термодатчик, необходимо учитывать температуру двигателя, чтобы когда движок холодный то ЭПХХ работал в режиме прогрева, с открытым клапаном Холостого Хода, 
  Есть мысль взять термод-к в виде транзистора цифровой вроде как из серии DS18(точно не помню) както его прекрепить к двиглу и по I2c вести контроль температуры.

  Как кто думает, стоит ли брать, и морочиться с этим DS ? 

   Просто я чего помощи в оптимизации кода прошу, потому как проект будет разростаться, может даже на диплом пойдёт smile , так вот, боюсь наделать на начальном этапе ошибок что потом код вообще работать не будет, нужен так сказать костяк, простой, и по умному сделаный код первого варианта, от которого буду плясать так сказать, дальше smile 


Код


#include <avr/io.h>  
#include <avr/interrupt.h> 
#include <avr/delay.h> 
#include <stdlib.h>
#include <avr/signal.h>
#include <avr/wdt.h>
#include <math.h>
#include <inttypes.h>
#include<avr/sleep.h>

#define XX PD1

void IO_init(void); 
void interrupt_init(void);
void timer0_init(void);
void Knopka_XX(void);

unsigned int  timer0; 
unsigned int  presc;
unsigned long  rot;
unsigned char block;


unsigned char key (unsigned char s)
{ if (bit_is_clear(PIND,s))
  {  _delay_loop_2(12500);
     if (bit_is_clear(PIND,s))
     { return (0);
     }
  }
  return (1);
}

ISR(INT0_vect) 

rot++;


int main(void) 
{    
 rot=0;
  block=0;
   presc=3900;
  
   IO_init();       
    interrupt_init(); 
     timer0_init(); 
      sei(); 
   
  while(1) { 
                
    if ((key(XX)) == 0 ) {
          
          block=1;
          PORTD |= _BV(PD0);
          PORTD |= _BV(PD7);
          
       }else if ((key(XX)) == 1){
       
       _delay_loop_2(62500);
    
          block=0;
      }
    }
  return(0);    



ISR(TIMER0_OVF_vect)     //Прерывание происходящие с интервалом в 1секунду

    if (++timer0 == presc)
    {     
           timer0=0;
           if (rot>=17)
           { 
              if (block==0){
               PORTD &= ~_BV(PD0);   
               PORTD &= ~_BV(PD7); 
                            }
               
           }else{ 
 
              PORTD |= _BV(PD0);
               PORTD |= _BV(PD7);
                }  
        rot=0;
    }
     
}

void IO_init(void)    //Настройка портов контроллера

   DDRD=0b11111001;  //Выводы порта  D  1-2 входы остальные выходы  
   DDRB=0xFF;         //Все выводы порта  В  выходы 
   DDRC=0xFF;         //Все выводы порта  С  выходы 


void interrupt_init(void) //Настройка регистров разрешающих прерывание от входных импульсов
{    
   EICRA=0b00000010; 
   EIMSK=0b00000001;   
   SREG=0b10000000;   


void timer0_init(void) 

         timer0 = 0; 
         TCCR0B |= _BV(CS00); 
         TCNT0 = 0; 
         TIMSK0 |= _BV(TOIE0); 




PM MAIL   Вверх
cardinal
Дата 12.1.2008, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 8
Всего: 99



1.
Если после if только одна строка, то скобки { и } не нужны
Код

if (bit_is_clear(PIND,s))
     { return (0);
     }

=>
Код

if (bit_is_clear(PIND,s))
    return (0);

2.
Код

return (0);

=>
Код

return 0;

3.
Код

DDRD=0b11111001;  //Выводы порта  D  1-2 входы остальные выходы 

=>
Код

DDRD=0xF9;  //Выводы порта  D  1-2 входы остальные выходы

4. _BV это что?
5. bit_is_clear никто так не проверяет!


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
kaspersky89
Дата 12.1.2008, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 7.12.2007

Репутация: 1
Всего: 1



Цитата

4. _BV это что?


cardinal Я думал ты пошутил с этим вопросом, _BV 

Немного лекции
 AVR GCC сдвиг можно осуществлять и с помощью функции _BV(), что даже предпочтительней, так как в этом случае компилятор сам выполняет поразрядный сдвиг и вставляет результат в компилируемый код. Это обеспечивает отсутствие затрат времени во время непосредственного выполнения кода в микроконтроллере.

В случае использования функции _BV() две предыдущие команды будут выглядеть следующим образом.

PORTD |= _BV(PD3);      // установить "1" на линии 3 порта D

PORTD &= ~_BV(PD4);      // установить "0" на линии 4 порта D


Цитата

5. bit_is_clear никто так не проверяет! 


 Наверно это старый дедовский сполсоб, Но он работает, покажи мне как сделать иначе, обязательно учту

P.S. Я поставил на WinAVR патч, поэтому могу использовать некоторые старые команды

Добавлено через 7 минут и 52 секунды
Cardinal

Может заменить так

Статый вариант
if (bit_is_clear(PIND,3)) 
{
...



На новую версию
if (!(PIND & (1<<PIND3)))
{
...

PM MAIL   Вверх
cardinal
Дата 12.1.2008, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 8
Всего: 99



Цитата(kaspersky89 @  11.1.2008,  23:30 Найти цитируемый пост)
Может заменить так

Статый вариант
if (bit_is_clear(PIND,3)) 
{
...



На новую версию
if (!(PIND & (1<<PIND3)))
{
...
}  

Без восклицательного знака!
Код

if((PIND & (1 <<  PD3))


Насчет _BV не знал на самом деле. Почитал тут
http://www.myrobot.ru/stepbystep/pr_mcports.php
буду пользоваться  smile 


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
kaspersky89
Дата 12.1.2008, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 7.12.2007

Репутация: 1
Всего: 1



Так как насчёт DS18 ?  Адекватно ли будет прицепить его на движок копейки?

PM MAIL   Вверх
cardinal
Дата 12.1.2008, 05:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 8
Всего: 99



Ну если его темп. характеристики говорят что можно (я не смотрел), то какие сомнения?


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Den64
Дата 12.1.2008, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 6.4.2006
Где: Курск

Репутация: 1
Всего: 2




  Датчик темпиратуры класный. Самое главное точно измеряет +-0.5.  Стоит использовать! Измеряет от -55 до +125.

--------------------
Инагда пишу звуками.
PM WWW ICQ   Вверх
kaspersky89
Дата 12.1.2008, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 7.12.2007

Репутация: 1
Всего: 1



Спасиб, убедили насчёт DS  smile .  

   Теперь надо подучить протокол I2c . Адресация устройств, временные интервалы протокола, какие команды слать, и какие принимать. 

Думаю сложного особо ничего не будет smile 

Просто как и всегда пугает неизвестность и мнимая сложность изучения нового устройства smile 

Ну ладно, Думаю следующее моё сообщение на этой ветке будет с новой схемой, и прошивкой. А то окончательно загажу форум спамом smile  smile 
PM MAIL   Вверх
makwen
Дата 12.1.2008, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 9.11.2005
Где: Киев

Репутация: 1
Всего: 1



Цитата(kaspersky89 @ 12.1.2008,  10:58)
Спасиб, убедили насчёт DS  smile .  

   Теперь надо подучить протокол I2c . Адресация устройств, временные интервалы протокола, какие команды слать, и какие принимать. 

Думаю сложного особо ничего не будет smile 

Просто как и всегда пугает неизвестность и мнимая сложность изучения нового устройства smile 

Ну ладно, Думаю следующее моё сообщение на этой ветке будет с новой схемой, и прошивкой. А то окончательно загажу форум спамом smile  smile

а чего I2C?! Если ты будешь использовать датчик температуры DS1820, то у него интерфейс 1WIRE. 
ЗЫ: С работай этого датчика проблем не возникалоsmile
PM MAIL   Вверх
kaspersky89
Дата 12.1.2008, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 7.12.2007

Репутация: 1
Всего: 1



makwen

Цитата

а чего I2C?! Если ты будешь использовать датчик температуры DS1820, то у него интерфейс 1WIRE. 
ЗЫ: С работай этого датчика проблем не возникало 


Извиняюсь не знал.  

Тут функция из одного кода, как раз считает температуру по 1WIRE. 
  Так что разобраться с датчиком не сможет только ленивый или в доску пьяный программёр smile 

Код

void izmerenie_t(void)
{

if ( !count_com_1w ){//сброс
    count_com_1w++;
    detectPresence();//если датчик присутствует
    }
    else
    if ( count_com_1w==1 ){
        count_com_1w++;
        writebyte(0xCC);//SKIP ROM [CCh]
        writebyte(0xB4);//READ POWER SUPPLY [B4h]
        power_suplly_1w=readbit();//если низкий уровень то паразитное питание
        power_suplly_1w=~power_suplly_1w;//где был низкий вкл высокий, паразитное питание
        power_suplly_1w &= out_1wire;//pwire0|pwire1;
        }
    else
    if ( count_com_1w==2 ){    //старт преобразования
        count_com_1w++;
        detectPresence();//сброс
        }
    else
    if ( count_com_1w==3 ){
        count_com_1w++;
        writebyte(0xCC);//SKIP ROM [CCh]
        writebyte(0x44);//CONVERT T [44h]
        pullup_on();
        time[wire1]=125;//1sek
        }
    else
    if ( count_com_1w==4 ){
        if (time[wire1]<-10) count_com_1w++;
        }
    else
    if ( count_com_1w==5 ){//чтение темпиратуры
        count_com_1w++;
        detectPresence();//сброс
        }
    else
    if ( count_com_1w==6 ){
        count_com_1w++;
        writebyte(0xCC);//SKIP ROM [CCh]
        writebyte(0xBE);//READ SCRATCHPAD [BEh]
        }
    else
    if ( count_com_1w==7 ){
        count_com_1w=0;

        readbyte(&tempir_lsb[0]);//LSB  читаем темпиратуру
        readbyte(&tempir_msb[0]);//MSB  читаем темпиратуру
        
        //for(i=0; i<kolvo_datchikov; i++){
        //    format_t(i);
        //    }
        format_t(0);
        format_t(1);
        }
}

PM MAIL   Вверх
makwen
Дата 12.1.2008, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 9.11.2005
Где: Киев

Репутация: 1
Всего: 1



Цитата(kaspersky89 @  12.1.2008,  19:15 Найти цитируемый пост)
Тут функция из одного кода, как раз считает температуру по 1WIRE.   Так что разобраться с датчиком не сможет только ленивый или в доску пьяный программёр 


прикрепил файлик с библиотекой под DS1820, которую сам писал 2 года назад.  Может чем-то поможетsmile
Только нумжно временные интервалы соблюдать. 

Это сообщение отредактировал(а) makwen - 12.1.2008, 19:47

Присоединённый файл ( Кол-во скачиваний: 23 )
Присоединённый файл  DS1820.rar 1,33 Kb
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.1164 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.