kesme

Başlatan can, 04 Eylül 2013, 18:12:05

can

#15
isis yok gerçekten. kartta deniyorum.
ama programın tamamını yazabilirim, çok karışık, daha doğrusu düzensiz. saat programını yerleştirdim yerde dönüp duruyor basla ya geçmiyor. programın diğer taraflarında sorun yok
saati çıkarırsam istenen kriterlerde doğru çalışıyor.


DelayMS 25
PORTB.2=0

On Interrupt GoTo kesme
  T0CON=%11000101
INTCON=%10100000
  CMCON=7




etiket8  =   ADIn 4 
  etiket4  =   ADIn 7 
  t_sure = 10
      Cls
  Print At 0,1,"                    "     
'Print At 2,1,Dec etiket8
Print At 0,1,"POS     FOR "
'Print At 2,14,Dec  etiket4
'Print At 1,1,"                    " 
'Print At 2,1,"   X          Y     "
'Print At 3,1,"                    "

Print At 4,1,"      TIME          "
                 "
Print At 7,1," BACK       STOP   "
PORTB.2 = 0
  DelayMS 1 

    OKU15:
                  TRISE = %00
                  PORTE.0 = 0 
                  PORTE.1 = 0 
                  PORTC.5 = 0
                  PORTC.4 = 0
                  DelayMS 1
                  PORTC.5 = 1
                  PORTC.4 = 0
                  TRISE = %10
                  PORTE.0 = 0     
                  var1 = 0
                 'ADCON1 = %11111111
                  DelayMS 2       
     var1 = ADIn 6 ' Place the conversion into variable Var1

  DelayMS 2 ' Wait for 1us
 
  If var1 > 100 Then
         
    End If

DelayMS 5
     
       'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
                  TRISE = %00
                  PORTE.0 = 0 
                  PORTE.1 = 0 
                  PORTC.5 = 0
                  PORTC.4 = 0
                  DelayMS 1
                  PORTC.5 = 0
                  PORTC.4 = 1
                  TRISE = %01
                  PORTE.0 = 0     
                  var2 = 0
                 'ADCON1 = %11111111
                  DelayMS 2       
     var2 = ADIn 5 ' Place the conversion into variable Var1

  DelayMS 2 ' Wait for 1us
 
  If var2 > 100 Then
       
    End If

DelayMS 5
       
       
   '   stop     
   If var1 > 660 And var1 < 780 Then
    If var2 > 70 And  var2 < 400 Then
    PORTB.2 = 1
    Print At 6,1,"     pause    "
    DelayMS 10
   
   
   
     dondu:
     
     
     PORTB.2 = 0
                         TRISE = %00
                  PORTE.0 = 0 
                  PORTE.1 = 0 
                  PORTC.5 = 0
                  PORTC.4 = 0
                  DelayMS 1
                  PORTC.5 = 1
                  PORTC.4 = 0
                  TRISE = %10
                  PORTE.0 = 0     
                  var1 = 0
                 'ADCON1 = %11111111
                  DelayMS 2       
     var1 = ADIn 6 ' Place the conversion into variable Var1
 
  DelayMS 2 ' Wait for 1us
 
  If var1 > 100 Then
         
    End If

DelayMS 25
     
       'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
                  TRISE = %00
                  PORTE.0 = 0 
                  PORTE.1 = 0 
                  PORTC.5 = 0
                  PORTC.4 = 0
                  DelayMS 1
                  PORTC.5 = 0
                  PORTC.4 = 1
                  TRISE = %01
                  PORTE.0 = 0     
                  var2 = 0
                 'ADCON1 = %11111111
                  DelayMS 2       
     var2 = ADIn 5 ' Place the conversion into variable Var1

  DelayMS 2 ' Wait for 1us
 
  If var2 > 100 Then
       
    End If


     
      DelayMS 25
     
       If var1 > 660 And var1 < 780 Then
    If var2 > 160 And  var2 < 300 Then
    PORTB.2 = 1
    Print At 6,1,"                    "
     GoTo gty
    End If
    End If
     GoTo dondu
      gty:
        PORTB.2 = 0
   
    End If
   
       
   End If 
   
  ' FE  ye basıldı
   
   
     If var1 > 650 And var1 < 750 Then
    If var2 > 650 And  var2 < 780 Then
    PORTB.2 = 1


    DelayMS 5
    PORTB.2 = 0
    GoTo ekran6
    End If   
   End If 
   
   
   'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  ' program başladı
  'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
   Clear
   DelayMS 200
   start:
   Print At 6,3,"  ",Dec2 saat,":",Dec2 dak,":",Dec2 sn,"  "
   GoTo start
   Disable
   kesme:
   sayac=sayac+1
   If sayac=5 Then
   sayac=0
   sn=sn+1
   If sn=60 Then
   sn=0
   dak=dak+1
   If dak=60 Then
   dak=0
   saat=saat+1
   If saat=24 Then
   saat=0
   End If
   End If
   End If
   
  End If
   INTCON.2=0
   Resume
   Enable
   End
    GoTo basla
   
   
   basla:
   etiket4 = ADIn 7
   saci=(ADIn 4)/2.71
   saci=saci-96
   Print At 2,4, "        "
   Print At 2,4, SDec saci
   Print At 2,14,"     "
   Print At 2,14, Dec etiket4
   
   If saci>sileri Then
   
   pin1 = 1
   pin2 = 1
   pin3 = 0
   pin4 = 1
   'pwm1 = 255*(hiz/10)
   If hiz=10 Then
   n= 190
   End If
   If hiz=9 Then
   n= 174
   End If
   If hiz=8 Then
   n= 158
   End If
   If hiz=7 Then
   n= 142
   End If
   If hiz=6 Then
   n= 126
   End If
   If hiz=5 Then
   n= 110
   End If
   If hiz=4 Then
   n= 94
   End If
   If hiz=3 Then
   n= 79
   End If
   If hiz=2 Then
   n= 63
   End If
   If hiz=1 Then
   n= 47
   End If
   
   HPWM 1,n,10000
   GoTo basla
   End If
   
   If  saci<= sileri Then
    pin1 = 0
   pin2 = 0
   pin3 = 1 'flex gider
   pin4 = 1
   pwm1 = 0
   HPWM 1,pwm1,0
   
   DelayMS (p_ileri*1000)
   GoTo geri
   End If
   
   geri:
     etiket4 = ADIn 7
   saci=(ADIn 4)/2.71
   saci=saci-96
   Print At 2,4, "        "
   Print At 2,4, SDec saci
   Print At 2,14,"     "
   Print At 2,14, Dec etiket4
   
    If  saci< sgeri Then
    pin1 = 1
   pin2 = 1
   pin3 = 1 'flex gider
   pin4 = 1
   'pwm1 = 255*(hiz/10)
    If hiz=10 Then
   n= 190
   End If
   If hiz=9 Then
   n= 174
   End If
   If hiz=8 Then
   n= 158
   End If
   If hiz=7 Then
   n= 142
   End If
   If hiz=6 Then
   n= 126
   End If
   If hiz=5 Then
   n= 110
   End If
   If hiz=4 Then
   n= 94
   End If
   If hiz=3 Then
   n= 79
   End If
   If hiz=2 Then
   n= 63
   End If
   If hiz=1 Then
   n= 47
   End If
   
   
   HPWM 1,n,10000
   GoTo geri
   End If
   
   If saci>= sgeri Then
    pin1 = 1
   pin2 = 1
   pin3 = 1 'flex gider
   pin4 = 1
   pwm1 = 0
   HPWM 1,pwm1,0
   DelayMS (p_geri*1000)
   GoTo ileri
   End If
   
   ileri:
    etiket4 = ADIn 7
   saci=(ADIn 4)/2.71
   saci=saci-96
   Print At 2,4, "        "
   Print At 2,4, SDec saci
   Print At 2,14,"     "
   Print At 2,14, Dec etiket4
    If saci>sileri Then
   
   pin1 = 1
   pin2 = 1
   pin3 = 0 '
   pin4 = 1
   'pwm1 = 255*(hiz/10)
    If hiz=10 Then
   n= 190
   End If
   If hiz=9 Then
   n= 174
   End If
   If hiz=8 Then
   n= 158
   End If
   If hiz=7 Then
   n= 142
   End If
   If hiz=6 Then
   n= 126
   End If
   If hiz=5 Then
   n= 110
   End If
   If hiz=4 Then
   n= 94
   End If
   If hiz=3 Then
   n= 79
   End If
   If hiz=2 Then
   n= 63
   End If
   If hiz=1 Then
   n= 47
   End If
   
   HPWM 1,n,20000
   GoTo ileri
   End If
   
   If saci<= sileri Then
    pin1 = 0
   pin2 = 0
   pin3 = 1 'flex gider
   pin4 = 1
   pwm1 = 0
   HPWM 1,pwm1,0
   DelayMS (p_ileri*1000)
   GoTo geri
   End If
   

   

GoTo OKU15




GoTo doo1


        kapanma:

DOO3:

      If offf = 0 Then
      GoTo Main_Prog:
      End If

GoTo DOO3




    End

     Include "font.inc"
   

Hattuşa

@CAN
şemanı oluşturdum, bas dosyanıda kopyele yapıştır yaptım ama anlamadığım giriş-çıkışlar var. isisin ve basın eksiklerini giderirsen üzerinde çalışma yapabiliriz, mesela adin7 ye kadar analog girişleri kullanacakmısınız? portb.3-4-5-6 giriş, bu girişlerde ne bağlı, birde glcd bağlantısı doğrumu?

can


teşekkürler hocam
glcd bağlantıları doğrudur hocam çalışıyor sistem. tüm pinler kullanılıyor neredeyse.
motor da istediğim kriterlere göre ileri geri stop vs. hepsini yapıyor.
tek sorun çalışma süresi koymaktı
onuda kesme ekleyerek sayenizde yazdırıyorum. ama akış bozuldu start: içinde dönüp duruyor,
baslaya geçemiyor.

ete

Programların çalışma mekanizmasını iyi bilmiyorsun.
Bir programa;
START:
....
GOTO START
diye komut satırları eklersen o program START ile GOTO START arasında döner durur. Çünki öyle emretmişsin.
Yazdıklarına bakılırsa GOTO BASLA işini Kesmenin sonuna eklemişsin. Ama kesme otomatik girilen ve programın işleyişi esnasında rastgele bir anda programın olduğu yerden ayrılıp gittiği bir alt program şeklindedir. Mantıklı düşünürsen Kesmeye madem otomatik gidiliyor o halde kesme içinde ne yapılacaksa yapılıp programın geldiği yeride otomatik bulup dönmesi gerekir diye düşünür insan ve nitekimde derleyiciyi yapanlarda aynı şekilde düşünmüşler ve RESUME komutunu bu iş için koymuşlar. Program RESUME komutunu görünce otomatikman ayrıldığı yere döner. Anlayacağın senin GOTO BASLA satırın hiç bir şekilde görülmez. Bu durumda sen Start satırından sonra ne yapacaksan yapıp programı GOTO BASLA komutu ile başla satırına aktarman gerekir. Kesme sonundaki o Goto Basla satırınıda sil oradan.
Ete

can

