AVR-es áramkörök stabilitása , és megbízhatósága?

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
kefeur
Tranzisztorgyógyász
Hozzászólások: 187
Csatlakozott: 2008. február 17. vasárnap, 7:00

AVR-es áramkörök stabilitása , és megbízhatósága?

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

Sziasztok.
Írtam már több programot ami stabilan működik , de a két utolsó nem lett igazán megbízható.
Van amikor üzemel rendesen a készülék , van amikor a bekapcsolás után már baromságok futnak a kijelzőn össze-vissza!

Adott 1 kis sütő kemence amiben van
:kelesztő -1 hőfokszabályozás
:sütőtér - 1 hőfokszabályozás,gőzölés ,gőzölési idő, sütési idő
Mindez 8 beállítható programban.

Hibajelenség:
-Hihetetlen baromságokat ír a kijelzőre ,ami ráadásul fut rajta jobbra
: nem köthető semmihez hogy mitől.

-Van 1 stopgomb int0- án , kijelzőre írással ,változók nullázásával.
Ide is befut gombnyomás nélkül is! Megjelenik a kijelzőn a stopp felirat majd fut tovább a program ahogy kell.

-Start gomb megnyomásakor indul a gőzölés ,majd egy időzítés ami persze nem mindig indul el.

-Sokszor bekapcsolás után rögtön ráfut a stop megszakításra majd baromságok a kijelzőn , aztán semmi a kijelzőn.

A többit nem is írom le , mert már nagyon bosszant a sok ráköltött pénz amit lehet hogy velem fizettetnek ki.
Itt a kód elég terjedelmes , van benne némi komment is:




Kód: Egész kijelölése

$regfile = "m8def.dat"
$crystal = 4000000

Config Portb = Output

Config Portd.0 = Input
Config Portd.1 = Input
Config Portd.2 = Input
Config Portd.3 = Input
Config Portd.4 = Input
Config Portd.5 = Output
Config Portd.6 = Output
Config Portd.7 = Output

Deflcdchar 0 , 2 , 4 , 14 , 17 , 31 , 16 , 14 , 32          ' é
Deflcdchar 1 , 10 , 10 , 14 , 17 , 17 , 17 , 14 , 32        ' ő
Deflcdchar 2 , 10 , 10 , 32 , 17 , 17 , 17 , 14 , 32        ' ű
Deflcdchar 3 , 2 , 5 , 2 , 32 , 32 , 32 , 32 , 32           ' fok(C)
Deflcdchar 4 , 10 , 32 , 17 , 17 , 17 , 17 , 14 , 32        ' ü
Deflcdchar 5 , 10 , 32 , 14 , 17 , 17 , 17 , 14 , 32        ' ö

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0 , E = Portb.4 , Rs = Portb.5

Config Int0 = Low Level

Config Adc = Single , Prescaler = Auto , Reference = Internal

Config Timer1 = Timer , Prescale = 64


Enable Interrupts
Enable Int0
Start Adc

Ajto Alias Pind.0
Start_sut Alias Pind.1
'Pind.2 = Stopgomb
Prog Alias Pind.3
Setp Alias Pind.4
Gozki Alias Portd.5
Ventillki Alias Portd.6
'Hangki Alias Portd.7
Kemence_fut Alias Portb.6
Keleszto_fut Alias Portb.7

Dim Hokemence As Byte
Dim Hmkemence As Long
Dim Hmkeleszto As Byte
Dim Gozido As Byte
Dim Sutido As Byte
Dim Eltelt_sutido As Byte
Dim Maradekido As Byte
Dim Hoa As Long
Dim Oa As Long
Dim Hob As Long
Dim Ob As Long
Dim Hoal As Long
Dim Hoah As Long
Dim Hobl As Long
Dim Hobh As Long

Dim Kem As Word                                             'eeprom tárhej
Dim Kel As Word                                             'eeprom tárhej
Dim Goz As Word                                             'eeprom tárhej
Dim Sut As Word                                             'eeprom tárhej
Dim His As Byte
Dim Perc As Byte
Dim E As Byte

' jelzőbitek
Dim A As Bit                                                'előfűtés megvolt
Dim B As Bit                                                'sütés
Dim C As Bit                                                'gőz megvolt
Dim D As Bit                                                'sütés kész
Dim F As Bit                                                'programozás
Dim P As Byte                                               'programszám

Enable Timer1
On Int0 Stopgomb
On Timer1 Idoszamlalo
Stop Timer1

Initlcd
Cls
Cursor Off

P = 1

Gosub Beolvas

'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
'*******************************************************************************

Foprog:
If B = 0 Then
 If Prog = 0 Then
  Waitms 200
  P = P + 1
 If P > 8 Then P = 1
 Gosub Beolvas
 End If
End If

'***************************************************
If Setp = 0 Then
 Waitms 500
 If Setp = 0 Then
  Gosub Menu
 End If
End If


Waitms 100
 Cls
If Ajto = 0 Then
 Set Ventillki
End If

 Oa = Getadc(0)
 Hoa = Oa - 180
 Ob = Getadc(1)
 Hob = Ob
'**************************************************
If Hob = Hobh Or Hob > Hobh Then Reset Keleszto_fut
If Hob = Hobl Or Hob < Hobl Then Set Keleszto_fut

'***************************************************
 If A = 0 Then
   If B = 0 Then

  Lcd "   Program:" ; P
  Lowerline
  Lcd "El" ; Chr(1) ; "f" ; Chr(2) ; "t" ; Chr(0) ; "s" ; "  " ; Hoa ; Chr(3) ; "C"

 If Ajto = 0 Then
  If Hoa = Hoal Or Hoa < Hoal Then Set Kemence_fut
  If Hoa = Hoah Or Hoa > Hoah Then
   Reset Kemence_fut
    A = 1
  End If
 End If
'>>>>>>>>>>>>>>>>>>>>
   If Start_sut = 0 Then
    Gosub Beep2
    Cls
    Lcd "Nincs felf" ; Chr(2) ; "tve!"
    Wait 3
   End If
'>>>>>>>>>>>>>>>>>>>>

 End If
   End If
'****************************************************
 If A = 1 Then
  If B = 0 Then

  Lcd "   Program:" ; P ;
  Lowerline
  Lcd "Felf" ; Chr(2) ; "tve" ; "  " ; Hoa ; Chr(3) ; "C"

 If Ajto = 0 Then
  If Hoa = Hoah Or Hoa > Hoah Then Reset Kemence_fut
  If Hoa = Hoal Or Hoa < Hoal Then Set Kemence_fut
 End If

  End If
 End If
'****************************************************
 If Ajto = 1 Then
  Reset Ventillki
  Reset Kemence_fut
  Gosub Ajtonyitva
  Waitms 250
 End If




If A = 1 Then
 If B = 0 Then
  If Start_sut = 0 Then
  Gosub Beep1
   If C = 0 Then
   Cls
   Lcd "   G" ; Chr(1) ; "z" ; Chr(5) ; "l" ; Chr(0) ; "s ! "
    Wait 1
    Set Gozki
    Wait Gozido                                             ' Gozido
    Reset Gozki
    Waitms 500
    Gosub Beep1
    C = 1
   End If
  B = 1
  Timer1 = 0
  Start Timer1
  Eltelt_sutido = 0
  End If
 End If
End If

'****************************************************
If A = 1 Then
 If B = 1 Then

 'If Ajto = 1 Then
  'Reset Ventillki
  'Reset Kemence_fut
  'Gosub Ajtonyitva
  'Waitms 250
 'End If

 Lcd "Program:" ; P ; " " ; Hoa ; Chr(3) ; "C"
  Lowerline
  Lcd "S" ; Chr(4) ; "t" ; Chr(0) ; "s " ; Maradekido ; " perc"

 If Ajto = 0 Then
  If Hoa = Hoah Or Hoa > Hoah Then Reset Kemence_fut
  If Hoa = Hoal Or Hoa < Hoal Then Set Kemence_fut
 End If

 End If
End If

'****************************************************
If B = 1 Then
 If Eltelt_sutido = Sutido Or Eltelt_sutido > Sutido Then
  Stop Timer1
  Timer1 = 0
  Cls
  Lcd "  S" ; Chr(4) ; "t" ; Chr(0) ; "s " ; " k" ; Chr(0) ; "sz !"
  Gosub Beep2
  Wait 1
 End If
End If

 Maradekido = Sutido - Eltelt_sutido
Goto Foprog

'******************************

Menu:
Cls
Lcd "      Menu"
Wait 2

Menuben:

Cls
 If Prog = 0 Then P = P + 1
 If Start_sut = 0 Then P = P - 1
 If P > 9 Then P = 1
 If P < 1 Then P = 9

 If P = 9 Then
  Lcd "    kilepes"
  If Setp = 0 Then
   Return
  End If
 End If

 If P < 9 Then
  Lcd "  program : " ; P
 'End If

   If Setp = 0 Then
    Gosub Beolvas
    Waitms 100
    Gosub Beallit
   End If
 End If



 Waitms 250
 Goto Menuben

'*******************************

Idoszamlalo:
 Stop Timer1
 Timer1 = 0
 Perc = Perc + 1

 If Perc = 60 Then
  Eltelt_sutido = Eltelt_sutido + 1
  Perc = 0
 End If

 Start Timer1

Return

'*******************************

Ajtonyitva:

 Cls
 Lcd "! Nyitott ajto !"
 Waitms 500
'If B = 1 Then
 Gosub Beep2
'End If

Return
'*******************************
Stopgomb:

   Stop Timer1
   Timer1 = 0
   Cls
   Lcd "      stop"
   Gosub Beep2
   Reset Gozki
   B = 0
   C = 0
   D = 0
   Perc = 0
   Eltelt_sutido = 0
   Waitms 250

