Termometr AVR, LED, soft
Mariusz - 26-12-2006 23:45
Termometr AVR, LED, soft Poszukuję kogoś do poprawy programu termometru:
Problem jest z wyświetlaniem temperatury po podaniu zasilania
przez jakiś czas ustalając temperaturę pokazuje "głupoty"
oraz pod czas komunikacji z DS1820 nie wyświetla temperatury.
Jeżeli można to chciałbym dołożyć drugi DS1820 i jakiś przycisk wyboru.
Procesor może być inny np: PIC (odpadanie dodatkowo kwarc) byle był tani.
http://www.kmitl.ac.th/~kswichit%20/...avrthermo.htmlhttp://www.kmitl.ac.th/~kswichit%20/.../schematic.gif/**************************************
thermo.c
Digital Thermometer -55C to +125C
AVR 90S2313 & DS1820
Copyright 2001 by Wichit Sirichote
**************************************/
#include <90s2313.h>
#include <math.h>
// 1 Wire Bus functions
#asm
.equ __w1_port=0x12
.equ __w1_bit=6
#endasm
#include <1wire.h>
// DS1820 temperature sensor functions
#include <ds1820.h>
// Declare your global variables here
unsigned char tick,i,digit;
unsigned char heat[4];
unsigned int xtimer1;
int temp,T,X1,X2,X3,X4,X5; // signed number for negative and positve
temperature manipulating
char key;
unsigned char convert[10] =
{0x3F,0x06,0xdb,0xcf,0x66,0x6d,0x7d,0x07,0x7f,0x6f };
#define segment PORTB
#define LED_digit PORTD
// converts 16-bit data in T to display buffer for both negative and
positive reading
void heatToBuffer()
{
if(T<0){
heat[3] = 0x40; // if negative, put -
heat[0] = 0x39; // C
T = abs(T); // get only amplitude
heat[1] = convert[T%10];
heat[2] = convert[T/10];
if (heat[2] == 0x3f)
heat[2] = 0; // off msd
}
else
{
heat[0] = 0x39; // C
heat[3] = convert[T/100];
temp = T%100;
heat[1] = convert[temp%10];
heat[2] = convert[temp/10];
// off msd
if (heat[3] == 0x3f)
{
heat[3] = 0;
if(heat[2] == 0x3f)
heat[2] = 0;
}
}
}
LPF() // performs five-point moving average
{
X5=X4;
X4=X3;
X3=X2;
X2=X1;
X1= T;
T = (X1+X2+X3+X4+X5)/5;
}
read_temp()
{
if(++xtimer1 >=5)
{
xtimer1 = 0;
segment = 0xff;
T = ds1820_temperature_10(0)/10; // read DS1820 every 5 sec.
LPF(); // enter filter
heatToBuffer(); // convert it
}
}
// Timer 0 overflow interrupt service routine
// timer interrupt every 1/15 sec provides foreground task to be run
periodically.
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
switch (++tick){
case 15: tick = 0;
read_temp(); //second_task();
}
}
void scanLED() /* scan 4-digit LED and 4-key switch, if key pressed key
= 0-3
else key = -1 */
// adapted from 89C2051 project if needs scan key, find one bit input
port
{
char i;
digit = 0x20;
key = -1;
for( i = 0; i < 4; i++) /* 4-DIGIT scanning */
{
LED_digit = ~digit; /* send complement[digit] */
segment = ~heat[i]; /* send complement[segment] */
delay_ms(1); /* delay a while */
segment = 0xff; /* off LED */
// if ((PORTD & 0x10) == 0) /* if key pressed P3.4 became low */
// key = i; /* save key position to key variable */
digit>>=1; /* next digit */
}
}
void main(void)
{
DDRB=0xFF;
PORTB=0x00;
DDRD=0x7F;
PORTD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 3.906 kHz
// Mode: Output Compare
// OC0 output: Disconnected
TCCR0=0x05;
TCNT0=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
// 1 Wire Bus initialization
w1_init();
// Global enable interrupts
#asm("sei")
// 1 Wire Bus initialization
w1_init();
T = 34;
heatToBuffer();
while (1)
{
scanLED(); // run background task forever
}
}
Virus_7 - 27-12-2006 02:45
Mariusz napisał(a):
> Poszukuję kogoś do poprawy programu termometru:
>
> Problem jest z wyświetlaniem temperatury po podaniu zasilania
> przez jakiś czas ustalając temperaturę pokazuje "głupoty"
> oraz pod czas komunikacji z DS1820 nie wyświetla temperatury.
> Jeżeli można to chciałbym dołożyć drugi DS1820 i jakiś przycisk wyboru.
> Procesor może być inny np: PIC (odpadanie dodatkowo kwarc) byle był tani.
>
>
http://www.kmitl.ac.th/~kswichit%20/...avrthermo.htmlSzczerze mówiąc nie wiem czy nie łatwiej byłoby w Twoim przypadku kupić
gotowy termometr w sklepie. Nie sądzę, żebyś znalazł na tej grupie
jakiegoś, za przeproszeniem, łosia, który przeanalizuje cały program,
zbuduje prototyp i będzie szukał błędu. Ew. Znajdź inną stronę z
realizacją podobnego projektu.
--
__ ___ * Pozdrawiam * ____
\ \ / (_)_ _ _ _ ___ |__ | mailto://rot13.ivehf_7@b2.cy/
\ V /| | '_| || (_-< ___ / /
http://www.b3d.pl/\_/ |_|_| \_,_/__/|___|/_/ gg://2812776/
William - 27-12-2006 08:45
> Szczerze mówiąc nie wiem czy nie łatwiej byłoby w Twoim przypadku kupić
> gotowy termometr w sklepie. Nie sądzę, żebyś znalazł na tej grupie
> jakiegoś, za przeproszeniem, łosia, który przeanalizuje cały program,
> zbuduje prototyp i będzie szukał błędu. Ew. Znajdź inną stronę z
> realizacją podobnego projektu.
>
Nie mówiąc już tylko o tym, że pan Wichit zastrzegł sobie prawa autorski
e do kodu i nie można go tak bez jego zgody modyfikować.
Adam Brzostek - 27-12-2006 16:45
to nparawde nie jest nic skomplikowanego
nidawno zrobilem termometr na DS1820 tylko ze program napisalem w
BASCOM'ie - nawet wnecie przykładów strasznie duzo samej obslugi termometru
czy wyswietlania multipleksowego..
wystarczy troche poszukac..
pozdr.
Adam Brzostek
zanotowane.pldoc.pisz.plpdf.pisz.plkonstruktor.keep.pl