Hocam teşekkürler cevaplar için.
bu motor ileri geri programı sağlıklı bir şekilde çalışıyor. basla ile motor çalışmaya başlıyor (ileri veye geri duruma göre) sonra ileri: ile ileri dönüp bekliyor. bekleme süresi bitince geri: ile geri dönüp bekliyor. bu sonsuza dek böyle sürüp gidiyor. bende süre sınırı koymama çalışıyorum. bu kesme nedir bilmem, zaten belli oluyor. şim di sayenizde bu saydırma ile süreyi ayrı bir ekranda yazdırabiliyorum, 2 sn geç kalıyor sorun değil. fakat esas programın içine koymaya kalkınca olmuyor. sadece sayıyor. goto start tı kaldırınca da ekran saymıyor.
karışık bir durum

can

T0CON=%11000101
INTCON=%10100000
CMCON=7

bu kodları program başlamadan yani ekran bile açılmadan önceki safhaya koydum

ekran açıldıktan sonra on interrupt goto kesme komutu
altına kesme:
Print At 6,3,"  ",Dec2 saat,":",Dec2 dak,":",Dec2 sn,"  " yi ise motor basla:, ileri:, ve geri: komutlarının başına koydum. her bir safhada ekranı yenilesin diye.

ekran açıldıktan sonra reset le sonuçlanıyor

motor başladan hemen önce şu şekilde:

On Interrupt GoTo kesme
   Disable
   kesme:
   sayac=sayac+1
   If sayac=5 Then
   sayac=0
   sn=sn+1
   If sn=60 Then
   sn=0
   dak=dak+1
   If dak=60 Then
   dak=0
   saat=saat+1
   If saat=24 Then
   saat=0
   End If
   End If
   End If
   End If
   INTCON.2=0
   Resume
   Enable
   'End

can

sanırım disable ve enable komutları çok kritik
program tek başına çalışınca buralara uğruyor ama
başka programın içine gömünce buraları görmüyor; resumeden sonra gidiyor ve disable enable gerçekleşmiyor. doğrumu akıl yürütüyorum acaba

ete

Her işlemcinin kesme kaynakları vardır. Kesme adı üzerinde asıl işin kesilerek kesme içine girilmesi ve orada yapılacak işlerin yapılarak programın ayrıldığı yere geri dönmesidir. Bsic programlarında kesme özelliğini aktif etmek için önce global kesmeler açılır bu Intcon registeri 7 nolu biti set edilerek yapılır. Sonra hangi kesme kaymağı kullanılacak ise ona ait bit de set edilerek kesme işi aktif hale getirilir. Sonra basla satırından evvel On interrupt goto kesme şeklinde kesme oluştuğu zaman programın hangi etikete gitmesi gerektiği programa verilir.
Bu işlemlerden sonra program çalışmaya basla satırından itibaren başlarsa ve çalışma esnasında kesme oluşur ise program hemen bulunduğu adresi stack içine atarak doğruca kesme etiketine gider.
Orada önce disable komutunungörerek kesme içinde yeniden kesme oluşmasını engellemek için global kesmeleri iptal eder.
Sonra varsa yapılacak işleri yapar ve aynı yerde kesme bayrağıda sıfırlanarak yeniden kesme oluşmasına imkan tanınmış olur. Daha sonra resume komutu verilerek programın geldiği yere dönmesi sağlanır. Resume den sonra yer alan Enable komutuda kesmeden çıkılırken global kesmeleri yeniden aktive ederek yeni kesmelerin oluşmasına imkan tanır. Program resume komutunu görünce hemen stack içine atılan ayrılma adresini geri alıp o adrese geri döner.
Bu anlattıklarımda kim nerede kullanılacak anlattım umarım yararı dokunmuştur. Ayrıca kesme mekanizmasınıda  bir nebze açıklamış oldum.

Ete

can

Hocam teşekkürler

bu bilgilere göre bir akış tasarlamam daha mümkün gibi,

çok teşekkürler

can

#24
verdiğiniz bilgilere göre programı düzenledim resetleme olmuyor, her biri tek başına çalışan bu iki program (kesme ve motor sürme) birleştirnce şu anda saat sayıyor fakat hpwm üretimi olmuyor.