Return
'******************************

Beolvas:

 Kem = P * 33
 Kel = Kem + 9
 Goz = Kem + 18
 Sut = Kem + 27

 Readeeprom Hokemence , Kem
 Readeeprom Hmkeleszto , Kel
 Readeeprom Gozido , Goz
 Readeeprom Sutido , Sut
 'Readeeprom His , 0
 His = 1
  Hmkemence = Hokemence + 100
 Hoal = Hmkemence - His
 Hoah = Hmkemence + His
 Hobl = Hmkeleszto - His
 Hobh = Hmkeleszto + His

Return
'******************************

Beallit:

   Waitms 250
   Cls
   Lcd "set program" ; P


If F = 0 Then
 If Prog = 0 Then E = E + 1
 If Start_sut = 0 Then E = E - 1
 If E > 5 Then E = 1
 If E < 1 Then E = 5
End If

 Select Case E

 Lowerline
'************************************************xx
 Case 1:

 Lcd "gozoles ido :" ; Gozido

 If F = 0 Then
  If Setp = 0 Then
   F = 1
   Waitms 200
  End If
 End If

 If F = 1 Then
  Cls
  Lcd "set"
  Lowerline
  Lcd "gozoles ido :" ; Gozido

   If Prog = 0 Then Gozido = Gozido + 1
   If Start_sut = 0 Then Gozido = Gozido -1
   If Gozido < 1 Then Gozido = 1
   If Gozido > 20 Then Gozido = 20

    If Setp = 0 Then
     If F = 1 Then
       Writeeeprom Gozido , Goz
       F = 0
       Waitms 200
     End If
    End If

  End If
'*************************************************xx
 Case 2:
 Lcd "sutes ido:" ; Sutido

 If F = 0 Then
  If Setp = 0 Then
   F = 1
   Waitms 200
  End If
 End If

 If F = 1 Then
  Cls
  Lcd "set"
  Lowerline
  Lcd "sutes ido:" ; Sutido

   If Prog = 0 Then Sutido = Sutido + 1
   If Start_sut = 0 Then Sutido = Sutido -1
   If Sutido < 5 Then Sutido = 5
   If Sutido > 60 Then Sutido = 60

    If Setp = 0 Then
     If F = 1 Then
       Writeeeprom Sutido , Sut
       F = 0
       Waitms 200
     End If
    End If

  End If
'*************************************************xx

 Case 3:
 Lcd "sutes hofok:" ; Hmkemence

 If F = 0 Then
  If Setp = 0 Then
   F = 1
   Waitms 200
  End If
 End If

 If F = 1 Then
  Cls
  Lcd "set"
  Lowerline
  Lcd "sutes hofok:" ; Hmkemence

   If Prog = 0 Then Hmkemence = Hmkemence + 1
   If Start_sut = 0 Then Hmkemence = Hmkemence -1
   If Hmkemence < 101 Then Hmkemence = 101
   If Hmkemence > 320 Then Hmkemence = 320

    If Setp = 0 Then
     If F = 1 Then
       Hokemence = Hmkemence - 100
       Writeeeprom Hokemence , Kem
       F = 0
       Waitms 200
     End If
    End If

  End If
'*************************************************xx

 Case 4:
 Lcd "keleszt hofok" ; Hmkeleszto

 If F = 0 Then
  If Setp = 0 Then
   F = 1
   Waitms 200
  End If
 End If

 If F = 1 Then
  Cls
  Lcd "set"
  Lowerline
  Lcd "keleszt hofok" ; Hmkeleszto

   If Prog = 0 Then Hmkeleszto = Hmkeleszto + 1
   If Start_sut = 0 Then Hmkeleszto = Hmkeleszto -1
   If Hmkeleszto < 25 Then Hmkeleszto = 25
   If Hmkeleszto > 33 Then Hmkeleszto = 33

    If Setp = 0 Then
     If F = 1 Then
       Writeeeprom Hmkeleszto , Kel
       F = 0
       Waitms 200
     End If
    End If

  End If
'*************************************************xx

 Case 5:
 Lcd "kilep"
 If Setp = 0 Then
  Cls
  Return
 End If

 End Select

 Goto Beallit

Return


'/*****************************
Beep1:

Sound Portd.7 , 500 , 200

Return
'/*****************************
Beep2:

Sound Portd.7 , 400 , 150
Waitms 300
Sound Portd.7 , 400 , 150

Return
Tisztelettel kérem a hozzáértők segítségét .

Nem tudom a kód rossz-e , vagy a fordítás , vagy mi?
A hozzászólást 1 alkalommal szerkesztették, utoljára kefeur 2009. augusztus 12. szerda, 19:24-kor.
Kefeur
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

