Тёмыч, часы идут нормально, только у них странная зависимость от показаний термометра. Может и протеус баловаться . Индикатор 20с светится, 10с темный. Так и писАл?
Project : Version : Date : 08.12.2016 Author : Company : Comments:
Chip type : ATmega8 Program type : Application AVR Core Clock frequency: 8,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/
#define A PORTB.2 = 0; #define B PORTB.1 = 0; #define C PORTD.0 = 0; #define D PORTC.0 = 0; #define E PORTC.1 = 0; #define F PORTB.4 = 0; #define G PORTB.5 = 0;
#define a PORTB.2 = 1; #define b PORTB.1 = 1; #define c PORTD.0 = 1; #define d PORTC.0 = 1; #define e PORTC.1 = 1; #define f PORTB.4 = 1; #define g PORTB.5 = 1;
// 1 Wire Bus initialization // 1 Wire Data port: PORTD // 1 Wire Data bit: 5 // Note: 1 Wire port settings must be specified in the // Project|Configure|C Compiler|Libraries|1 Wire IDE menu.
w1_init();
// Global enable interrupts #asm("sei")
while (1) { if (s1 == 10) // увеличиваем первый разряд секунд {s1 = 0; s2++;}
if (s2 == 6) // увеличиваем второй разряд секунд {s2 = 0; min1++;}
if (min1 == 10) // увеличиваем первый разряд минут {min1 = 0; min2++;}
if (min2 == 6) // увеличиваем второй разряд минут {min2 = 0; has1++;}
if (has1 == 10) // увеличиваем первый разряд часов {has1 = 0; has2++;}
if (has2 == 6) // увеличиваем второй разряд часов {has2 = 0;}
if(h == 1) // зажигаем двоеточие раз в секунду PORTC.3 = 0; else PORTC.3 = 1;
Тёмыч, бегло пока просмотрел: динамическая индикация неправильно организована, вместо засвечивания цифры на время 1/6 периода ДИ - пачка коротких импульсов (и в протеусе видно). У тебя знакоместо гасится независимо от того, было прерывание 0 таймера или нет. Плохо, что неизвестно в каком формате выдает температуру функция t = ds18b20_temperature(0). Возможно в ней косяк. Отрицательные температуры вообще какую-то бредню выдают. Потом переделаем, чтобы индикатор тушить не надо было.
unsigned char ds18b20_select(unsigned char *addr) { unsigned char i; if (w1_init()==0) return 0; if (addr) { w1_write(0x55); //команда соответствия i=0; do w1_write(*(addr++)); while (++i<8); } else w1_write(0xcc); return 1; }
// чтение памяти
unsigned char ds18b20_read_spd(unsigned char *addr) { unsigned char i; unsigned char *p; if (ds18b20_select(addr)==0) return 0; w1_write(0xbe); // чтение памяти i=0; p=(char *) &__ds18b20_scratch_pad; do *(p++)=w1_read(); while (++i<9); return !w1_dow_crc8(&__ds18b20_scratch_pad,9); }
// функция измерения и конвертирования температуры
signed int ds18b20_temperature(unsigned char *addr) // тип данных int //float ds18b20_temperature(unsigned char *addr) // тип данных float { unsigned char resolution; // переменная // resolution - разрешение if (ds18b20_read_spd(addr)==0) return 00; // чтение
resolution=(__ds18b20_scratch_pad.conf_register>>5) & 3; if (ds18b20_select(addr)==0) return 00; // выбор
w1_write(0x44); // запись // команда начала конвертирования и преобразования
unsigned char ds18b20_init(unsigned char *addr,signed char temp_low,signed char temp_high, unsigned char resolution) { if (ds18b20_select(addr)==0) return 0; resolution=(resolution<<5) | 0x1f; w1_write(0x4e); // запись в память : w1_write(temp_high); // запись в старший регистор w1_write(temp_low); // запись в младший регистор w1_write(resolution); // запись в регистор конфигурации if (ds18b20_read_spd(addr)==0) return 0; if ((__ds18b20_scratch_pad.temp_low!=temp_low) || (__ds18b20_scratch_pad.temp_high!=temp_high) || (__ds18b20_scratch_pad.conf_register!=resolution)) return 0; if (ds18b20_select(addr)==0) return 0; w1_write(0x48); // копирование ОЗУ в ПЗУ delay_ms(15); return w1_init(); }
Добавлено (18.03.2017, 00:45) --------------------------------------------- msmmmm, наверное вот этот кусок виноват:
switch(n) // включаем порты на выход. разряды с права на лево { case 0: // 1 температура { t1;t2;m1;m2;h1;h2; // гасим индикаторы if (meny == 3) { x = s1; // вместо температуры отображаем секунды } else { if(t < 0) {x = -(t%10);} else {x = t%10;} } T1;t2;m1;m2;h1;h2; break; } case 1: // 2 температура
Добавлено (18.03.2017, 00:46) --------------------------------------------- перекину его в прерывание...
Добавлено (18.03.2017, 01:03) --------------------------------------------- чего то вообще какая то туфта получается...
viktor0105, подредактировал не много (внимательно сравните с предыдущей версией), отметил белыми прямоугольниками. Где проложил связи там надо сделать дорожки. Желательно после того как нарисовали плату её проверить на соответствие техническим условиям. В правом верхнем углу есть кнопа, при нажатии на которую открывается колонка. В ней надо вбить необходимые параметры и нажать кнопку "полностью". Иначе может получиться плата которую вам просто не получится сделать, будут КЗ между дорожками и т.д.
Добавлено (18.03.2017, 11:47) --------------------------------------------- и ещё один вопросик: я правильно понял, что контроллер, транзисторы и индикаторы будут находиться на одной стороне платы? Если да, то влезут ли все эти элементы под индикаторы при монтаже?
Project : Version : Date : 08.12.2016 Author : Company : Comments:
Chip type : ATmega8 Program type : Application AVR Core Clock frequency: 8,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/
#define A PORTB.2 = 0; #define B PORTB.1 = 0; #define C PORTD.0 = 0; #define D PORTC.0 = 0; #define E PORTC.1 = 0; #define F PORTB.4 = 0; #define G PORTB.5 = 0;
#define a PORTB.2 = 1; #define b PORTB.1 = 1; #define c PORTD.0 = 1; #define d PORTC.0 = 1; #define e PORTC.1 = 1; #define f PORTB.4 = 1; #define g PORTB.5 = 1;
switch(n) // включаем порты на выход. разряды с права на лево { case 0: // 1 температура { T1;t2;m1;m2;h1;h2; break; } case 1: // 2 температура { t1;T2;m1;m2;h1;h2; break; } case 2: // 3 минуты { t1;t2;M1;m2;h1;h2; break; } case 3: // 4 минуты { t1;t2;m1;M2;h1;h2; break; } case 4: // 5 часы { t1;t2;m1;m2;H1;h2; break; } case 5: // 6 часы { t1;t2;m1;m2;h1;H2; break; }
// 1 Wire Bus initialization // 1 Wire Data port: PORTD // 1 Wire Data bit: 5 // Note: 1 Wire port settings must be specified in the // Project|Configure|C Compiler|Libraries|1 Wire IDE menu.
w1_init();
// Global enable interrupts #asm("sei")
while (1) { if (s1 == 10) // увеличиваем первый разряд секунд {s1 = 0; s2++;}
if (s2 == 6) // увеличиваем второй разряд секунд {s2 = 0; min1++;}
if (min1 == 10) // увеличиваем первый разряд минут {min1 = 0; min2++;}
if (min2 == 6) // увеличиваем второй разряд минут {min2 = 0; has1++;}
if (has1 == 10) // увеличиваем первый разряд часов {has1 = 0; has2++;}
if (has2 == 6) // увеличиваем второй разряд часов {has2 = 0;}
if(h == 1) // зажигаем двоеточие раз в секунду PORTC.3 = 0; else PORTC.3 = 1;