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ć:
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:
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!!
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ć:
'***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:
'***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!!