A bekapcsolási tranzienesek miatt: external Quartz (ha megoldható) + 64 msec + 4 clk.

Ha ez nem járható, akkor a következők:
- BOD bekapcsolása(2.7V (3v3-as mellett) vagy 4.0V 5V esetén), majd
- bekapcsoláso MCUR (?) reset regiszter kiértékelése
- $HWStack, $SWStack, $Frames élesítése, növelése (~1,5-2xre)
- $initmicro használata(ez a bekapcsoláskor a programfutás _előtti_ inicializálások megoldhatóak. Ebben lehet nyugodtan WAIT is! az összes relé, gomb, egyebek inicializálása itt _is_ történjen meg!

Az LCD táplábára a 100nF kerámiaköndit tessék felrakni.
A processzorlábra szintén.

A táp nem 78056? ekkot a 2x100nF meglesni, hogy ne gerjedjen.

Környékben elektromos fogyasztó nincsen? a földelés tényleg földelés, vagy csak annak mondják?
A klk fémházát a 230V földeléssel _és_ a belső GND-vel is kössed össze!
Lehetőleg a PC lebegő GNDje ne kerüljön ide, ha nem megfelelő a földelés egyébként.

Az INT0-n igaz külső fel/lehúzóellenállás van? (max 4k7 + a gombon 100nF)



A frames, hwstack/sestack tessék jól felnyomni!!!!!
Avatar
kefeur
Tranzisztorgyógyász
Hozzászólások: 187
Csatlakozott: 2008. február 17. vasárnap, 7:00

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

A felhúzó ellenállások 1K mindenhol.
Plc-alap tápról jár + kerámia kondik mindenhol ahol említetted.
A földelés mért , és jó.
A gnd össze van kötve
Lcd-n kondi.

hw-sw stack nem lett állítva, nem is tudom mire való - hogyan lehet meghatározni.
Külső kvarc még nem került rá .
De ha ez segíthet megoldható.

Gyakrabban futás közben kavarodik meg , nem bekapcsoláskor.

A hőmérő részben két áramgenerátor táplálja meg az érzékelőket amik 100 Ohm ill. 1K.
Nem tudom nem e gerjed az áramgenerátor , nincs mivel megnéznem(eltávozott a szkópom).

Bár MCUR initmicro ?
Nem találkoztam ezekkel még.

Köszönöm az ötleteket végigjárom őket.
Kefeur
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Akkor az alap stack fut, az meg tuti kecés. A bascom alatt lsd. a hibakeresés fejezet stcheck utasítása...
Avatar
DOGMAN
Chipgyilok
Hozzászólások: 293
Csatlakozott: 2006. augusztus 27. vasárnap, 6:00

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

hejj mikor én is átléptema proci 80%-át programméretben, és elég nagy változókkal dolgoztam (nokia LCD+menürendszer+grafikus megjelenítés) nekem is hülyeségeket csinált, és a stack növelések megoldották...
Avatar
DOGMAN
Chipgyilok
Hozzászólások: 293
Csatlakozott: 2006. augusztus 27. vasárnap, 6:00

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

Amúgy nem vágom, hogy miért nem lehet a compiler-re bízni a stack beállításokat, hiszen "tudja" mi hol fog működni a memóriakezelés során...vagy nem???
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Nem tudja, mert dinamikusan is kezelhető, és így egybelóghat...
Alapesetben a Bascomban ez normál prgfutásra van optimalizálva (print, input, némi szubrutinkezelés). De a local változók kezelése, egymásból hívogatott szubrutinok kezelésére nem lehet felkészülni, ehhez csak teljes futásteszttel lehetne. ezt tudja a STCheck utasítás, amikoris Te tesztelsz.


Ezért született a Hibakeresés Bascom fejezet.
Avatar
DOGMAN
Chipgyilok
Hozzászólások: 293
Csatlakozott: 2006. augusztus 27. vasárnap, 6:00

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

Robert írta:Ezért született a Hibakeresés Bascom fejezet.
Értem, amúgy már átrágtam magam rajta...
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Hali Kefeur!
Átnéztem a programodat. De mivel 1 sor koment nincsen benne!
Így fogalmam nincs mi miért van úgy ahogy van?
Ezért ami kirívó elvi hibát találtam pl.:
Return előtt elugrasz, így a retunra sosem kerül sor!
End Select
Goto Beallit
Return
Az ilyen hibák mindig verem túllépést szoktak okozni!

Az ilyen megoldásnál „Goto Foprog, Goto Menuben” átláthatóbb jobb a "Do … Loop" ciklus.
8)
Avatar
kefeur
Tranzisztorgyógyász
Hozzászólások: 187
Csatlakozott: 2008. február 17. vasárnap, 7:00

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

