PDA

Επιστροφή στο Forum : AVR cv mega8515 με ds18b20 problem...



axel
01-07-07, 23:00
καλησπέρα σε όλους!
βρήκα στο ιντερνετ τον παρακάτω κώδικα για να παίξει η lcd με τον 18b20 αισθητήρα θερμοκρασίας στον mega8515.
ενώ φαίνεται να δουλεύει ο κώδικάς στο τελευταίο σημείο που είναι για να εμφανίσει την θερμοκρασία,δεν παιζει...
εχει δοκιμασει κανεις τπτ αντιστοιχο?


/* Multipoint thermometer with LCD display
using the Maxim DS18B20
1 Wire bus temperature sensors

CodeVisionAVR C Compiler
(C) 2000-2005 HP InfoTech S.R.L.
www.hpinfotech.ro

Chip: ATmega8515
Memory Model: SMALL
Data Stack Size: 128 bytes

THE ATmega8515 CLOCK FREQUENCY MUST BE 3.6864 MHz

The DS18B20 sensors are connected to
bit 6 of PORTA of the ATmega8515 as follows:

[DS18B20] [STK500 PORTA HEADER]
1 GND - 9 GND
2 DQ - 7 PA6
3 VDD - 10 +5V

All the temperature sensors must be connected
in parallel

AN 4.7k PULLUP RESISTOR MUST BE CONNECTED
BETWEEN DQ (PA6) AND +5V !
*/
#asm
.equ __w1_port=0x1b
.equ __w1_bit=6
#endasm

/* Use an 2x16 alphanumeric LCD connected
to PORTC as follows:

[LCD] [STK500 PORTC HEADER]
1 GND- 9 GND
2 +5V- 10 VCC
3 VLC- LCD contrast control voltage 0..1V
4 RS - 1 PC0
5 RD - 2 PC1
6 EN - 3 PC2
11 D4 - 5 PC4
12 D5 - 6 PC5
13 D6 - 7 PC6
14 D7 - 8 PC7
*/

#asm
.equ __lcd_port=0x15
#endasm

#include <lcd> // LCD driver routines
#include <ds18b20>
#include <delay>
#include <stdio>

char lcd_buffer&#91;33&#93;;

/* maximum number of DS18B20 connected to the 1 Wire bus */
#define MAX_DEVICES 8

/* DS18B20 devices ROM code storage area */
unsigned char rom_code&#91;MAX_DEVICES&#93;&#91;9&#93;;

main&#40;&#41;
&#123;
unsigned char i,j,devices;

lcd_init&#40;16&#41;;
lcd_putsf&#40;"CodeVisionAVR\n1 Wire Bus Demo"&#41;;
delay_ms&#40;2000&#41;;
lcd_clear&#40;&#41;;

/* detect how many DS18B20 devices
are connected to the 1 Wire bus */
devices=w1_search&#40;0xf0,rom_code&#41;;
sprintf&#40;lcd_buffer,"%u DS18B20\nDevice detected",devices&#41;;
lcd_puts&#40;lcd_buffer&#41;;
delay_ms&#40;2000&#41;;

/* display the ROM codes for each device */
if &#40;devices&#41;
&#123;
for &#40;i=0;i<devices;i++&#41;
&#123;
sprintf&#40;lcd_buffer,"Device #%u ROM\nCode is&#58;",i+1&#41;;
lcd_clear&#40;&#41;;
lcd_puts&#40;lcd_buffer&#41;;
delay_ms&#40;2000&#41;;
lcd_clear&#40;&#41;;
for &#40;j=0;j<8;j++&#41;
&#123;
sprintf&#40;lcd_buffer,"%02X ",rom_code&#91;i&#93;&#91;j&#93;&#41;;
lcd_puts&#40;lcd_buffer&#41;;
if &#40;j==3&#41; lcd_gotoxy&#40;0,1&#41;;
&#125;;
delay_ms&#40;5000&#41;;
&#125;;
&#125;
else
while &#40;1&#41;; /* stop here if no devices were found */

/* configure each DS18B20 device for 12 bit temperature
measurement resolution */
for &#40;i=0;i<devices;&#41;
if &#40;!ds18b20_init&#40;&rom_code&#91;i++&#93;&#91;0&#93;,20,30,DS18B20_12BIT_RES&#41;&#41;
&#123;
sprintf&#40;lcd_buffer,"Init error for\ndevice #%u",i&#41;;
lcd_clear&#40;&#41;;
lcd_puts&#40;lcd_buffer&#41;;
while &#40;1&#41;; /* stop here if init error */
&#125;;

/* measure and display the temperature&#40;s&#41; */
while &#40;1&#41;
&#123;
j=1;
for &#40;i=0;i<devices;i++&#41;
&#123;
sprintf&#40;lcd_buffer,"t%u=%+.3f\xdfC",j++,ds18b20_temperature&#40;&rom_code&#91;i&#93;&#91;0&#93;&#41;&#41;; //pisteuw pws kati edw den paei kala
lcd_clear&#40;&#41;;
lcd_puts&#40;lcd_buffer&#41;;
delay_ms&#40;500&#41;;
&#125;;
&#125;;
&#125;

th_shak
02-07-07, 11:24
Δοκίμασε αυτό:

int temp;

for (i=0;i
{
temp=ds1820_temperature_10(&rom_code[i,0]);
sprintf(lcd_buffer,“t%u=%i.%u\xdfC”,++j,temp/10,abs(temp%10));
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(500);
};

http://www.e-dsp.com/how-to-measure-temperature-with-the-dallas-maxim-ds1820-sensor/

axel
04-07-07, 12:14
th_shak
με μια παραλαγή δουλεψε εν μέρη ο παραπανω κώδικας που μου έστειλες.αυτούσιος δεν μου εβγαζε σωστα την θερμοκρασία
(έβγαζε t1=3,3C)και τα δεκαδικα μέρη άλλαζαν σύμφωνα με τα ακέραια δηλ. 3,3 4,4 5,5.Το κατάφερα να μου βγάζει το ακέραιο μέρος,αλλά το δεκαδικό δεν εμφανίζεται. π.χ. 33,34,35

η παραλλαγή που έκανα είναι η εξής

int temp;

for (i=0;i
{
temp=ds18b20_temperature(&rom_code[i,0]);
sprintf(lcd_buffer,“t%u=%i.\xdfC”,++j,temp); //kanonika den eprepe na einai float ???me f poy ebala den paizei
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(500);
};