Witam,
mam problem z pomiarem temperatury na MSP430f149 za pomocą układu DS18B20, próbowałem na prawde wielu rzeczy i przeglądalem te forum jednak nic nie pomogło. Moim zdaniem mam problem z czasami i nie jestem pewien czy procedura DelayUs tak na prawde czeka te 1 us, pozatym urzadzenie nie odpowiada w ogole na sygnal presence czyli nie moge go w ogole zainicjalizowac. Prosiłbym o pomoc, porady co jest zle!!! Ponizej zamiesazczam kod programu, ktory ma mi wyspisac na ekranie zawartosc pamieci ROM.
Poprawiłem tytuł:
https://www.elektroda.pl/rtvforum/topic1015361.html
[c_p]
mam problem z pomiarem temperatury na MSP430f149 za pomocą układu DS18B20, próbowałem na prawde wielu rzeczy i przeglądalem te forum jednak nic nie pomogło. Moim zdaniem mam problem z czasami i nie jestem pewien czy procedura DelayUs tak na prawde czeka te 1 us, pozatym urzadzenie nie odpowiada w ogole na sygnal presence czyli nie moge go w ogole zainicjalizowac. Prosiłbym o pomoc, porady co jest zle!!! Ponizej zamiesazczam kod programu, ktory ma mi wyspisac na ekranie zawartosc pamieci ROM.
#include<msp430x14x.h>
#include "lcd.h"
#include "portyLcd.h"
// Port DS18B20
#define DQ_DIR P6DIR
#define DQ_IN P6IN
#define DQ_OUT P6OUT
// Linia DQ na bicie 0
#define DQ BIT0
// polecenia ROM dla DS18B20
#define ReadRom 0x33
#define MatchRom 0x55
#define SearchRom 0xf0
#define AlertSearch 0xec
#define CopyScratchpad 0x48
#define SkipRom 0xcc
#define ReadPower 0xb4
// funckje DS18B20
#define ConvertTemperature 0x44
#define ReadScratchpad 0xbe
#define WriteScratchpad 0x4e
#define RecallE 0xb8
void DelayUs(unsigned int value) {
do {
__no_operation();
__no_operation();
value--;
}while(value>0);
}
//inicjalizacja DS18B20
unsigned char DS_reset(void){
unsigned char gotowy;
DQ_DIR |= DQ; //ustawiamy port na wyjscie
DQ_OUT &= ~DQ; //nastawiamy linie DQ na 0
DelayUs(480); //czekamy 480 us
DQ_OUT |= DQ; //ustawiamy linie DQ na 1
DelayUs(60);//czekamy 60 us
DQ_DIR &= ~DQ; //ustawiamy port na wyjscie
gotowy = DQ_IN & DQ; //zapisujemy stan wejscia
DQ_DIR |= DQ; //ustawiamy port na wyjscie
DelayUs(480); //czekamy 480 us
return gotowy; //gotowy=0 urzadzenie jest podlaczone
}
//wyslanie 1 bitu do DS18B20
void write_bit(unsigned char bit)
{
DQ_DIR |= DQ; //port na wyjscie
DQ_OUT &= ~DQ; //ustawiamy linie DQ na 0
if(bit==1) DQ_OUT |= DQ; //ustawiamy linie DQ na 1
DelayUs(80); //czekamy 100 us
DQ_OUT |= DQ; //ustawiamy linie DQ na 1
}
//czytanie 1 bitu z DS18B20
unsigned char read_bit(void)
{
unsigned char wynik=0;
DQ_DIR |= DQ; //port na wyjscie
DQ_OUT &= ~DQ; //ustawiamy linie DQ na 0
DelayUs(2);
DQ_OUT |= DQ; //ustawiamy linie DQ na 1
DelayUs(15);
DQ_DIR &= ~DQ; //linia na wejscie
wynik = DQ_IN & DQ; //czytamy stan linii DQ
DQ_DIR |= DQ; //port na wyjscie
return wynik;
}
//zapisywanie bajtu do urzadzenia
void write_byte(unsigned char val)
{
unsigned char i;
unsigned char pom;
for (i=0; i<8; i++) // writes byte, one bit at a time
{
pom = val>>i; // shifts val right 'i' spaces
pom &= 0x01; // copy that bit to temp
write_bit(pom); // write bit in temp into
}
DelayUs(70); //czekamy 70us
}
//czytanie bajtu z urzadzenia
unsigned char read_byte(void)
{
unsigned char i;
unsigned char value = 0;
for (i=0;i<8;i++)
{
if(read_bit() == 1)
value|=0x01<<i; // reads byte in, one byte at a time and then
// shifts it left
DelayUs(15); // czekamy 15 us
}
return value;
}
int main( void )
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer to prevent time out reset
InitPortsLcd(); // inicjalizacja portów LCD
InitLCD(); // inicjalizacja LCD
clearDisplay(); // czyszczenie wyświetlacza
unsigned char wynik[8];
int k;
while(1)
{
if(DS_reset()==0)
{
write_byte(ReadRom); //Read ROM
wynik[0]=read_byte();
wynik[1]=read_byte();
wynik[2]=read_byte();
wynik[3]=read_byte();
wynik[4]=read_byte();
wynik[5]=read_byte();
wynik[6]=read_byte();
wynik[7]=read_byte();
for (k=0;k<8;k++) putc(wynik[k]); //wypisuje znak na LCD
}
else printString("nie dziala!");
}
}
Poprawiłem tytuł:
https://www.elektroda.pl/rtvforum/topic1015361.html
[c_p]