Köszönöm kapu48 .
még találtam hibát az általad említetten kívül is.
Kijavítottam őket , nagyjából jól is működik.
Még néha beleszalad az int0-ba , nem tudom miért.
Fellógattam +5v-ra a bemenetet egy darab vezetékkel és még így is.
Néha még futnak a kijelzőn a fura írásjelek is , de aztán helyre áll
az is
Módosítások:.
boden on 4v.
A HW-SW stackot , és a frame size-t növeltem 100 ra.
return kivéve

Lassan kialakul , :)
Köszi az eddigi segítséget!
Kefeur
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

A 100-as stack/frames kevés!
Avatar
kefeur
Tranzisztorgyógyász
Hozzászólások: 187
Csatlakozott: 2008. február 17. vasárnap, 7:00

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

:oops:
Az a baj azt sem értem hogy miért ,és hogyan.
Nem tudom miből gazdálkodhatom.

Ha kérhetném Robert javasolj értékeket légyszives.
Remélem hamar letisztul előttem a kép ezzel kapcsolatban. :x

Itt a kommentezett kód:

Kód: Egész kijelölése

$regfile = "m8def.dat"
$crystal = 4000000

Config Portb = Output

Config Portd.0 = Input
Config Portd.1 = Input
Config Portd.2 = Input
Config Portd.3 = Input
Config Portd.4 = Input
Config Portd.5 = Output
Config Portd.6 = Output
Config Portd.7 = Output

Deflcdchar 0 , 2 , 4 , 14 , 17 , 31 , 16 , 14 , 32          ' é
Deflcdchar 1 , 10 , 10 , 14 , 17 , 17 , 17 , 14 , 32        ' ő
Deflcdchar 2 , 10 , 10 , 32 , 17 , 17 , 17 , 14 , 32        ' ű
Deflcdchar 3 , 2 , 5 , 2 , 32 , 32 , 32 , 32 , 32           ' fok(C)
Deflcdchar 4 , 10 , 32 , 17 , 17 , 17 , 17 , 14 , 32        ' ü
Deflcdchar 5 , 10 , 32 , 14 , 17 , 17 , 17 , 14 , 32        ' ö

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0 , E = Portb.4 , Rs = Portb.5

Config Int0 = Low Level

Config Adc = Single , Prescaler = Auto , Reference = Internal

Config Timer1 = Timer , Prescale = 64


Enable Interrupts
Enable Int0
Start Adc

Ajto Alias Pind.0
Start_sut Alias Pind.1                                      'jobb gomb
'Pind.2 = Stopgomb
Prog Alias Pind.3                                           'bal gomb
Setp Alias Pind.4                                           'rejtett belső gomb
Gozki Alias Portd.5
Ventillki Alias Portd.6
'Hangki Alias Portd.7
Kemence_fut Alias Portb.6
Keleszto_fut Alias Portb.7

Dim Hokemence As Byte                                       'kemence hőfok
Dim Hmkemence As Long                                       'kemence hőfok segéd változó
Dim Hmkeleszto As Byte        'kelesztő hőfok
Dim Gozido As Byte
Dim Sutido As Byte
Dim Eltelt_sutido As Byte
Dim Maradekido As Byte
Dim Hoa As Long                                             'hőfok korrekciók
Dim Hoa1 As Long
Dim Oa As Long
Dim Oa1 As Long
Dim Hob As Long
Dim Ob As Long                                              'idáig
'Dim Ob1 As Long
Dim Hoal As Long                                            'ki-be kapcsolási értékek a hőfokszabályozáshoz
Dim Hoah As Long
Dim Hobl As Long
Dim Hobh As Long

Dim Kem As Word                                             'eeprom tárhej
Dim Kel As Word                                             'eeprom tárhej
Dim Goz As Word                                             'eeprom tárhej
Dim Sut As Word                                             'eeprom tárhej
Dim His As Byte                                             'különbség érték a hőfokszabályozáshoz
Dim Perc As Byte
Dim E As Byte

' jelzőbitek
Dim A As Bit                                                'előfűtés megvolt
Dim B As Bit                                                'sütés
Dim C As Bit                                                'gőz megvolt
Dim D As Bit                                                'sütés kész
Dim F As Bit                                                'programozás
Dim P As Byte                                               'programszám

Enable Timer1
On Int0 Stopgomb
On Timer1 Idoszamlalo
Stop Timer1

Initlcd
Cls
Cursor Off

P = 1

Gosub Beolvas


'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
'*******************************************************************************

Foprog:
If B = 0 Then                                               'ha nincs folyamatban sütés
 If Prog = 0 Then                                           'programléptetés fölfelé
  Waitms 200
  P = P + 1
 If P > 8 Then P = 1
 Gosub Beolvas                                              'a program változóinak beolvasása
 End If
End If

'***************************************************
If Setp = 0 Then                                            'programozási módba belépés
 Waitms 500
 If Setp = 0 Then                                           'ha hosszan van nyomva a gomb
  Gosub Menu
 End If
End If


Waitms 250
 Cls
