roboforum.ru

Технический форум по робототехнике.

Термометр на AtMega8L+ DS18B20

Термометр на AtMega8L+ DS18B20

vomchik » 17 ноя 2010, 00:10

Здравствуйте, вот делаю термометр, и как бы все получилось.
Но, у меня никак невыходит нормально опрашивать кнопки. Кнопок у меня 4, ну это такое, на будущее.
Для начала я хочу разобраться хотя бы с одной, я ее опрашиваю в прерывании.

Ну код компилируется, загружаю.
Наблюдаю на результат, и вот он какой.
При включении термометра у меня на 7-сегментном индикаторе отображается "500,0", что свидетельствует о том, что в переменную buttons_1 записано "0", потом нажимаю на кнопку, в переменную buttons_1 записано "1", начинает отображаться значение температуры, но вот когда я отпускаю кнопку, по идеи должно опять появится надпись "500,0", то есть в переменную buttons_1 почему-то не возвращается значение "0".

И код предоставлен, пишу в CodeVisionAVR C.

ну и вопрос дня, что я делаю не так)))???


Код: Выделить всёРазвернуть
#define F_CPU 8000000UL

#define variable_frequency PINC.5
#define nav_minus PINC.0
#define nav_plus PINC.1
#define mode_view PINC.2

#include <mega8.h>
#include <delay.h>
#include <ds18b20.h>
#include <1wire.h>
#include <stdio.h>

#asm
.equ __w1_port=0x15
.equ __w1_bit=3
#endasm

unsigned char number[] =
{
0xC0, //0
0xF9, //1
0xA4, //2
0xB0, //3
0x99, //4
0x92, //5
0x82, //6
0xF8, //7
0x80, //8
0x90, //9
0xBF, //минус
0xFF //пустой разряд
};


unsigned char data1, data2, data3, data4, buttons_1;

//прерывания таймера Т0 - вывод на индикатор
interrupt [TIM0_OVF] void Timer0Ovf(void)
{

static unsigned char count = 0;
static unsigned char count_buttons = 0;

TCNT0 = 0xb2;
// опрос кнопки
if (count_buttons == 0 & mode_view == 0) {
buttons_1 = 1; }

else buttons_1 = 0;

count_buttons++;

if (count_buttons == 3) count_buttons = 0;

//зажигаем поочерёдно разряды
if (count == 0) {
PORTD = number[data4];
PORTB = (1<<4);
}
if (count == 1) {
PORTD = number[data3];
PORTB = (1<<3);
}
if (count == 2) {
PORTD = (number[data2]) & (~(1<<7));
PORTB = (1<<2);
}
if (count == 3) {
PORTD = number[data1];
PORTB = (1<<1);
}


count++;

if (count == 4) count = 0;


}

void main( void )
{

unsigned char devices;
float temper;
int temper_int,temper_fl, mode, i, temp_eeprom;
devices=ds18b20_init(0,-35,30,DS18B20_12BIT_RES); // подключаем датчик и узнаем их количество

//порт, к которому подкл. сегменты
PORTD = 0xff;
DDRD = 0xff;

DDRC = 0x00;
PORTC = 0xff;

//порт, к которому подкл. катод
PORTB = 0;
DDRB |= (1<<4)|(1<<3)|(1<<2)|(1<<1);

//инициализация таймера Т0
TIMSK = (1<<TOIE0);
TCCR0 = (1<<CS02)|(0<<CS01)|(1<<CS00);
TCNT0 = 0xb2;

#asm("sei");

// программный подсчет температуры
while(1) {
if (buttons_1 == 1) {
while(devices>0){
temper=ds18b20_temperature(0); // считывание температуры
temper_int=temper; // избавляемся от нецелого чысла
if (temper<0) // при отрицательной температуре
{
temper=temper*(-1);
temper_int=temper_int*(-1);
temper_fl=(temper-temper_int)*10;
temper_int=(temper_int*10)+temper_fl;
data4=10; // вывод знака "минус"
}
else // при положительной температуре
{
temper_fl=(temper-temper_int)*10;
temper_int=(temper_int*10)+temper_fl;
data4 =11; // вывод пустого разряда, если убрать будет гореть ноль
}

// разбиение значения температуры на разряды для вывода на индикатор
data1 = temper_int % 10;
temper_int=temper_int/10;
data2 = temper_int % 10;
data3 = temper_int / 10;
delay_ms(100);

}

} else data4 = 5;
}
}

Re: Термометр на AtMega8L+ DS18B20

grek » 17 ноя 2010, 09:17

Введи в программу, что нибудь для отображения работы программы.Например пускай у тебя при выполнении выводится 1 на индикатор и смотри, что происходит.Сам поймешь,где у тебя ошибка.
и вот с этим условием разберись может вместо & должно быть &&

Код: Выделить всёРазвернуть
if (count_buttons == 0 & mode_view == 0)
{
buttons_1 = 1; }
else buttons_1 = 0;


Rambler\'s Top100 Mail.ru counter