Elektroda.pl
Elektroda.pl
X
CControls
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

O co tu chodzi? Bascom AVR Atmega8 DS18b20

Electix 01 Wrz 2006 22:17 3582 2
  • #1 01 Wrz 2006 22:17
    Electix
    Poziom 20  

    Witam!
    Od kilku dni nie mogę poradzić sobie z takim dziwnym problemem. Zbudowałem system z ATmega8 z podpiętym do niego (poprzez TWI) PCF8583 (generuje przerwanie na INT0 co 1s), do systemu dołączony jest wyświetlacz LCD 2x16 oraz poprzez 1-Wire (portd.0) czujnik DS18B20.
    System działa poprawnie, nie ma wad sprzętowych, wyświetlacz działa, RTS działa, komunikacja TWI działa i 1-Wire tez. Nie rozumiem tylko takiego czegoś. Gdy zaprogramuje mikrokontroler tym programem (Bascom - AVR 1.11.7.7) wszystko działa jak należy i nie ma co sie przyczepić:

    Code:

    '***Dyrektywy dla kompilatora***

    $regfile = "m8def.dat"
    $lib "I2C_TWI.LBX"
    $crystal = 8000000

    '***Instrukcje konfiguraji peryferiow***
    '***LCD***
    Config Lcdbus = 4
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portb.2 , Rs = Portb.1
    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32

    '***TWI***
    Config Scl = Portc.5
    Config Sda = Portc.4
    Config Twi = 100000
    I2cinit
    '***1wire***
    Config 1wire = Portd.0
    '***PORT***
    Config Portd = &B00000011
    Portd = &B11111111
    '***INT***
    Config Int0 = Falling
    Enable Interrupts
    Enable Int0

    On Int0 Clk

    Dim Odczyt(2) As Byte
    Dim T As Integer
    Dim T1 As Single
    Dim Text As String * 10

    Cursor Off
    Cls
    Do
    Loop
    End


    Clk:
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    Odczyt(1) = 1wread(2)
    T = Odczyt(2)
    Shift T , Left , 8
    T = T + Odczyt(1)
    T1 = T / 16
    Cls
    Cursor Off
    Text = Fusing(t1 , "#.#")
    Lcd "T=" ; Text ; Chr(0) ; "C"
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Return


    wszystko ładnie się wyświetla a termometr pokazuje temperaturę jak należy. No ale chcę rozbudować program i podzielić ten blok na kilka procedur i wykorzystywać je w innych częściach programu. Ale gdy zaczynam dzielić to na procedury np. tak:
    Code:

    '***Dyrektywy dla kompilatora***

    $regfile = "m8def.dat"
    $lib "I2C_TWI.LBX"
    $crystal = 8000000

    '***Instrukcje konfiguraji peryferiow***
    '***LCD***
    Config Lcdbus = 4
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portb.2 , Rs = Portb.1
    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32

    '***TWI***
    Config Scl = Portc.5
    Config Sda = Portc.4
    Config Twi = 100000
    I2cinit
    '***1wire***
    Config 1wire = Portd.0
    '***PORT***
    Config Portd = &B00000011
    Portd = &B11111111
    '***INT***
    Config Int0 = Falling
    Enable Interrupts
    Enable Int0

    On Int0 Clk

    Declare Sub Readt

    Dim Odczyt(2) As Byte
    Dim T As Integer
    Dim T1 As Single
    Dim Text As String * 10

    Cursor Off
    Cls
    Do
    Loop
    End

    Sub Readt:
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    Odczyt(1) = 1wread(2)
    T = Odczyt(2)
    Shift T , Left , 8
    T = T + Odczyt(1)
    T1 = T / 16
    Cls
    Cursor Off
    Text = Fusing(t1 , "#.#")
    Lcd "T=" ; Text ; Chr(0) ; "C"
    End Sub

    Clk:
    Call Readt
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Return

    Pomiar temperatury juz nie działa jak przedtem i pokazuje 0C, nawet jak tę procedurę zamienię na podprogram, to też nie chce to działać prawidłowo. I już nie wiem o co chodzi. Bo przykładowy program z MCS Electronics jest rozbity na procedury, funkcje itd i działa. Może problemem jest wywołanie pomiaru z przerwania? Sam już nie wiem, w którym kierunku mam pójść. Może ktoś z bardziej doświadczonych kolegów zasugerowałby mi jakieś modyfikacje, może znajdzie błędy w moim programie, za co z góry dziękuję i POZDRAWIAM!!

    0 2
  • CControls
  • #2 02 Wrz 2006 00:05
    maniio
    Poziom 14  

    powiem ci ze dziwne te twoje programy, nie zebym sie znal na tym jakos specjalnie, ale mnie uczono tak:

    w przerwanie wchodz na chwilke i jak najszybciej je opuszczaj!

    wedlug tej zasady wydaje mi sie bardziej racjonalne zrobienie programu tak by petla glowna programu byla uruchamiana co 1sekunde, w petli glownej rob wszystkie przeliczenie razem z pomiarem z DS, po co do pomiaru DS1820 korzystac z przerwan:/

    0
  • CControls
  • #3 02 Wrz 2006 00:33
    Electix
    Poziom 20  

    To ma być sterownik ogrzewania i docelowo ma obsługiwać większą liczbę czujników, z tego względu zależy mi na tym aby to przerwanie inicjowało konwersję temperatury. Nie chcę programu głównego zatrzymywać na czas oczekiwania na konwersje, a w pętli głównej chcę umieścić jeszcze kilka innych zadań jakie ma spełniać układ. Zdziwiło mnie tylko zachowanie samego programu. Np podobnie zrealizowany odczyt czasu z PCF8583 działa i nic się nie sypie... Posiedzę troche nad tym i może wymyślę inny sposób.

    0