logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

1-wire, zapis i odczyt danych do DS18B20, same jedynki.

Gieno100 28 Lis 2006 22:22 2381 6
REKLAMA
  • #1 3274107
    Gieno100
    Poziom 10  
    Posty: 55
    Ocena: 5
    Mam problrm z zapisem i odczytem danych do DS18B20. Program wykrywa czujnik jednak po podaniu komend do pomiaru temperatury a następnie odczytaniu danych z DS w zmiennych temp1 i temp2 są same jedynki. W tej postaci na wyświetlaczu mam "Ok11111111"

    Kod programu:


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 3274241
    szod
    Poziom 33  
    Posty: 1663
    Pomógł: 215
    Ocena: 120
    Osobiście piszę w asm więc ten kod nie jest całkowicie jasny dla mnie, ale
    kilka pytań: na jaki to uC? No i podstawa: czy zmieniasz kierunek działania
    końcówki portu? Jak czytasz końcówka portu z DS-em jako wejście a jak
    zapisujesz to jako wyjście. Jakoś tego nie mogę tu wypatrzeć, ale mogę się
    mylić.
  • REKLAMA
  • #3 3274306
    Gieno100
    Poziom 10  
    Posty: 55
    Ocena: 5
    Zamiana funkcji portu reailozowana jest przez:
    #define WIRE_0 sbi(DDR1W, ONEWIRE) // ustaw 0 na wyjscie WIRE
    #define WIRE_1 cbi(DDR1W, ONEWIRE) // ustaw 1 na wyjscie WIRE
    i to działa ponieważ wykrywanie czujnika działa w porządku ale martwi mnie sam zapis komend i odczyt z czujnika czy to jest ok? bo czasy wydają się mi w porządku. Sam już nie wiem.
  • REKLAMA
  • #4 3276713
    szod
    Poziom 33  
    Posty: 1663
    Pomógł: 215
    Ocena: 120
    No fakt, zmieniasz funkcje portu, tylko chyba zapomniałeś że po ustawieniu
    portu na wyjście trzeba ustawić na nim odpowiedni stan - 0 lub 1.
    Masz w kodzie:
    
    #define PORT1W PORTC // port z podlaczanym 1Wire
    

    i nie używasz. Lepiej po ustawieniu portu w stan wyjściowy wymusić
    potrzebny stan niż bazować na tym że tam jest 1 albo 0. To może powodować błędy.
    Popraw te fragmenty kodu. Np. funkcja zapisu
    pojedynczego bitu: Piszesz tam WIRE_0 czyli port w stan wyjściowy, ale
    potem musisz wymusić tam 0. A tego nie ma.
    Druga sprawa to przyjrzyj się tej funkcji zapisu pojedyńczego bitu. Nie
    jestem pewny czy jest ok.
    Poza tym warto chyba zadeklarować konkretną końcówkę portu np. PORTC0
    gdzie jest podłączony czujnik, a nie cały port PORTC.
  • #5 3277527
    Gieno100
    Poziom 10  
    Posty: 55
    Ocena: 5
    Chyba jednak nie masz racji 1 jest wymuszana gdy port przejdzie w stan wejcia przez rezystor podciągający, natomiat w stanie wyjscia jest podawane 0, sprawdzilem to i rzeczywiście po podaniu komendy WIRE_0 i sprawdzeniu stanu szyny 1 WIRE jest na niej 0. A zresztą sprawdzenie czy czujnik jest na szynie przebiega prawidłowo wiec jedynie pętla opóźnień delay moze niedziałać nieprawidłowo.
  • REKLAMA
  • #6 3277759
    szod
    Poziom 33  
    Posty: 1663
    Pomógł: 215
    Ocena: 120
    Chodzi mi o pewność że na określonej końcówce portu po zmianie na
    wyjście jest stan który chcę. Bo robiąc tak jak Ty można się kiedyś
    zdziwić ;) Ja jak piszę to właśnie tak robię, no ale Ty zrobisz jak uważasz.
  • #7 3277974
    Gieno100
    Poziom 10  
    Posty: 55
    Ocena: 5
    I miałem rację problem był z opóźnieniami ponieważ procesor pracuje na 1 Mhz to troszke czasu zajmowaly ykonywane instrukcje. po korekcie czasów wszystko ruszylo.

Podsumowanie tematu

✨ Problem dotyczył zapisu i odczytu danych z czujnika temperatury DS18B20 za pomocą magistrali 1-Wire, gdzie odczytywane wartości temperatury były nieprawidłowe (same jedynki). Kod realizował zmianę kierunku pinu portu mikrokontrolera (uC) między wejściem a wyjściem za pomocą makr WIRE_0 i WIRE_1, co umożliwiało wykrycie czujnika, jednak odczyt danych był błędny. Dyskusja skupiła się na poprawności sterowania linią 1-Wire, w szczególności na konieczności wymuszania stanu logicznego na pinie po zmianie kierunku portu oraz na prawidłowym czasie opóźnień w funkcjach komunikacji. Ostatecznie problem rozwiązano poprzez korektę opóźnień w funkcjach delay, uwzględniając taktowanie procesora 1 MHz, co pozwoliło na poprawne działanie odczytu i zapisu danych do DS18B20.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA