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

Odczyt 64 bitowego ROM ID

Odpowiedz Nowy wątek
2013-12-11 12:34
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


Pozdr.
JN

Pozostało 580 znaków

2013-12-11 14:06
0

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


I fart u die.

Pozostało 580 znaków

2013-12-11 14:29
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.


Pozdr.
JN
edytowany 1x, ostatnio: shady, 2013-12-11 14:30

Pozostało 580 znaków

2013-12-11 15:06
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.


edytowany 5x, ostatnio: Patryk27, 2013-12-11 15:08

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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