If Ajto = 0 Then                                            'ha az ajtó zárva
 Set Ventillki                                              'légkeringetés keringetés mehet
End If

 Oa = Getadc(0)                                             'kemence hőfok beolvasás

 Hoa1 = Oa - 180
 Oa1 = Hoa / 3                                              'korrekciók
 Hoa = Hoa1 + Oa1

 Ob = Getadc(1)                                             'kelesztő hőfok beolvasása

 Hob = Ob
'**************************************************
If Hob = Hobh Or Hob > Hobh Then Reset Keleszto_fut         'kelesztő hőfok szabályozása
If Hob = Hobl Or Hob < Hobl Then Set Keleszto_fut           'kelesztő hőfok szabályozása

'***************************************************
 If A = 0 Then                                              'ha még nincs felfűtve
   If B = 0 Then                                            'és nem megy a sütés

  Lcd "    Program:" ; P
  Lowerline
  Lcd " El" ; Chr(1) ; "f" ; Chr(2) ; "t" ; Chr(0) ; "s" ; "  " ; Hoa ; Chr(3) ; "C"       'előfűtés+hőfok

 If Ajto = 0 Then
  If Hoa = Hoal Or Hoa < Hoal Then Set Kemence_fut
  If Hoa = Hoah Or Hoa > Hoah Then
   Reset Kemence_fut
    A = 1
  End If
 End If
'>>>>>>>>>>>>>>>>>>>>
   If Start_sut = 0 Then
    Gosub Beep2
    Cls
    Lcd "Nincs felf" ; Chr(2) ; "tve!"
    Wait 3
   End If
'>>>>>>>>>>>>>>>>>>>>

 End If
   End If
'****************************************************
 If A = 1 Then                                              'ha felfűtött
  If B = 0 Then                                             ' a sütés még nincs indítva

  Lcd "   Program:" ; P ;
  Lowerline
  Lcd "Felf" ; Chr(2) ; "tve" ; "  " ; Hoa ; Chr(3) ; "C"

 If Ajto = 0 Then
  If Hoa = Hoah Or Hoa > Hoah Then Reset Kemence_fut        'kemence hőfok szabályozása
  If Hoa = Hoal Or Hoa < Hoal Then Set Kemence_fut          'kemence hőfok szabályozása
 End If

  End If
 End If
'****************************************************
 If Ajto = 1 Then                                           'nyitott ajtó figyelése
  Reset Ventillki                                           'stop keringető ventillátor
  Reset Kemence_fut                                         'stop kemence fűtés
  Gosub Ajtonyitva                                          'hang és kijelző figyelmeztetés
  Waitms 250
 End If




If A = 1 Then                                               'ha felfűtött a kemence
 If B = 0 Then                                              'de még nincs indítva a sütés
  If Start_sut = 0 Then                                     'ha jobbgomb-sütés indítása
  Gosub Beep1
   If C = 0 Then
   Cls
   Lcd "   G" ; Chr(1) ; "z" ; Chr(5) ; "l" ; Chr(0) ; "s ! "
    Wait 1
    Set Gozki                                               'gőzölés szivattyú be
    Wait Gozido                                             ' Gozido
    Reset Gozki                                             'szivattyú ki
    Waitms 500
    Gosub Beep1
    C = 1
   End If
  B = 1
  Timer1 = 0                                                'sütési idő indul
  Start Timer1
  Eltelt_sutido = 0
  End If
 End If
End If

'****************************************************
If A = 1 Then                                               'ha a kemence felfűtött
 If B = 1 Then                                              'ha a sütés fojamatban

 Lcd "Program:" ; P ; " " ; Hoa ; Chr(3) ; "C"              'programszám + hőfok
  Lowerline
  Lcd "S" ; Chr(4) ; "t" ; Chr(0) ; "s " ; Maradekido ; " perc"

 If Ajto = 0 Then
  If Hoa = Hoah Or Hoa > Hoah Then Reset Kemence_fut        ' kemence hőfok szabályozás
  If Hoa = Hoal Or Hoa < Hoal Then Set Kemence_fut          ' kemence hőfok szabályozás
 End If

 End If
End If

'****************************************************
If B = 1 Then                                               'ha a sütés  fojamatban
 If Eltelt_sutido = Sutido Or Eltelt_sutido > Sutido Then   'sütési idő figyelése
  Stop Timer1
  Timer1 = 0
  Cls
  Lcd "  S" ; Chr(4) ; "t" ; Chr(0) ; "s " ; " k" ; Chr(0) ; "sz !"       'sütés kész
  Gosub Beep2
  Wait 1
 End If
End If

 Maradekido = Sutido - Eltelt_sutido                        'hátra lévő idő számítása
Goto Foprog

'******************************

Menu:
Cls
Lcd "      Menu"
Wait 2

Menuben:

