CodeVision AVR в вопросах и ответах
Re: CodeVision AVR в вопросах и ответах
Одновременно почти всегда 2 шим-а. При этом один сигнал по скважности инверирован относительно второго (если на одном 20% то на другом 80 % и т.д.)
Re: CodeVision AVR в вопросах и ответах
на atmega8 3 таймера:
8-бит таймер0: можно сделать несколько программных ШИМ в обработчике переполнения;
16-бит таймер1: два независимых аппаратных ШИМ по сравнению;
8-бит таймер2: один аппаратный ШИМ по сравнению.
итого - 3 аппаратных + N программных.
8-бит таймер0: можно сделать несколько программных ШИМ в обработчике переполнения;
16-бит таймер1: два независимых аппаратных ШИМ по сравнению;
8-бит таймер2: один аппаратный ШИМ по сравнению.
итого - 3 аппаратных + N программных.
Re: CodeVision AVR в вопросах и ответах
a_skr писал(а):16-бит таймер1: два независимых аппаратных ШИМ по сравнению;.
Не подкините ссылку на статейку с пимером такой реализации?
Re: CodeVision AVR в вопросах и ответах
статью навскидку не подскажу, вот пример:
Код: Выделить всё
DDRB = 0x06;
TCCR1A = _BV(COM1A1) | // clear OC1A at compare match, set at BOTTOM
_BV(COM1B1) | // clear OC1B at compare match, set at BOTTOM
_BV(WGM10); // Fast PWM 8-bit
TCCR1B = _BV(WGM12) | // -"-
_BV(CS12); // clk/256/256 -> 122 Hz @ 8 MHz
OCR1A = 50; // channel1 50/256 = ~19%
OCR1B = 100; // channel2 100/256 = ~39%
while(1);
-
kotelectron
- Родился
- Сообщения: 7
- Зарегистрирован: Вт дек 20, 2011 13:33:46
Re: CodeVision AVR в вопросах и ответах
Привет. Подскажите, пожалуйста, можно ли просмотреть в CVAVR содержимое стандартных функий, например:
w1_search(), w1_dow_crc8().
Использовать их можно подключив 1ware.h. В этом хидере не указано, в какой библиотеке функции хранятся. Описание функций в help есть, но мне необходимо глянуть их код.
Откликнувшимся заранее спасибо.
w1_search(), w1_dow_crc8().
Использовать их можно подключив 1ware.h. В этом хидере не указано, в какой библиотеке функции хранятся. Описание функций в help есть, но мне необходимо глянуть их код.
Откликнувшимся заранее спасибо.
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Скомпилируйте программу, откройте любым просмотрщиком файл *.asm и наслаждайтесь.
Docendo discimus
Re: CodeVision AVR в вопросах и ответах
А в 1wire.lib не заглядывали?
Этот пост оказался полезен? Не поленись, нажми
слева!

Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
слева!Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Как Вы объясните, что это не глюк компилятора?
Как Вы объясните, что это не глюк компилятора?
Если я в любое место в программе вставляю следующий код, то у меня ответ от датчиков температуры DS18b20 всегда НОЛЬ градусов.
{
bukva_0 = 5; // S
bukva_1 = 10; // выкл
bukva_2 = 0; // 0
bukva_3 = 22; // n
};
if (stabilizator_GAZ == 0)
{
bukva_0 = 5; // S
bukva_1 = 0; // 0
bukva_2 = 23; // F
bukva_3 = 23; // F
};
if (knopka2==2)
{ while (knopka2==2){ } ;
stabilizator_GAZ = 1;
};
if (knopka3==3)
{ while (knopka3==3){ } ;
stabilizator_GAZ = 0;
};
if (knopka1==1)
{ while (knopka1==1){ } ;
vukluchit_bukvu();
rejim=31;
xg = 5;
};
Если я в этом коде исправляю строчку rejim=31; на rejim=28; то глюка нету.
Хочу заметить еще раз, что этот код я вставляю в места где у мена программа в цикле даже и не заходит туда!
Я уже с этим трахаюсь давно, решил перейти на AVR studio 4.
Если я в любое место в программе вставляю следующий код, то у меня ответ от датчиков температуры DS18b20 всегда НОЛЬ градусов.
Спойлер
if (stabilizator_GAZ == 1){
bukva_0 = 5; // S
bukva_1 = 10; // выкл
bukva_2 = 0; // 0
bukva_3 = 22; // n
};
if (stabilizator_GAZ == 0)
{
bukva_0 = 5; // S
bukva_1 = 0; // 0
bukva_2 = 23; // F
bukva_3 = 23; // F
};
if (knopka2==2)
{ while (knopka2==2){ } ;
stabilizator_GAZ = 1;
};
if (knopka3==3)
{ while (knopka3==3){ } ;
stabilizator_GAZ = 0;
};
if (knopka1==1)
{ while (knopka1==1){ } ;
vukluchit_bukvu();
rejim=31;
xg = 5;
};
Если я в этом коде исправляю строчку rejim=31; на rejim=28; то глюка нету.
Хочу заметить еще раз, что этот код я вставляю в места где у мена программа в цикле даже и не заходит туда!
Я уже с этим трахаюсь давно, решил перейти на AVR studio 4.
Re: CodeVision AVR в вопросах и ответах
Это болезнь роста,программировать научитесь-глюки пройдут сами собой.
Не знаю,что там у Вас за "режим",но опрос кнопок явно не верен-нет пауз.
Если желаете,полистайте книжку Белова "самоучитель разработчика", хотя бы про кнопки.
Не знаю,что там у Вас за "режим",но опрос кнопок явно не верен-нет пауз.
Если желаете,полистайте книжку Белова "самоучитель разработчика", хотя бы про кнопки.
Re: CodeVision AVR в вопросах и ответах
Vov123 писал(а):Это болезнь роста,программировать научитесь-глюки пройдут сами собой.
Не знаю,что там у Вас за "режим",но опрос кнопок явно не верен-нет пауз.
Если желаете,полистайте книжку Белова "самоучитель разработчика", хотя бы про кнопки.
у меня кнопки не так работают как Вы себе представляете!
Позже выложу код.
Re: CodeVision AVR в вопросах и ответах
А с гуглом поиграли?hfelyx писал(а): Игрался с нотами мелодично не получается.
Будете проходить мимо- проходите!
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Amstron , пацак, твое заблуждение о глючности компилятора достало даже меня.
48 часов - я делаю на кодевижине глючный у тебя кусок - и больше воплей не слышно.
Договорились ?
48 часов - я делаю на кодевижине глючный у тебя кусок - и больше воплей не слышно.
Договорились ?
Re: CodeVision AVR в вопросах и ответах
urry писал(а):Amstron , пацак, твое заблуждение о глючности компилятора достало даже меня.
48 часов - я делаю на кодевижине глючный у тебя кусок - и больше воплей не слышно.
Договорились ?
Про какие вопли Вы говорите? компилятор не ругается ни как.
Я не понимаю, почему перестает измерятся температура (точнее всегда НОЛЬ) если я вставляю код, который даже в программе не участвует?
Я сейчас свою программу сокращу раз в 100 и выложу на форум с этим куском кода (если конечно глючить не перестанет).
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: CodeVision AVR в вопросах и ответах
Извините - дружеские рекомендации:
режет глаз stabilizator_GAZ и bukva_0, knopka1, vukluchit_bukvu() и пр.
Ещё одна пагубная привычка некоторых программистов — давать функциям, переменным и тому подобным вещам русские имена на транслите(с) - немного смягчил.
Тут можно почитать: http://habrahabr.ru/post/172091/
режет глаз stabilizator_GAZ и bukva_0, knopka1, vukluchit_bukvu() и пр.
Ещё одна пагубная привычка некоторых программистов — давать функциям, переменным и тому подобным вещам русские имена на транслите(с) - немного смягчил.
Тут можно почитать: http://habrahabr.ru/post/172091/
Re: CodeVision AVR в вопросах и ответах
oleg110592 писал(а):Извините - дружеские рекомендации:
режет глаз stabilizator_GAZ и bukva_0, knopka1, vukluchit_bukvu() и пр.
Ещё одна пагубная привычка некоторых программистов — давать функциям, переменным и тому подобным вещам русские имена на транслите(с) - немного смягчил.
Тут можно почитать: http://habrahabr.ru/post/172091/
Вы мне мозги не пудрите, у меня не интернациональная разработка!
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: CodeVision AVR в вопросах и ответах
как скажете - не пытался пудрить, просто порекомендовал 
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Кто ещё кому пудрит
Amstron , Вы обещали глючную программу, урезанную в 100 раз. Где она ? Или при урезании перестаёт глючить ?
Amstron , Вы обещали глючную программу, урезанную в 100 раз. Где она ? Или при урезании перестаёт глючить ?
Re: CodeVision AVR в вопросах и ответах
Эпопея с глючным компилем длится три недели, вам подай исходник, вы эту проблему еще не дай бог за 48 часов завершите, ...
НЕааа ... , лучше бы сказали где компиль не глючный найти(((((....
НЕааа ... , лучше бы сказали где компиль не глючный найти(((((....
Re: CodeVision AVR в вопросах и ответах
Аlex писал(а):Кто ещё кому пудрит![]()
Amstron , Вы обещали глючную программу, урезанную в 100 раз. Где она ? Или при урезании перестаёт глючить ?
Проблема со свободным временем. Начал урезать. Позже отпишусь...
Re: CodeVision AVR в вопросах и ответах
Amstron писал(а):Аlex писал(а):Кто ещё кому пудрит![]()
Amstron , Вы обещали глючную программу, урезанную в 100 раз. Где она ? Или при урезании перестаёт глючить ?
Проблема со свободным временем. Начал урезать. Позже отпишусь...
Урезал, оставил только измерение температуры.
Глюк пропал (как и ожидал).
Интересен тот факт, что первое значение температуры отображается НОЛЬ градусов, а затем реальная.
Подскажите, почему в самом начале отображается НОЛЬ градусов? (это если несколько датчиков)
Здесь можно перебирать несколько датчиков до 8 штук
Спойлер
#include <mega168.h>#include <ds18b20.h>
#include <delay.h>
#include <1wire.h>
// #include <stdio.h> //вроде как для LCD
#asm
.equ __w1_port=8
.equ __w1_bit=0
#endasm
// для измерения температуры
unsigned char rom_code[8][9]; //масив с адресами найденых датчиков [мак кол во датчиков] []
unsigned char MAX_DEVICES ;
unsigned char nomer_datchika = 1; //переменная в которой количество присоеденённых датчиков, и номер выбранного датчика
float temp; //переменная для хранения температуры
float datchik_temp[8];
float datchik_temp_min[8];
float datchik_temp_max[8];
unsigned int nomer_dat = 0;
// unsigned int TECT ; // для теста
//unsigned char rom_codes[MAX_DEVICES][9];
#define in_knopok PINC.3
#define in_gaz_klapon PINC.4
#define in_ACC PINC.2
#define smena_indikacii 60 // максимум 250 через какае время будет менятся информация
#define lamp_G PORTB.2 //зеленый светодиод
#define lamp_R PORTB.1 // красный светодиод
#define sredn_tochka 5 // сколько раз будет делаться измерения для вычисления среднего значения топлива в одной точке (не в массиве)
#define proz_pri_kalibr 1 //
flash unsigned char digits[] = //создаём массив с цифрами, общий катод
{0b00111111, //0
0b00000110, //1
0b01011011, //2
0b01001111, //3
0b01100110, //4 vvvv
0b01101101, //5
0b01111101, //6
0b00000111, //7
0b01111111, //8
0b01101111, //9
0b00000000, //10-номер массива - выключить все сегменты
0b01111101, // 11 "Б"
0b01111001, // 12 "Е"
0b01110110, // 13 "Н"
0b00110001, // 14 "Г"
0b01110111, // 15 "А"
0b01001111, // 16 "З"
0b00111000, // 17 "L"
0b00111110, // 18 "U"
0b01100011, // 19 "gradus"
0b00110111, //20 "П"
0b01110011, //21 "Р"
0b01010100, // 22 n
0b01110001, // 23 F
0b01111000, // 24 t
0b01000000 // 25 -
//0b01000000 // 26 - S (СТАБИЛИЗАТОР ВКЛ ИЛИ ВЫКЛ ДЛЯ ДАТЧИКА)
};
unsigned char menu_gaz = 0;
eeprom unsigned char stabilizator_GAZ = 0;
// здесь объявленны общии переменные
bit x = 0; // х = 1 - мигать индикатором
bit a = 1; // а = 0 - потушить индикатор
bit tochka = 1; // точка третьего сегмента, включить значит = 1
unsigned char r;
unsigned char hours;
unsigned char sec_schet = 0; // считаем десятую часть секунды
unsigned char sec = 0 ; // считаем секунды
unsigned char min = 0; // считаем минуты
unsigned char digit_out[4]; //переменные для работы с LED
unsigned char knopka1=11; // если равно 11, то кнопка не нажата. Если равно 1, то нажата
unsigned char knopka2=22;
unsigned char knopka3=33;
unsigned char n=0; // Для смены индикации
unsigned char dlinnoe_najatie_knopki; // Для подсчета длинного нажатия кнопок
unsigned char miganie_lamp; // режиме до полного бака , для отсчета времени мигания лампой
unsigned char ff;// для подсчета времени нажатия кнопки
unsigned int indication; //переменная для хранения чисел
unsigned int indication_IND; // то что надо отобразить на индикации
unsigned char bukva_0 = 255;
unsigned char bukva_1 = 255;
unsigned char bukva_2 = 255;
unsigned char bukva_3 = 255;
unsigned char izmerenie_temperaturu;
unsigned char rejim = 2 ;
unsigned int xg = 0;
//PORTB.0 первая цифра
//PORTB.5 вторая цифра
//PORTB.3 третья цифра
//PORTB.4 четвертая цифра
interrupt [TIM0_OVF] void timer0_ovf_isr(void) //прерывание по перепонению TC/0
{
n++;
//преобразование в 4-х разрядный LED
r++; //с каждым срабатыванием таймера, увеличиваем переменную r на 1
if (r==4) r=0; //если r = 4 обнуляем
switch (r)
{ case 0:
PORTB &= ~(1 << 4); // бит 4 равен 0
if (a==0) PORTD=digits[10];
else PORTD=digits[digit_out[r]]; //выводим с каждым срабатыванием таймера число с массива в PORTD
PORTB |= (1 << 0), DDRB=0b11111111; // присвоить нулевому биту 1 , DDRB=0b11111111 - для регулировки светодиодов
TCCR2B=0b100; // делитель на 32
if (in_knopok==PINB.0)knopka3=3; //если в это время на входе единица, то knopka =1
else knopka3=33;
break;
case 1:
PORTB &= ~(1<<0), DDRB=0b11111001 ; //выключаем разряд
if (a==0)
{PORTD=digits[10];} //это постоянно вкл. точка! общий катод
else
{PORTD=digits[digit_out[r]];}; //PORTD.7=1;
PORTB |= (1 << 5) ; //включаем разряд
if (in_knopok==PINB.5) knopka2=2;
else knopka2=22;
break;
case 2: //подаём питание на разряд 3 (1)
PORTB &= ~(1<<5) ;
if (a==0) PORTD=digits[10];
else PORTD=digits[digit_out[r]];
PORTB |= (1 << 3) ;
if (in_knopok==PINB.3)knopka1=1;
else knopka1=11;
break;
case 3: //подаём питание на разряд 1 (1)
PORTB &= ~(1 << 3); // бит 3 равен 0
if (a==0) PORTD=digits[10];
else PORTD=digits[digit_out[r]]; //выводим с каждым срабатыванием таймера число с массива в PORTD
PORTB |= (1 << 4) ; // присвоить нулевому биту 1
//TCNT2=200; // начать отсчет с 0 // переменная для регулировки яркости
};
};
interrupt [TIM2_OVF] void timer2_ovf_isr(void) //прерывание по перепонению TC/2
{ PORTB.0 = 0, PORTB.5 = 0, PORTB.3 = 0, PORTB.4 = 0 , DDRB=0b11111001 ;
TCCR2B=0b0; //пределитель остановлен
};
interrupt [TIM1_OVF] void timer1_ovf_isr(void) //прерывание по перепонению TC/1
{ //это прерывание будет с частотой 10 герц будет (10 раз в секунду)
//TCNT1 = 59285 ;// отстают должно быть оно
//TCNT1 = 59300 ; // спешат сильно
//TCNT1 = 59289; // на 6 сек перегнали за 5 часов
TCNT1L = 0x96 ;
TCNT1H = 0xE7 ; // 59286 отстают на 12 сек за 12 часов
// TCNT1L = 0x97 ;
// TCNT1H = 0xE7 ; //59287 перегнали на 5 сек за 8 часов
sec_schet++;
if (sec_schet == 10)
{sec_schet = 0, sec ++;
if (sec == 60)
{min++, sec = 0;
if (min == 60)
{hours++, min = 0;
if (hours == 24) hours = 0;
};
};
};
miganie_lamp ++;
ff++;
izmerenie_temperaturu++;
};
void vukluchit_bukvu(void)
{ bukva_0 = 255;
bukva_1 = 255;
bukva_2 = 255;
bukva_3 = 255;
};
void vuvod_temp_na_ind(void)
{ if (temp < 0)
{
temp = temp * (-1);
bukva_0 = 25;
if (temp < 10 ) bukva_1 = 10; // между тем и тем ))
else bukva_1 = 255;
indication_IND = (temp +1) * 10;
}
else
{
if (temp < 10 ) bukva_1 = 10; // между тем и тем ))
else bukva_1 = 255;
indication_IND = temp * 10;
};
};
void main(void)
{
// Port C initialization
DDRC=0b00000000; //все на вход
PORTC=0x00; //подтяг резисторы 1-вкл 0-откл
// Port B initialization
DDRB=0b11111111; //все на выход
PORTB=0x00; //подтяг резисторы 1-вкл 0-откл
// Port D initialization
DDRD=0b11111111; //все на выход
PORTD=0x00; //
// Настраиваем таймер 0
TCCR0B=0b100; //деление таймера 100 это 256 частота дисплея
// TCCR0B=0b011; //деление таймера 011 это 64 частота дисплея
// Настраиваем таймер 1В срабатывает по событию часы кнопки
TCCR1B=0b100;// пределитель на 256
TIMSK1 = 0b1 ;// разрешить прерывание по таймеру 1
TIMSK0 = 0b1 ;// разрешить прерывание по таймеру 0
TIMSK2 = 0b1 ;// разрешить прерывание по таймеру 2
/* Inizializ_massiva_benz(); // ребитва
Litr_benz[0] = 422;
Litr_benz[3] = 402;
Litr_benz[5] = 385;
Litr_benz[10] = 355;
Litr_benz[15] = 330;
Litr_benz[20] = 298;
Litr_benz[25] = 278;
Litr_benz[30] = 258;
Litr_benz[35] = 233;
Litr_benz[40] = 216;
Litr_benz[45] = 194;
Litr_benz[50] = 170;
Litr_benz[55] = 147;
Litr_benz[60] = 92;
Litr_benz[64] = 50;
max_delta_benz = 6;
ADC_dathika_benz_polnyj = 50 ;
polnyi_bak_benz = 6400 ;
pryamoy_benz = 0; */
#asm("sei") // разрешаем прерывания
MAX_DEVICES=w1_search(0xf0,rom_code); //ищим датчики, и записуем их адреса в масив
ds18b20_init(0,-55,125,DS18B20_9BIT_RES); // переключения термометра в 9 битный режим
while (1)
{
if (n>=smena_indikacii)
{n=0;
indication=indication_IND ;
// indication=1234;
digit_out[3]=indication%10; //Делим на 10 остаток в массив 1-разряд 2345%10=5 единицы
indication=indication/10; //оставляем 1-вые 3 разряда 2345/10=234
if (bukva_3 == 255) {}
else digit_out[3] = bukva_3;
digit_out[2]=indication%10; //Делим на 10 остаток в массив 2-разряд 234%10=4 десятки
indication=indication/10; //оставляем 1-вые 2 разряда 234/10=23
if (bukva_2 == 255) {}
else digit_out[2] = bukva_2;
digit_out[1]=indication%10; //Делим на 10 остаток в массив 3-разряд 23%10=2 сотни
indication=indication/10;
if (bukva_1 == 255) {}
else digit_out[1] = bukva_1;
if (indication_IND < 1000) digit_out[0] = 10;
else digit_out[0]=indication%10; //Делим на 10 остаток в массив 3-разряд 23%10=2 тысячи
if (bukva_0 == 255) {}
else digit_out[0] = bukva_0;
};
if (izmerenie_temperaturu > 20)
{ nomer_datchika ++, izmerenie_temperaturu = 0;
if (nomer_datchika > MAX_DEVICES - 1) nomer_datchika = 0;
datchik_temp [nomer_datchika] = ds18b20_temperature(&rom_code[nomer_datchika][0]); //читаем температуру с выбранного датчика
if (datchik_temp [nomer_datchika] == -9999) {}
else
{
if (datchik_temp [nomer_datchika] > datchik_temp_max [nomer_datchika])
{
datchik_temp_max [nomer_datchika] = datchik_temp [nomer_datchika];
}
else
{
if (datchik_temp [nomer_datchika] < datchik_temp_min [nomer_datchika])
{
datchik_temp_min [nomer_datchika] = datchik_temp [nomer_datchika];
};
};
};
};
if (knopka3==3)
{ while (knopka3==3){ } ;
nomer_dat++;
if (nomer_dat >= MAX_DEVICES) nomer_dat = 0;
ff = 0;
};
x = 0 ; // что бы не мигал дисплей если выходиш с режима когда мигает дисплей
tochka = 0;
lamp_G=0;
lamp_R=0;
if (ff > 50) ff = 0;
if (knopka2==2)
{dlinnoe_najatie_knopki = 0 ;
while (knopka2==2)
{if(dlinnoe_najatie_knopki > 10)
{
lamp_G = 1;
lamp_R = 1;
datchik_temp_max [nomer_dat] = datchik_temp [nomer_dat];
datchik_temp_min [nomer_dat] = datchik_temp [nomer_dat];
delay_ms(1000);
lamp_G = 0;
lamp_R = 0;
};
};
vukluchit_bukvu();
bukva_3 = 19;
temp = datchik_temp_max [nomer_dat] ;
vuvod_temp_na_ind ();
lamp_G=0;
lamp_R=1;
delay_ms(1000);
temp = datchik_temp_min [nomer_dat] ;
vuvod_temp_na_ind ();
lamp_G=1;
lamp_R=0;
delay_ms(2000);
lamp_G=0;
lamp_R=0;
}
else
{
if (ff < 7)
{
bukva_0 = 24;
bukva_1 = 22;
bukva_2 = 10;
bukva_3 = 255;
indication_IND = nomer_dat+1 ;
}
else
{ vukluchit_bukvu();
bukva_3 = 19;
if (datchik_temp [nomer_dat] == -9999)
{ bukva_0 = 24;
bukva_1 = 25;
bukva_2 = 25;
}
else
{
temp = datchik_temp [nomer_dat] ;
vuvod_temp_na_ind ();
};
};
};
if (menu_gaz==5)
{
if (stabilizator_GAZ == 1)
{
bukva_0 = 5; // S
bukva_1 = 10; // выкл
bukva_2 = 0; // 0
bukva_3 = 22; // n
};
if (stabilizator_GAZ == 0)
{
bukva_0 = 5; // S
bukva_1 = 0; // 0
bukva_2 = 23; // F
bukva_3 = 23; // F
};
if (knopka2==2)
{ while (knopka2==2){ } ;
stabilizator_GAZ = 1;
};
if (knopka3==3)
{ while (knopka3==3){ } ;
stabilizator_GAZ = 0;
};
if (knopka1==1)
{ while (knopka1==1){ } ;
vukluchit_bukvu();
rejim=31;
xg = 5;
};
};
};
}
А вот если программу упростить до одного датчика, то температура отображается сразу та которая есть на самом деле.
Код ниже:
Спойлер
#include <mega168.h>#include <ds18b20.h>
#include <delay.h>
#include <1wire.h>
// #include <stdio.h> //вроде как для LCD
#asm
.equ __w1_port=8
.equ __w1_bit=0
#endasm
// для измерения температуры
unsigned char rom_code[8][9]; //масив с адресами найденых датчиков [мак кол во датчиков] []
unsigned char MAX_DEVICES ;
unsigned char nomer_datchika = 1; //переменная в которой количество присоеденённых датчиков, и номер выбранного датчика
float temp; //переменная для хранения температуры
float datchik_temp[8];
float datchik_temp_min[8];
float datchik_temp_max[8];
unsigned int nomer_dat = 0;
// unsigned int TECT ; // для теста
//unsigned char rom_codes[MAX_DEVICES][9];
#define in_knopok PINC.3
#define in_gaz_klapon PINC.4
#define in_ACC PINC.2
#define smena_indikacii 60 // максимум 250 через какае время будет менятся информация
#define lamp_G PORTB.2 //зеленый светодиод
#define lamp_R PORTB.1 // красный светодиод
#define sredn_tochka 5 // сколько раз будет делаться измерения для вычисления среднего значения топлива в одной точке (не в массиве)
#define proz_pri_kalibr 1 //
flash unsigned char digits[] = //создаём массив с цифрами, общий катод
{0b00111111, //0
0b00000110, //1
0b01011011, //2
0b01001111, //3
0b01100110, //4 vvvv
0b01101101, //5
0b01111101, //6
0b00000111, //7
0b01111111, //8
0b01101111, //9
0b00000000, //10-номер массива - выключить все сегменты
0b01111101, // 11 "Б"
0b01111001, // 12 "Е"
0b01110110, // 13 "Н"
0b00110001, // 14 "Г"
0b01110111, // 15 "А"
0b01001111, // 16 "З"
0b00111000, // 17 "L"
0b00111110, // 18 "U"
0b01100011, // 19 "gradus"
0b00110111, //20 "П"
0b01110011, //21 "Р"
0b01010100, // 22 n
0b01110001, // 23 F
0b01111000, // 24 t
0b01000000 // 25 -
//0b01000000 // 26 - S (СТАБИЛИЗАТОР ВКЛ ИЛИ ВЫКЛ ДЛЯ ДАТЧИКА)
};
unsigned char menu_gaz = 0;
eeprom unsigned char stabilizator_GAZ = 0;
// здесь объявленны общии переменные
bit x = 0; // х = 1 - мигать индикатором
bit a = 1; // а = 0 - потушить индикатор
bit tochka = 1; // точка третьего сегмента, включить значит = 1
unsigned char r;
unsigned char hours;
unsigned char sec_schet = 0; // считаем десятую часть секунды
unsigned char sec = 0 ; // считаем секунды
unsigned char min = 0; // считаем минуты
unsigned char digit_out[4]; //переменные для работы с LED
unsigned char knopka1=11; // если равно 11, то кнопка не нажата. Если равно 1, то нажата
unsigned char knopka2=22;
unsigned char knopka3=33;
unsigned char n=0; // Для смены индикации
unsigned char dlinnoe_najatie_knopki; // Для подсчета длинного нажатия кнопок
unsigned char miganie_lamp; // режиме до полного бака , для отсчета времени мигания лампой
unsigned char ff;// для подсчета времени нажатия кнопки
unsigned int indication; //переменная для хранения чисел
unsigned int indication_IND; // то что надо отобразить на индикации
unsigned char bukva_0 = 255;
unsigned char bukva_1 = 255;
unsigned char bukva_2 = 255;
unsigned char bukva_3 = 255;
unsigned char izmerenie_temperaturu;
unsigned char rejim = 2 ;
unsigned int xg = 0;
//PORTB.0 первая цифра
//PORTB.5 вторая цифра
//PORTB.3 третья цифра
//PORTB.4 четвертая цифра
interrupt [TIM0_OVF] void timer0_ovf_isr(void) //прерывание по перепонению TC/0
{
n++;
//преобразование в 4-х разрядный LED
r++; //с каждым срабатыванием таймера, увеличиваем переменную r на 1
if (r==4) r=0; //если r = 4 обнуляем
switch (r)
{ case 0:
PORTB &= ~(1 << 4); // бит 4 равен 0
if (a==0) PORTD=digits[10];
else PORTD=digits[digit_out[r]]; //выводим с каждым срабатыванием таймера число с массива в PORTD
PORTB |= (1 << 0), DDRB=0b11111111; // присвоить нулевому биту 1 , DDRB=0b11111111 - для регулировки светодиодов
TCCR2B=0b100; // делитель на 32
if (in_knopok==PINB.0)knopka3=3; //если в это время на входе единица, то knopka =1
else knopka3=33;
break;
case 1:
PORTB &= ~(1<<0), DDRB=0b11111001 ; //выключаем разряд
if (a==0)
{PORTD=digits[10];} //это постоянно вкл. точка! общий катод
else
{PORTD=digits[digit_out[r]];}; //PORTD.7=1;
PORTB |= (1 << 5) ; //включаем разряд
if (in_knopok==PINB.5) knopka2=2;
else knopka2=22;
break;
case 2: //подаём питание на разряд 3 (1)
PORTB &= ~(1<<5) ;
if (a==0) PORTD=digits[10];
else PORTD=digits[digit_out[r]];
PORTB |= (1 << 3) ;
if (in_knopok==PINB.3)knopka1=1;
else knopka1=11;
break;
case 3: //подаём питание на разряд 1 (1)
PORTB &= ~(1 << 3); // бит 3 равен 0
if (a==0) PORTD=digits[10];
else PORTD=digits[digit_out[r]]; //выводим с каждым срабатыванием таймера число с массива в PORTD
PORTB |= (1 << 4) ; // присвоить нулевому биту 1
//TCNT2=200; // начать отсчет с 0 // переменная для регулировки яркости
};
};
interrupt [TIM2_OVF] void timer2_ovf_isr(void) //прерывание по перепонению TC/2
{ PORTB.0 = 0, PORTB.5 = 0, PORTB.3 = 0, PORTB.4 = 0 , DDRB=0b11111001 ;
TCCR2B=0b0; //пределитель остановлен
};
interrupt [TIM1_OVF] void timer1_ovf_isr(void) //прерывание по перепонению TC/1
{ //это прерывание будет с частотой 10 герц будет (10 раз в секунду)
//TCNT1 = 59285 ;// отстают должно быть оно
//TCNT1 = 59300 ; // спешат сильно
//TCNT1 = 59289; // на 6 сек перегнали за 5 часов
TCNT1L = 0x96 ;
TCNT1H = 0xE7 ; // 59286 отстают на 12 сек за 12 часов
// TCNT1L = 0x97 ;
// TCNT1H = 0xE7 ; //59287 перегнали на 5 сек за 8 часов
sec_schet++;
if (sec_schet == 10)
{sec_schet = 0, sec ++;
if (sec == 60)
{min++, sec = 0;
if (min == 60)
{hours++, min = 0;
if (hours == 24) hours = 0;
};
};
};
miganie_lamp ++;
ff++;
izmerenie_temperaturu++;
};
void vukluchit_bukvu(void)
{ bukva_0 = 255;
bukva_1 = 255;
bukva_2 = 255;
bukva_3 = 255;
};
void vuvod_temp_na_ind(void)
{ if (temp < 0)
{
temp = temp * (-1);
bukva_0 = 25;
if (temp < 10 ) bukva_1 = 10; // между тем и тем ))
else bukva_1 = 255;
indication_IND = (temp +1) * 10;
}
else
{
if (temp < 10 ) bukva_1 = 10; // между тем и тем ))
else bukva_1 = 255;
indication_IND = temp * 10;
};
};
void main(void)
{
// Port C initialization
DDRC=0b00000000; //все на вход
PORTC=0x00; //подтяг резисторы 1-вкл 0-откл
// Port B initialization
DDRB=0b11111111; //все на выход
PORTB=0x00; //подтяг резисторы 1-вкл 0-откл
// Port D initialization
DDRD=0b11111111; //все на выход
PORTD=0x00; //
// Настраиваем таймер 0
TCCR0B=0b100; //деление таймера 100 это 256 частота дисплея
// TCCR0B=0b011; //деление таймера 011 это 64 частота дисплея
// Настраиваем таймер 1В срабатывает по событию часы кнопки
TCCR1B=0b100;// пределитель на 256
TIMSK1 = 0b1 ;// разрешить прерывание по таймеру 1
TIMSK0 = 0b1 ;// разрешить прерывание по таймеру 0
TIMSK2 = 0b1 ;// разрешить прерывание по таймеру 2
/* Inizializ_massiva_benz(); // ребитва
Litr_benz[0] = 422;
Litr_benz[3] = 402;
Litr_benz[5] = 385;
Litr_benz[10] = 355;
Litr_benz[15] = 330;
Litr_benz[20] = 298;
Litr_benz[25] = 278;
Litr_benz[30] = 258;
Litr_benz[35] = 233;
Litr_benz[40] = 216;
Litr_benz[45] = 194;
Litr_benz[50] = 170;
Litr_benz[55] = 147;
Litr_benz[60] = 92;
Litr_benz[64] = 50;
max_delta_benz = 6;
ADC_dathika_benz_polnyj = 50 ;
polnyi_bak_benz = 6400 ;
pryamoy_benz = 0; */
#asm("sei") // разрешаем прерывания
MAX_DEVICES=w1_search(0xf0,rom_code); //ищим датчики, и записуем их адреса в масив
ds18b20_init(0,-55,125,DS18B20_9BIT_RES); // переключения термометра в 9 битный режим
while (1)
{
if (n>=smena_indikacii)
{n=0;
indication=indication_IND ;
// indication=1234;
digit_out[3]=indication%10; //Делим на 10 остаток в массив 1-разряд 2345%10=5 единицы
indication=indication/10; //оставляем 1-вые 3 разряда 2345/10=234
if (bukva_3 == 255) {}
else digit_out[3] = bukva_3;
digit_out[2]=indication%10; //Делим на 10 остаток в массив 2-разряд 234%10=4 десятки
indication=indication/10; //оставляем 1-вые 2 разряда 234/10=23
if (bukva_2 == 255) {}
else digit_out[2] = bukva_2;
digit_out[1]=indication%10; //Делим на 10 остаток в массив 3-разряд 23%10=2 сотни
indication=indication/10;
if (bukva_1 == 255) {}
else digit_out[1] = bukva_1;
if (indication_IND < 1000) digit_out[0] = 10;
else digit_out[0]=indication%10; //Делим на 10 остаток в массив 3-разряд 23%10=2 тысячи
if (bukva_0 == 255) {}
else digit_out[0] = bukva_0;
};
indication_IND = ds18b20_temperature(&rom_code[0][0]); //читаем температуру с выбранного датчика
if (rejim == 5)
{
if (stabilizator_GAZ == 1)
{
bukva_0 = 5; // S
bukva_1 = 10; // выкл
bukva_2 = 0; // 0
bukva_3 = 22; // n
};
if (stabilizator_GAZ == 0)
{
bukva_0 = 5; // S
bukva_1 = 0; // 0
bukva_2 = 23; // F
bukva_3 = 23; // F
};
if (knopka2==2)
{ while (knopka2==2){ } ;
stabilizator_GAZ = 1;
};
if (knopka3==3)
{ while (knopka3==3){ } ;
stabilizator_GAZ = 0;
};
if (knopka1==1)
{ while (knopka1==1){ } ;
vukluchit_bukvu();
rejim=31;
xg = 5;
};
}
};
}
От чего зависит изначально НОЛЬ градусов, если датчиков несколько?
Может быть каким то образом программа виснет и не хочет дальше мерить?