Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Bascom][AVR] Odczyt z MAX6675

crazy_phisic 27 Feb 2008 07:23 7636 7
  • #1
    crazy_phisic
    VIP Meritorious for electroda.pl
    Code:
    Spiin Wart , 1

    Dlaczego czytasz tylko jeden bajt danych?
  • #2
    User removed account
    User removed account  
  • #3
    elektryk
    Level 42  
    opaluch wrote:
    Chyba że należy połączyć odczytane bity bądź wyłuskać z nich jakieś dane.
    Chyba trzeba zajrzeć do datasheeta, choćby na stronę 6.
  • #4
    User removed account
    User removed account  
  • Helpful post
    #5
    cyberdar
    Level 31  
    Witam

    Sprawa prosta. Rozwiązać problem można na kilka sposobów. Ja robiłem tablicę 16-to elementową i w pętli z każdym zboczem sygnału zegarowego wpisywałem wartość do tablicy. Po odczytaniu 16 bitów czytałem te komórki, które mnie interesowały i sumowałem wynik z odpowiednimi wagami bitów. Poglądowy program poniżej.

    Code:


    Config Pinx.x : Clk alias Portx.x : Clk = 0
    Config Pinx.x : Cs alias Portx.x : Cs = 1
    Config Pinx.x : Da alias Pinx.x

    Dim Tablica(16) As Byte
    Dim Wynik As Word
    Dim Licznik_1 As Byte
    Dim Waga As Word

    Do

    Cs = 0
    Licznik_1=1

    Do
    Tablica(Licznik_1) = Da
    Clk = 1
    Waitus 10
    Clk = 0
    Waitus 10
    Incr licznik_1
    Loop Until Licznik_1 = 17

    Cs = 1

    Wynik = 0
    Licznik_1 = 5
    Waga = 1

    Do
    If Tablica(Licznik_1) = 1 then Wynik = Wynik + Waga
    Waga = Waga * 2
    Incr Licznik_1
    Loop Until Licznik_1 = 15

    Lcd Wynik
    Waitms 250

    Loop



    Program oblicza tylko całkowitą temperaturę. Jeśli chcesz mieć rozdzielczość lepszą niż 1°C to musisz uwzględnić także bity 3 i 4 z odpowiednimi wagami. Zmienna wynik nie może być wtedy typu word a single. Możesz podciągnąć piny CLK i CS rezystorami do plusa zasilania.
    Instrukcja SPI wykorzystana do odczytu to chyba chybiony pomysł. Generalnie jestem zwolennikiem pisania wszelkich protokołów na piechotę nawet z poziomu BASCOMa. Jakiś taki uraz mi został po próbach z MAXem132.
    --
    pozdrawiam
  • Helpful post
    #6
    bury104
    Level 13  
    Po co się męczyć to tylko kilka linijek w bascomie:

    Kod archaiczny dla słabeuszy:

    $regfile = "m128def.dat"
    $crystal = 8000000

    Config Spi = Soft , Din = Pinf.2 , Dout = Portf.0 , Ss = None , Clock = Portf.6

    Config Lcd = 16 * 2

    Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Porta.3 , Rs = Porta.2

    Config Pinf.6 = Output : Config Pinf.4 = Output : Config Pinf.2 = Input

    Cursor Off

    Dim Dat1 As Single
    Dim Temp As Word

    cs1 Alias Portf.4
    sck1 Alias Portf.6
    sout1 Alias Pinf.2

    'Inicjowanie wstępne max6675
    cs1 = 1 : sck1 = 1 : sout1 = 0
    cs1 = 1 : sck1 = 0 : sout1 = 1

    'PENTLA GŁÓWNA

    Do
    Cls

    cs1 = 0 'cs stan niski
    Shiftin sout1 , sck1 , Temp , 0 , 16 'pobiera dane z max6675
    cs1 = 1 ‘cs wysoki stan koniec odczytu, początek nowej konwersji
    Shift Temp, Right, 2 'pozbywanie smieci D2-D0
    Dat1 = Temp : Dat1= Dat1/4 ‘ tu nie tracimy części ułamkowej
    Lcd "Temp:= " ; Dat1 ‘ wyświetlamy prawdziwą wartość
    Wait 1
    Cls
    Loop
    End



    Układ max6675 jest banalnie prosty w obsłudze.

    PZD!!!

    :D
  • Helpful post
    #7
    mdcs
    VIP Meritorious for electroda.pl
    Koledzy...kopiujecie kody znalezione w necie i nawet nie wiecie, że zawierają błędy.
    Wystarczy sięgnąć do noty katalogowej MAXa i wszystko jest jasne.
    Po pierwsze nie ma konieczności żadnej wstępnej inicjalizacji układu. Po ustawieniu CS w stan niski można od razu zrzucać dane SO. Wciągamy 16 bitów, z czego pierwszy jest pusty, drugi to device id, trzeci informuje czy obwód termopary jest otwarty czy termopara jest podpięta...a od 4 go 16go mamy 12 bitów danych. Stąd sczytany ciąg przesuwamy o 3 miejsca instrukcją shift. Jeśli nie potrzebna nam dokładność do 0.25 stopnia, po prostu dzielimy wynik przez 4.
    Poza tym dawanie istrukcji CLS w pętli skutkuje miganiem wyświetlacza przy każdym odświeżaniu wyniku.

    Zamieszczam przykładowy kod, który napisałem. Działa bezbłędnie. Przykład jak widać dotyczy ATmega8, ale różnice będą żadne.

    Code:
    $regfile = "m8def.dat"
    

    Config Spi = Soft , Din = Pinc.2 , Dout = Portc.3 , Ss = None , Clock = Portc.4
    Cursor Off
    Config Pinc.4 = Output
    Config Pinc.3 = Output
    Config Pinc.2 = Input
    Sck Alias Portc.4
    Cs Alias Portc.3
    So Alias Pinc.2
    Dim Maxdata As Word
    Cs = 1
    Sck = 0
    Portc.2 = 1
    Cls
    Lcd "Temp "

    Do
      Cs = 0
      Shiftin So , Sck , Maxdata , 0 , 16
      Cs = 1
      Shift Maxdata , Right , 3
      Maxdata = Maxdata / 4
      Locate 1 , 6
      lcd Maxdata; "   "
      Waitms 800
      Loop

    End
  • #8
    gdkj
    Level 26  
    Temat z zeszłego roku ale mogę napisać że coś mi pomógł, ten ostatni kod podany przez kolegę po niewielkich modyfikacjach działa mi na dwóch maxach 31855 :)

    Pozdrawiam.