Cls
 If Prog = 0 Then P = P + 1                                 'bal gomb
 If Start_sut = 0 Then P = P - 1                            'jobb gomb
 If P > 9 Then P = 1                                        'programszám
 If P < 1 Then P = 9

 If P = 9 Then                                              'ha kilépés
  Lcd "    kilepes"
  If Setp = 0 Then
   Return
  End If
 End If

 If P < 9 Then                                              'ha nem kilépés
  Lcd "  program : " ; P
 'End If

   If Setp = 0 Then                                         'adott program(szám) értékek beolvasása
    Gosub Beolvas
    Waitms 100
    Gosub Beallit                                           'majd lehetőség a változtatásra
   End If
 End If



 Waitms 250
 Goto Menuben

'*******************************

Idoszamlalo:                                                'sütési idő visszaszámlálása
 Stop Timer1
 Timer1 = 0
 Perc = Perc + 1

 If Perc = 60 Then
  Eltelt_sutido = Eltelt_sutido + 1
  Perc = 0
 End If

 Start Timer1

Return

'*******************************

Ajtonyitva:                                                 '     nyitott ajtónál jelez

 Cls
 Lcd "! Nyitott ajto !"
 Waitms 500
'If B = 1 Then
 Gosub Beep2
'End If

Return
'*******************************
Stopgomb:                                                   'sütés idő előtti befejezése

   Stop Timer1
   Timer1 = 0
   Cls
   Lcd "      stop"
   Gosub Beep2
   Reset Gozki
   B = 0
   C = 0
   D = 0
   Perc = 0
   Eltelt_sutido = 0
   Waitms 250

Return
'******************************

Beolvas:                                                    'eepromból az adott program változóit

 Kem = P * 33                                               'olvasás helyének kiszámítása
 Kel = Kem + 9
 Goz = Kem + 18
 Sut = Kem + 27

 Readeeprom Hokemence , Kem
 Readeeprom Hmkeleszto , Kel
 Readeeprom Gozido , Goz
 Readeeprom Sutido , Sut
 'Readeeprom His , 0
 His = 1
  Hmkemence = Hokemence + 100                               'korrekció a 8bit-100/355 fokos hőfok közt
 Hoal = Hmkemence - His                                     'ki-be közti hiszterézis hozzáadása
 Hoah = Hmkemence + His
 Hobl = Hmkeleszto - His
 Hobh = Hmkeleszto + His

Return
'******************************

Beallit:

   Waitms 250
   Cls
   Lcd "set program" ; P


If F = 0 Then
 If Prog = 0 Then E = E + 1
 If Start_sut = 0 Then E = E - 1
 If E > 5 Then E = 1
 If E < 1 Then E = 5
End If

 Select Case E

 Lowerline
'************************************************xx
 Case 1:

 Lcd "gozoles ido :" ; Gozido

 If F = 0 Then
  If Setp = 0 Then
   F = 1
   Waitms 200
  End If
 End If

 If F = 1 Then
  Cls
  Lcd "set"
  Lowerline
  Lcd "gozoles ido :" ; Gozido

   If Prog = 0 Then Gozido = Gozido + 1
   If Start_sut = 0 Then Gozido = Gozido -1
   If Gozido < 1 Then Gozido = 1
   If Gozido > 20 Then Gozido = 20

    If Setp = 0 Then
     If F = 1 Then
       Writeeeprom Gozido , Goz
       F = 0
       Waitms 200
     End If
    End If

  End If
'*************************************************xx
 Case 2:
 Lcd "sutes ido:" ; Sutido

 If F = 0 Then
  If Setp = 0 Then
   F = 1
   Waitms 200
  End If
 End If

 If F = 1 Then
  Cls
  Lcd "set"
  Lowerline
  Lcd "sutes ido:" ; Sutido

   If Prog = 0 Then Sutido = Sutido + 1
   If Start_sut = 0 Then Sutido = Sutido -1
   If Sutido < 5 Then Sutido = 5
   If Sutido > 60 Then Sutido = 60

    If Setp = 0 Then
     If F = 1 Then
       Writeeeprom Sutido , Sut
       F = 0
       Waitms 200
     End If
    End If

  End If
'*************************************************xx

 Case 3:
 Lcd "sutes hofok:" ; Hmkemence

 If F = 0 Then
  If Setp = 0 Then
   F = 1
   Waitms 200
  End If
 End If

 If F = 1 Then
  Cls
  Lcd "set"
  Lowerline
  Lcd "sutes hofok:" ; Hmkemence

   If Prog = 0 Then Hmkemence = Hmkemence + 1
   If Start_sut = 0 Then Hmkemence = Hmkemence -1
   If Hmkemence < 101 Then Hmkemence = 101
   If Hmkemence > 320 Then Hmkemence = 320

    If Setp = 0 Then
     If F = 1 Then
       Hokemence = Hmkemence - 100
       Writeeeprom Hokemence , Kem
       F = 0
       Waitms 200
     End If
    End If

  End If