kesme ile ilgili eklediğim bir şey Hpwm üretimini engelliyor veya hpwm üretmek için kesmelerden zaman kalmıyor?? diğer parametreler yani analog değerlerde ve karşılaştırmalarda sorun yok.

göze çarpan yada hpwm yi devre dışı bırakan bir ayar var mı acaba? bu intcon veya T0con hpwm yi engelliyor olabilir mi? HPwm satırının altındana ve üstünden ekrana veri gönderdim ikiside görünüyor yani hpwm üretimi engellenmiş durumda

teşekkürler

Device 18F4620

Declare Xtal = 4
Declare Adin_Res=10
'declare Adin_tad=FRC

Declare Adin_Delay=50
'DECLARE PLL_REQ = ON
CCP1CON = %00001100
Declare CCP1_Pin PORTC.2

  TRISA = %00100000
  TRISD = %00000000
   TRISB = %01111000
    TRISC = %00000000
  ADCON2.7=1

All_Digital = TRUE

Declare LCD_DTPort =PORTD                 
Declare LCD_RSPin = PORTC.1               
Declare LCD_ENPin = PORTC.3               
Declare LCD_RWPin = PORTC.0               
Declare LCD_CS1Pin = PORTB.0               
Declare LCD_CS2Pin = PORTB.1             
Declare LCD_Type =  GRAPHIC               
Declare Internal_Font = On               
Declare Font_Addr = 0
Declare GLCD_CS_Invert On
--------------------------------------- 
T0CON=%11000101
INTCON=%10100000
CMCON=7
Clear
DelayMS 200
  PORTC.0=0

On Interrupt GoTo kesme

   
   
   
   
   basla:
   etiket4 = ADIn 7
   saci=(ADIn 4)/2.71
   saci=saci-96
   Print At 2,4, "        "
   Print At 2,4, SDec saci
   Print At 2,14,"     "
   Print At 2,14, Dec etiket4
   Print At 6,3, "            "
   Print At 6,3,"  ",Dec2 saat,":",Dec2 dak,":",Dec2 sn,"  "
     
   
   If saci>sileri Then
   
   pin1 = 1
   pin2 = 1
   pin3 = 0
   pin4 = 1
   
   HPWM 1,127,10000
   GoTo basla
   End If
   
Disable
   
kesme:
   sayac=sayac+1
   If sayac=5 Then
   sayac=0
   sn=sn+1
   If sn=60 Then
   sn=0
   dak=dak+1
   If dak=60 Then
   dak=0
   saat=saat+1
   If saat=24 Then
   saat=0
   End If
   End If
   End If
   End If
   INTCON.2=0
   Resume
   Enable
   End

can

#25
arkadaşlar hpwm ve aynı zamanda saat (kesme) nihayet çalıştı. 18f4620 için
sorun şu şekilde çözüldü: ON_INTERRUPT GoTo


T0CON=%11000101
INTCON=%10100000
On_Interrupt GoTo kesme

  basla:
   
   etiket4 = ADIn 7
   saci=(ADIn 4)/2.71
   saci=saci-96
   Print At 2,4, "        "
   Print At 2,4, SDec saci
   Print At 2,14,"     "
   Print At 2,14, Dec etiket4
   Print At 6,3, "            "
   Print At 6,3,"  ",Dec2 saat,":",Dec2 dak,":",Dec2 sn,"  "
     
   
   If saci>sileri Then
   
   pin1 = 1
   pin2 = 1
   pin3 = 0
   pin4 = 1
   
     
   HPWM 1,n,10000
   
   GoTo basla
   End If
   .
   .
   .
kesme:
   
   INTCON.2=0
   Context Save
   sayac=sayac+1
   If sayac=91 Then
   sayac=0
   sn=sn+1
   If sn=60 Then
   sn=0
   dak=dak+1
   If dak=60 Then
   dak=0
   saat=saat+1
   If saat=24 Then
   saat=0
   End If
   End If
   End If
   End If
   Context Restore
   End

Powered by EzPortal