ADC megszakításban, LCD kezelés és hőmérés....
Üdv.!
Csinálok egy termosztátot. 2x16-os lcd re ír ki sok információt 3mp es bontásban, kb 5 lépésben és ebből egy lépés amikor a mért, és a kívánt hőmérsékletet írja ki.
Ott akadtam el vele hogy amikor az ADC-n lévő potival állítom a kívánt hőmérsékletet, ugye azt csak kb 12mp el később méri meg és csak akkor írja ki amikor már lehet hogy 10 fokkal odébb tekertem és így nehéz lenne beállítani.
Azt hogy lehetne megoldani hogy az ADC amikor változok az érték akkor generáljon egy megszakítást és írja ki az lcdre azonnal majd ugye térjen vissza abba rutinba ahol írkálja az lcd az adatokat.
Olyat lehet hogy egy timerban vagy nem tudom miben, ami a háttérben fut csekkolná az ADC-t és amikor változik csinál egy megszakítást?
Köszi!
Csinálok egy termosztátot. 2x16-os lcd re ír ki sok információt 3mp es bontásban, kb 5 lépésben és ebből egy lépés amikor a mért, és a kívánt hőmérsékletet írja ki.
Ott akadtam el vele hogy amikor az ADC-n lévő potival állítom a kívánt hőmérsékletet, ugye azt csak kb 12mp el később méri meg és csak akkor írja ki amikor már lehet hogy 10 fokkal odébb tekertem és így nehéz lenne beállítani.
Azt hogy lehetne megoldani hogy az ADC amikor változok az érték akkor generáljon egy megszakítást és írja ki az lcdre azonnal majd ugye térjen vissza abba rutinba ahol írkálja az lcd az adatokat.
Olyat lehet hogy egy timerban vagy nem tudom miben, ami a háttérben fut csekkolná az ADC-t és amikor változik csinál egy megszakítást?
Köszi!
SW-es megszakításról én nem tudok!
De olyat eltudok képzelni, hogy:
Egy kimenetet visszakötsz egy megszakítás bemenetre!
És Timer rutinban feltételesen birizgálod az aktuális kimenetet.

Másik SW lehetősé, mikor nem kel Letiltod, hogy ne zavarjon.
Mikor kel, pedig Engedélyezed a megszakítást
Mondjuk kicsit bonyolult, meg felesleges!
Akár rögtön Timerből kiírhatnád a változást