'*************************************************xx

 Case 4:
 Lcd "keleszt hofok" ; Hmkeleszto

 If F = 0 Then
  If Setp = 0 Then               'belső gombra lép beállításra
   F = 1                                                    'beállításkor
   Waitms 200
  End If
 End If

 If F = 1 Then
  Cls
  Lcd "set"
  Lowerline
  Lcd "keleszt hofok" ; Hmkeleszto

   If Prog = 0 Then Hmkeleszto = Hmkeleszto + 1             'bal gomb
   If Start_sut = 0 Then Hmkeleszto = Hmkeleszto -1         'jobb gomb
   If Hmkeleszto < 25 Then Hmkeleszto = 25                  'határok
   If Hmkeleszto > 33 Then Hmkeleszto = 33

    If Setp = 0 Then                                        'mentéseepromba majd 1szintel vissza
     If F = 1 Then
       Writeeeprom Hmkeleszto , Kel
       F = 0
       Waitms 200
     End If
    End If

  End If
'*************************************************xx

 Case 5:                                                    'kilépés 1el vissza ha belső gomb
 Lcd "kilep"
 If Setp = 0 Then
  Cls
  Return
 End If

 End Select

 Goto Beallit

'Return


'/*****************************
Beep1:

Sound Portd.7 , 500 , 200

Return
'/*****************************
Beep2:

Sound Portd.7 , 400 , 150
Waitms 300
Sound Portd.7 , 400 , 150

Return
Remélem nagyjából érthető.
Kefeur
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Tipp:

Kód: Egész kijelölése

$hwstack = 128                                               ' default use 32 for the hardware stack
$swstack = 40                                               ' default use 10 for the SW stack
$framesize = 160                                             ' default use 40 for the frame space
Ha hibazik, az STCheck minden szubrutinba es az Error változó+szubrutinnév kiiratasa print-l!
:twisted:
Avatar
kefeur
Tranzisztorgyógyász
Hozzászólások: 187
Csatlakozott: 2008. február 17. vasárnap, 7:00

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

Így még nem próbáltam .
Hamarosan tesztelem.
Köszi szépen!
Kefeur
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Szabályok:
1, EEPROM 0. helyét nem használjuk
2, Deflcdchar _elé_ az LCD paraméterezését.
3, INT0 LOW LEVEL kell? ha alacsonyan van, az INT0-ba beragad! inkább rising agy falling legyen.
4, az Enable INTerrupts _előtt_ definiáljuk, hogy miket is használunk!
5, Hokemence = Hmkemence - 100 túlcsordulhat! hokemence byte, hmkemence LONG
6, CASE elégazások egyes részeit inkább szubrutinba rakd, a sok IF egymásban nem tesz jót neki.
case 3: gosub valahova

valahova:
.
.
.
return
7, case else hiányzik.
8, Select Case E
Lowerline
'************************************************xx
Ilyen TILOS!
Select case...
case....
case....
end select
nem lehet köözbe heverésző utasítás!


9, If Hmkemence > 320 Then Hmkemence = 320
Minek LONG????

10, Már írtam, de nem muszály megfogadni:
If Hob = Hobh Or Hob > Hobh Then Reset Keleszto_fut 'kelesztő hőfok szabályozása -> nem javasolt. E helyett:

If Hob = Hobh Then Reset Keleszto_fut 'kelesztő hőfok szabályozása
If Hob > Hobh Then Reset Keleszto_fut 'kelesztő hőfok szabályozása

vagy
If Hob >= Hobh Then Reset Keleszto_fut 'kelesztő hőfok szabályozása

11,
Foprog:
.
.
.
goto foprog
helyett a Do-Loop szerencsésebb

12, A soros debuglehetőség hol van? (1 szabad láb akár és arra SW-es portként kirakni)
13, Az I2C-s EEPROM amibe a működési-furási paramétereket letárolod későbbi kiértékelésre hol van?
14, Honnan tudod mit csinál a program? Merre jár, melyik változónak mi az értéke? Byte/Long/Bit/Word konverzióban összeakadhatsz. ha lehet a nagyobbat kell mindig használni és _külön_ sorban a Low/High/Loww/Highw utasítással kivágni a szükséges byte/word-t

15, STOP kezelés hibás. A paramétereket elpiszkálod, és _bárhol_ járt a program, onnan folytatja. tessék vészleállítsát csinálni, és ha elengedem a STOP gombot, akkor a chip (pl. watchdoggal) reseteli magát!
Ezt a prg inditaskor a MCUR regisztrerrel figyelem és induláskor figyelmeztet hogy vészleállítás volt.

16, áramköri kialakítás során az INT0 megoldása? 100nF prellmentesítés, ill az INT felhúzóellenállása 4k7, valamint a prg-ban definiálom, hgogy az a láb biza bemenet és a belső felhúzóellenállást _is_ bekapcsolom.


Így nekilesve jobban, hogy volt időm....
Válasz küldése