Wątek przeniesiony 2018-11-08 11:33 z Newbie przez Marooned.

Odczyt 64 bitowego ROM ID

0

Witam,

Chciałbym odczytać z czujnika DS18b20 tzw. 64 bitowy ROM ID. Napisałem taki kawałek kodu ale zamiast konkretnych wartości dostaje jakieś krzaki.

#include <avr/io.h>
#include <stdlib.h>
#include <util/delay.h>
#include "HD44780.h"
#include "ds18s20.h"


    int main(void)
    {
    	unsigned char rom[8]; //tablica do przechowywania seriala
    	unsigned char i;
		LCD_Initalize();
	    LCD_Clear();
	    LCD_WriteText("Odczyt kodu ROM");
	    _delay_ms(1000);
	    LCD_Clear();


	while(1)
	{
			RESET_PULSE();
			send_byte(0x33); // READ ROM
			for (i=0;i<8;i++)
			{
				rom[i] = read_byte();

			}

			for (i=0;i<8;i++)
			{
				LCD_Clear();

				LCD_WriteData(rom[i]);
				_delay_ms(2000);
			}

	}
	return 0;
    }
unsigned char read_byte(void)
{
	unsigned char i, wartosc = 0;

	for (i=0;i<8;i++)
	{
		CLEAR_1wire;
		_delay_us(2);
		SET_1wire;
		_delay_us(12);
		wartosc >>= 1;
		if (IN_DQ) wartosc |= 0x80;
		_delay_us(100);
	}
	return(wartosc); //zwrot wartosci do funcji
}

void LCD_WriteData(unsigned char dataToWrite)
{
LCD_RS_PORT |= LCD_RS;
_LCD_Write(dataToWrite);
}

void _LCD_Write(unsigned char dataToWrite)
{
LCD_DB4_DIR |= LCD_DB4;
LCD_DB5_DIR |= LCD_DB5;
LCD_DB6_DIR |= LCD_DB6;
LCD_DB7_DIR |= LCD_DB7;

LCD_RW_PORT &= ~LCD_RW;
LCD_E_PORT |= LCD_E;
_LCD_OutNibble(dataToWrite >> 4);
LCD_E_PORT &= ~LCD_E;
LCD_E_PORT |= LCD_E;
_LCD_OutNibble(dataToWrite);
LCD_E_PORT &= ~LCD_E;
while(LCD_ReadStatus()&0x80);
}
 

Dziwne bo funkcja read_byte zwraca unsigned char natomiast LCD_WriteData przyjmuje taką samą wartość, więc nie ma niezgodności typów. Może w niewłaściwy sposób doczytuje zawartość ROM Code z czujnika??

Pozdr.
Kuba

0

Używasz poszczególnych bajtów odczytanych z tego czujnika jako znaków. Na pewno chcesz je interpretować jako znaki, a nie liczbę?

0

a typ danych unsigned char nie przechowuje liczby z zakresu od 0 do 255? W związku z tym myślałem, że jako wynik otrzymam właśnie liczby z takiego zakresu.

0

Chyba nie rozumiesz, o co chodzi.
Zapisz sobie np.liczbę 12345678 binarnie: 101111000110000101001110
Jeżeli teraz to wpakujesz po osiem bitów do tablicy char, otrzymasz coś w stylu:
10111100, 01100001, 01001110
Co w ASCII byłoby:
10111100 = 188 = coś spoza zakresu
01100001 = 97 = a
01001110 = 78 = N
I nagle z 12345678 mamy #aN (z tym, że zamiast hasha, coś innego :P).
Aby wyświetlić liczbę w systemie dziesiętnym (zamienić ją na czytelny ciąg znaków), nie należy jej rzutować na char[], a skorzystać z dzielenia i operacji modulo.

1 użytkowników online, w tym zalogowanych: 0, gości: 1