De olyat eltudok képzelni, hogy:
Egy kimenetet visszakötsz egy megszakítás bemenetre!
És Timer rutinban feltételesen birizgálod az aktuális kimenetet.
Másik SW lehetősé, mikor nem kel Letiltod, hogy ne zavarjon.
Mikor kel, pedig Engedélyezed a megszakítást
Mondjuk kicsit bonyolult, meg felesleges!
Akár rögtön Timerből kiírhatnád a változást
ADC mérés
if régiérték <> újérték then
disable interrupts 'ezutan sorbaallitas van
LCDre adatfrissítés
enable interrupts
endif
Amúgy tipp:
ADC lefutása (végén) tud INT-et generálni!
A bascom samples alatt van is rá minta.
De ez ágyú+veréb esete....
Mi van, ha a főprogramodban nem wait 1 ill wait 3 van, hanem
for i = 1 to 12 '3 sec
waitms 250
getadc(ch)
if regiertek <> ujertek then
kiiro-rutin
endif
next i
Szerintem a Timer felesleges ide...
Fontops: Az ADC bizonytalansaga miatt a valtozast csak akkor tekintsd ervenyesnek, ha a mert ertek +/- 5..10-l ter el az eredeti beallitottol!
if régiérték <> újérték then
disable interrupts 'ezutan sorbaallitas van
LCDre adatfrissítés
enable interrupts
endif
Amúgy tipp:
ADC lefutása (végén) tud INT-et generálni!
A bascom samples alatt van is rá minta.
De ez ágyú+veréb esete....
Mi van, ha a főprogramodban nem wait 1 ill wait 3 van, hanem
for i = 1 to 12 '3 sec
waitms 250
getadc(ch)
if regiertek <> ujertek then
kiiro-rutin
endif
next i
Szerintem a Timer felesleges ide...
Fontops: Az ADC bizonytalansaga miatt a valtozast csak akkor tekintsd ervenyesnek, ha a mert ertek +/- 5..10-l ter el az eredeti beallitottol!
Próbáltam a adc megszakítást, de folyton megszakított nem tudott futni a progi nem csak a változásra generált megszakítást.
Így maradtam a timernél, de ezzel működik rendesen valamiért.
Rá néznétek ?
Ezzel is össze-vissza szakítgat meg.
Így maradtam a timernél, de ezzel működik rendesen valamiért.
Rá néznétek ?
Ezzel is össze-vissza szakítgat meg.
Kód: Egész kijelölése
$regfile = "m168def.dat"
$crystal = 8000000
'$baud = 9600
'1WIRE
Config 1wire = Portb.2
Dim Dsid(8) As Byte
Declare Function Decigrades(byval Sc(9) As Byte) As Integer
Declare Sub Dsidbetolt
Declare Sub Init
Declare Sub Init1
Declare Sub Main
Declare Sub Init2
Declare Sub Init3
Declare Sub Convallt
Declare Sub Adcdata
Declare Sub Kiiras
Declare Sub Valasztas
Declare Sub On_ovf1
Dim Min1 As Integer
Dim Max1 As Integer
Dim Min2 As Integer
Dim Max2 As Integer
Dim Min3 As Integer
Dim Max3 As Integer
Dim Temp1 As Integer
Dim Temp2 As Integer
Dim Temp3 As Integer
Dim Sc(9) As Byte
Dim Id1(8) As Byte
Dim Id2(8) As Byte
Dim Id3(8) As Byte
Dim A As Word
Dim Hiba(5) As Byte
A = 1wirecount()
Min1 = 999
Min2 = 999
Min3 = 999
'Timer1 interrupt
Config Timer1 = Timer , Prescale = 64
Enable Timer1
Enable Interrupts
Start Timer1
On Ovf1 On_ovf1
Enable Ovf1
Timer1 = 35000
Dim Old As Integer
Dim Difi As Integer
'LCD
Config Lcdpin = Pin , Db4 = Portb.7 , Db5 = Portb.6 , Db6 = Portd.5 , Db7 = Portd.6 , E = Portd.7 , Rs = Portb.0
Config Lcd = 16 * 2
Bl Alias Portd.4
Config Bl = Output
Reset Bl
Initlcd
Cursor Off
Dim I As Byte
'ADC
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Dim W As Word , Channel As Byte
Dim akarmi As Integer
Channel = 0
Enable Adc
Start Adc
Main:
Do
Call Adcdata
Call Dsidbetolt
Call Convallt
Call Init
Call Valasztas
Call Kiiras
Loop
End
'Hőmérséklet számítása
Function Decigrades(byval Sc(9) As Byte)
Dim Tmp As Byte , T As Integer , T1 As Integer
Tmp = Sc(1) And 1
If Tmp = 1 Then Decr Sc(1)
T = Makeint(sc(1) , Sc(2))
T = T * 50
T = T - 25
T1 = Sc(8) - Sc(7)
T1 = T1 * 100
T1 = T1 / Sc(8)
T = T + T1
Decigrades = T / 100
End Function
'1es szenzor lekérdezése
Sub Init1
1wreset
1wverify Id1(1)
1wwrite , &HBE
Sc(1) = 1wread(9)
Temp1 = 0
If Err = 0 Then
If Sc(9) = Crc8(sc(1) , 8) Then
Temp1 = Decigrades(sc(9))
If Min1 > Temp1 Then Min1 = Temp1
If Max1 < Temp1 Then Max1 = Temp1
Hiba(1) = 00
End If
Else
Hiba(1) = 11
End If
End Sub
'2es szenzor lekérdezése
Sub Init2
1wreset
1wverify Id2(1)
1wwrite , &HBE
Sc(1) = 1wread(9)
Temp2 = 0
If Err = 0 Then
If Sc(9) = Crc8(sc(1) , 8) Then
Temp2 = Decigrades(sc(9))
If Min2 > Temp2 Then Min2 = Temp2
If Max2 < Temp2 Then Max2 = Temp2
Hiba(2) = 00
End If
Else
Hiba(2) = 11
End If
End Sub
'3as szenzor lekérdezése
Sub Init3
1wreset
1wverify Id3(1)
1wwrite , &HBE
Sc(1) = 1wread(9)
Temp3 = 0
If Err = 0 Then
If Sc(9) = Crc8(sc(1) , 8) Then
Temp3 = Decigrades(sc(9))
If Min3 > Temp3 Then Min3 = Temp3
If Max3 < Temp3 Then Max3 = Temp3
Hiba(3) = 00
End If
Else
Hiba(3) = 11
End If
End Sub
'Hőmérőazonosítók betöltése
Sub Dsidbetolt
'lakás 1
Id1(1) = &H10
Id1(2) = &HFB
Id1(3) = &H97
Id1(4) = &H0A
Id1(5) = &H02
Id1(6) = &H08
Id1(7) = &H00
Id1(8) = &HB5
'vegyes 2
Id2(1) = &H10
Id2(2) = &H47
Id2(3) = &HA0
Id2(4) = &H7A
Id2(5) = &H01
Id2(6) = &H08
Id2(7) = &H00
Id2(8) = &H56
'gáz 3
Id3(1) = &H10
Id3(2) = &H47
Id3(3) = &HA0
Id3(4) = &H7A
Id3(5) = &H01
Id3(6) = &H08
Id3(7) = &H00
Id3(8) = &H56
End Sub
'konverzió indítása
Sub Convallt
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 200
End Sub
'Hőmérséklet adatok lekérdezése
Sub Init
Init1
Waitms 200
' Init2
'Waitms 200
' Init3
'Waitms 200
End Sub
'ADC olvasása
Sub Adcdata
W = Getadc(channel)
Akarmi = W / 25 '0-5V 0-40fok
End Sub
Sub Valasztas
If Temp2 > 30 Then
Exit Sub
Else
If Temp1 < Akarmi Then
Exit Sub
Else
End If
End If
End Sub
'Kiiratás LCD-re
Sub Kiiras
If Hiba(1) = 00 Then
Else
Cls
Lcd "Szenzor hiba!"
End If
If Hiba(2) = 00 Then
Else
Cls
Lcd "Szenzor hiba!"
Wait 1
End If
If Hiba(3) = 00 Then
Else
Cls
Lcd "Szenzor hiba!"
End If
For I = 1 To 5
If Hiba(i) = 11 Then
Reset Bl
Wait 1
Exit Sub
Else
Next I
Cls
Lcd " A rendszer: "
Lowerline
Lcd " Uzemkesz ! "
Wait 1
Cls
Lcd "Kivant " ; Akarmi ; Chr(223) ; "C "
Lowerline
Lcd "Mert ho: " ; Temp1 ; Chr(223) ; "C "
Wait 1
Reset Bl
End If
End Sub
On_ovf1:
W = Getadc(0)
Difi = Old - W
Difi = Abs(difi)
If Difi < 10 Then Return
Cls
Lcd W
Old = W
Return
Miért nem olvasol többet?!
Már számtalanszor elmagyaráztam, hogy megszakításból nem szabad kiugrani!!!!!!
És a Bascom is leírja, hogy miért!

Tessék a feltételt vizsgálatot megfordítani!

Már számtalanszor elmagyaráztam, hogy megszakításból nem szabad kiugrani!!!!!!
És a Bascom is leírja, hogy miért!
Tessék a feltételt vizsgálatot megfordítani!
Kód: Egész kijelölése
On_ovf1:
W = Getadc(0)
Difi = Old - W
Difi = Abs(difi)
If Difi > 9 Then
Cls
Lcd W
Old = W
End If
Return