Технический форум

Технический форум (http://www.tehnari.ru/)
-   Форум программистов (http://www.tehnari.ru/f22/)
-   -   ATmega16 и DS1820 (http://www.tehnari.ru/f22/t70937/)

WOLF007 23.03.2012 09:25

ATmega16 и DS1820
 
Решил поюзать сей девайсы но в итоге на дисплее получаю -999 градусов. Компилятор CodeVisionAvr 2
Код:

//#define F_CPU 8000000
#include <mega16.h>
#include <ds1820.h>       
#include <1wire.h>
 
 #asm
      .equ __w1_port=0x18;PORTB
      .equ __w1_bit=0
 #endasm
#include <stdio.h>
#include <lcd.h>
#asm
  .equ __lcd_port=0x1b;PORTA
#endasm

#include <delay.h>
char lcd_buffer[33];
void main(void){
char sign;
int temp;
lcd_init(16);
w1_init();

while(1){
            temp=ds1820_temperature_10(0);
          sign='+';  //читаем температуру
          if (temp>1000){              //если датчик выдаёт больше 1000         
            temp=4096-temp;            //отнимаем от данных 4096
            temp=-temp;                //и ставим знак "минус"
          }
          sprintf(lcd_buffer,"t=%i",temp/10,temp%10);    //записываем масив для экрана температуру
          lcd_clear();                //чистим дисплей перед выводом
          lcd_puts(lcd_buffer);        //выводим масив на LCD
          delay_ms(500);              //ждём 500мс
};
}

Не могу ни как разобраться как получить данные с ds1820

WOLF007 23.03.2012 10:43

Разобрался.
Может кому пригодится
Код:

/********
По поводу портов описаны они в даташите к atmega16
укажу здесь список портов и их 16-ти ричный адрес
PORTA = 0x1b;
PORTA = 0x18;
PORTA = 0x15;
PORTA = 0x12;

********/
#include <mega16.h>  //библиотека нашей atmega16
#include <ds1820.h>  // библиотека температурного датчика ds1820   
#include <1wire.h>  //библиотека шины 1wire
#asm                   
      .equ __w1_port=0x18;PORTB //Порт Б будем использовать для шины
      .equ __w1_bit=0    //пин 0 или PB0
 #endasm
#include <stdio.h> //библиотека ввода-вывода необходима в данном случае для функции sprintf
#include <lcd.h>  //библитека lcd
#asm
  .equ __lcd_port=0x1b;PORTA
#endasm

#include <delay.h>
unsigned char lcd_buffer[33];
void main(void){
char sign;
int temp;
lcd_init(16);
w1_init();
#asm("sei");
while(1){
//char text;
          temp=ds1820_temperature_10(0)/10;
          sign='+';  //читаем температуру
          if (temp>1000){              //если датчик выдаёт больше 1000
            //sign='-';
            //temp=-temp;
           
            temp=4096-temp;            //отнимаем от данных 4096
            temp=-temp;                //и ставим знак "минус"
          }                                       
          sprintf(lcd_buffer,"Temp1: %d\n\r", temp) ;//записуемв масив для экрана температуру и всё такое
          lcd_clear();                //чистим дисплей перед выводом
          lcd_puts(lcd_buffer);        //выводим масив на LCD
          delay_ms(500);              //ждём 500мс
};
}



Часовой пояс GMT +4, время: 19:17.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.