ADC megszakításban, LCD kezelés és hőmérés....

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

Hozzászólás Szerző: tetye »

Ü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!
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

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.
8)
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
:?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

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!
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

Hozzászólás Szerző: tetye »

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.

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
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

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!
8O

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

8)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Megszakításban LCD kezelés??????

CLS - 90 msec
LCD w - 5-15 msec!


Csodálkozom, hogy fut egyáltalán...... :twisted:
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

Hozzászólás Szerző: tetye »

Köszi!
Jó lett, működik.
Olvasni olvasok csak vannak dolgok amiket nem értek, de ott nem kiugrani akartam hanem kilépni belőle .
Robi tépni fogod a hajad, de még igazából egy waitms 500 is került bele...
:lol:
ÉÉs fut :D
Nem tudom máshogy megoldani sajnos.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Megszakításban???

Hát, azért ne nagyon reklámozd és tagadd le hogy Te írtad a forráskódot :) ...
Válasz küldése