реклама на сайте
подробности

 
 
> DS18B20, 7 сегментный индикатор и Atmega8
trivet
сообщение Feb 2 2011, 16:12
Сообщение #1





Группа: Новичок
Сообщений: 7
Регистрация: 12-05-05
Пользователь №: 4 963



Объясните пожалуйста, я новичек и если что извиняйте за тупой вопрос.
У меня датчик техразрядный индикатор(использую 2 из разрадов). Написал прогу в CodeVisionAVR, все работает. Но прикол в том что иногда(часто но никакой закономерности) заместо значений выводится "88".
CODE

#include <mega8.h>
#include <delay.h>
#include <stdio.h>

// 1 Wire Bus interface functions

#include <1wire.h>

// DS1820 Temperature Sensor functions
#include <ds18b20.h>

//#asm //сообщаем куда подключён экран
// .equ __lcd_port=0x18
//#endasm
//#include <lcd.h>

#define A PORTB.6
#define B PORTB.2
#define C PORTB.0
#define D PORTD.6
#define E PORTD.5
#define F PORTB.7
#define G PORTB.1
#define H PORTD.7

#define D1 PORTB.5
#define D2 PORTB.4
#define D3 PORTB.3
#define D4 PORTC.1

#define MAX_DS18b20 8
unsigned char ds18b20_devices;
unsigned char ds18b20_rom_codes[MAX_DS18b20][9];

float temper;
int temper_int,temper_fl,min=0,temp[2],i;

flash int digits[11][8] = {{0,0,1,1,1,1,1,1}, //0
{0,0,0,0,0,1,1,0}, //1
{0,1,0,1,1,0,1,1}, //2
{0,1,0,0,1,1,1,1}, //3
{0,1,1,0,0,1,1,0}, //4
{0,1,1,0,1,1,0,1}, //5
{0,1,1,1,1,1,0,1}, //6
{0,0,0,0,0,1,1,1}, //7
{0,1,1,1,1,1,1,1}, //8
{0,1,1,0,1,1,1,1}, //9
{0,0,0,0,0,0,0,0}}; //пусто

interrupt [TIM1_OVF] void timer2_ovf_isr(void)
{
switch(i)
{
case 0:D3=1;
D1=0;
break;
case 1:D1=1;
D2=0;
break;
case 2:D2=1;
D3=0;
break;
};
if(i>0)
{
A=digits[temp[i-1]][7];
B=digits[temp[i-1]][6];
C=digits[temp[i-1]][5];
D=digits[temp[i-1]][4];
E=digits[temp[i-1]][3];
F=digits[temp[i-1]][2];
G=digits[temp[i-1]][1];
}
else
{
A=digits[10][7];
B=digits[10][6];
C=digits[10][5];
D=digits[10][4];
E=digits[10][3];
F=digits[10][2];
G=digits[10][1];
}

i++;
if(i==3) i=0;
TCNT1H=0xEC;
TCNT1L=0x77;
}

void temperature(void) // функция по работе с термо-датчиком
{
temper=ds18b20_temperature(&ds18b20_rom_codes[0][0]);
temper_int=temper; // отбор целой части от температуры
if(temper<0) // при отрицательной температуре
{
temper_fl=(temper-temper_int-0.0625)*10; // дробная часть
temper_int=-((temper_int*10)+temper_fl); // температура*10
min=1; // минус
}
else // при положительной
{
temper_fl=(temper-temper_int)*10; // дробная часть
temper_int=(temper_int*10)+temper_fl;// температура*10
min=0; // плюс
}
}

void main(void)
{
PORTB=0x00;
DDRB=0xFF;

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0xFF;

TCCR0=0x02;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x02;
TCNT1H=0xEC;
TCNT1L=0x77;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x04;
UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;
SREG|=(1<<7);
ADCSRA=0x00;
SPCR=0x00;
TWCR=0x00;

w1_init();
ds18b20_devices=w1_search(0xf0,ds18b20_rom_codes);
ds18b20_init(0,-35,35,DS18B20_12BIT_RES);

while (1)
{
temperature();
temp[0]=temper_int/100;
temp[1]=(temper_int-temp[0]*100)/10;
}
}


Вот проект CodeVisionAVR и Proteus

Сообщение отредактировал IgorKossak - Feb 2 2011, 18:06
Причина редактирования: Читайте в правилах об оформлении кода

Эскизы прикрепленных изображений
Прикрепленное изображение
 

Прикрепленные файлы
Прикрепленный файл  proga.rar ( 150.05 килобайт ) Кол-во скачиваний: 31
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
trivet
сообщение Feb 3 2011, 10:35
Сообщение #2





Группа: Новичок
Сообщений: 7
Регистрация: 12-05-05
Пользователь №: 4 963



"88" выводится и в железе и в протеусе. пробовал вообще не выводить восьмерки, но результат тот же!
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 3 2011, 10:44
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(trivet @ Feb 3 2011, 13:35) *
"88" выводится и в железе и в протеусе. пробовал вообще не выводить восьмерки, но результат тот же!

О чем вообще можно говорить, если Вы до сих пор не пользовались Debug/Configure diagnostics в протеусе, битый час парите мозг окружающим, вместо того, чтобы проверить, понимайт даллас все посланные ему команды или нет, срабатывает собака или нет, есть переполнение стека или нет, итд итп
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 16:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01382 секунд с 7
ELECTRONIX ©2004-2016