Daniel_1995 Napisano Luty 26, 2017 Udostępnij Napisano Luty 26, 2017 Witam mam problem ze zmianą rozdzielczości termometru cyfrowego DS18B20 na Arduino nano programowane na rejestrach. Wyszukałem działający kod lecz pozwala on na odczytanie temperatury z dokładnością do 0.5 stopnia chciałbym jednak zmienić rozdzielczość ermomeru na 12 bitów jak można tego dokonać przerabiając poniższy kod, próboawłem wykorzystać funkcję OneWireWriteByte(); jednak się nie udało ponizej kod którego używam: #include <stdio.h> #include <avr/io.h> #include <util/delay.h> #define SET_ONEWIRE_PORT PORTD |= _BV(7) #define CLR_ONEWIRE_PORT PORTD &= ~_BV(7) #define IS_SET_ONEWIRE_PIN PIND & _BV(7) #define SET_OUT_ONEWIRE_DDR DDRD |= _BV(7) #define SET_IN_ONEWIRE_DDR DDRD &= ~_BV(7) int main(void) { /* Zmienna przechowuje aktualną wartość temperatury */ double temp; /* W tablicy zapisywane będą dane odczytane z układu ds18b20 */ unsigned char ds18b20_pad[12]; Serial.begin(9600); while(1) { /* Funkcja 'ds18b20_ConvertT' wysyła do układu ds18b20 polecenie pomiaru */ if(ds18b20_ConvertT()) { /* 750ms - czas konwersji */ _delay_ms(1000); /* Odczyt z układu ds18b20, dane zapisywane są w tablicy ds18b20_pad. Dwie pierwsze pozycje w tablicy to kolejno mniej znaczący bajt i bardziej znaczący bajt wartość zmierzonej temperatury */ ds18b20_Read(ds18b20_pad); /* Składa dwa bajty wyniku pomiaru w całość. Cztery pierwsze bity mniej znaczącego bajtu to część ułamkowa wartości temperatury, więc całość dzielona jest przez 16 */ temp = ((ds18b20_pad[1] << 8) + ds18b20_pad[0]) / 16.0 ; } Serial.println(temp); } } unsigned char ds18b20_ConvertT(void) { if (!OneWireReset()) return 0; OneWireWriteByte(0xcc); // SKIP ROM OneWireWriteByte(0x44); // CONVERT T return -1; } /***********************************************************/ int ds18b20_Read(unsigned char scratchpad[]) { unsigned char i; if (!OneWireReset()) return 0; OneWireWriteByte(0xcc); // SKIP ROM OneWireWriteByte(0xbe); // READ SCRATCHPAD for(i=0; i<12; i++) scratchpad[i] = OneWireReadByte(); return 1; } /***********************************************************/ unsigned char OneWireReset() { CLR_ONEWIRE_PORT; if (!(IS_SET_ONEWIRE_PIN)) return 0; SET_OUT_ONEWIRE_DDR; _delay_us(500); SET_IN_ONEWIRE_DDR; _delay_us(70); if(!(IS_SET_ONEWIRE_PIN)) { _delay_us(500); return(1); } _delay_us(500); return(0); } /**********************************************************/ void OneWireWriteByte(unsigned char byte) { unsigned char i; CLR_ONEWIRE_PORT; for (i=0; i<8; i++) { SET_OUT_ONEWIRE_DDR; if (byte & 0x01) { _delay_us(7); SET_IN_ONEWIRE_DDR; _delay_us(70); } else { _delay_us(70); SET_IN_ONEWIRE_DDR; _delay_us(7); } byte >>= 1; } } /***********************************************************/ unsigned char OneWireReadByte(void) { unsigned char i, byte = 0; SET_IN_ONEWIRE_DDR; for (i=0; i<8; i++) { SET_OUT_ONEWIRE_DDR; _delay_us(7); SET_IN_ONEWIRE_DDR; _delay_us(7); byte >>= 1; if(IS_SET_ONEWIRE_PIN) byte |= 0x80; _delay_us(70); } return byte; } Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!