pic 12f675 de adc ile step motoru ileri geri hareket ettirmek

Başlatan atalix, 10 Ekim 2011, 20:46:01

atalix

Başta Ete Hocam olmak üzere herkese selamlar.
pic 12f675 ile adc den pot u okuyarak, step motoru yazılımla pwm elde ederek ileri geri sürmek istiyorum ama başaramadım.Yazmaya çalıştığım kodu aşağıda ekliyorum, yardımcı olursanız sevinirim.Saygılar herkese.


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

Device = 12F675
DEFINE OSCCAL_1K 1
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_OFF, BODEN_OFF, CP_OFF, MCLRE_OFF
Declare adin_res10   'adc nin kaç bit olduğunu ayrlıyoruz
Declare ADIN_TAD 8_fosc
Declare ADIN_STIME 50
TRISIO=%00001101
CMCON=7
ANSEL=%00000001
ADCON0=%10000000
Symbol tus=GPIO.3
Symbol anhx=GPIO.2
Symbol anhtson=GPIO.1
Dim ham As Word
Dim x As Byte   
Dim say As Byte
Dim hiz As Byte 
DelayMS 100

basla:
  ADCIN 0,ham
  say=(ham+1)*35/(256)+10 'maximum 150 değeri olacak zannederim 'pot tan gelen bilgiyi(voltajı)say ın içine kaydediyoruz ham(adc) değerini

tuskont:
    GPIO=%00000000
    If tus=1 Then   'tuş u kontrol ediyoruz 'pull up yaptık pin i
    GoTo tuskont
   
    If say<40 Then
    GoSub hiz1
    If say>40 And say<70 Then
    GoSub hiz2   
    If say>70 And say<100 Then
    GoSub hiz3
    If say>140  Then
    GoSub hiz4
    Return
    EndIf
    EndIf
    EndIf
    EndIf
    EndIf         
   
         
    hiz1:       'ileri
        For x=1 To 5*200     
        GPIO.4=1   'gpio.4 step yön dür.
        GPIO.5=1   'gpio.5 step puls dır.       
        DelayUS 100
        GPIO.5=0
        DelayUS 100
        If anhx=0 Then
        GoSub hiz1a
        EndIf         
        Next x
        GPIO.4=0  'yön sıfırlandı     
        DelayMS 20       
        Return
    hiz1a:        'geri
        For x=1 To 5*200
        GPIO.5=1   'gpio.5 step puls dır.       
        DelayUS 100
        GPIO.5=0
        DelayUS 100
        If anhtson=0 Then
        GoTo basla
        EndIf         
        Next x           
        Return
      hiz2:  'ileri
        For x=1 To 5*200     
        GPIO.4=1   'gpio.4 step yön dür.
        GPIO.5=1   'gpio.5 step puls dır.       
        DelayUS 80
        GPIO.5=0
        DelayUS 120
        If anhx=0 Then
        GoSub hiz2a
        EndIf         
        Next x
        GPIO.4=0  'yön sıfırlandı     
        DelayMS 20       
        Return
      hiz2a:   'geri
         For x=1 To 5*200
        GPIO.5=1   'gpio.5 step puls dır.       
        DelayUS 80
        GPIO.5=0
        DelayUS 120
        If anhtson=0 Then
        GoTo basla
        EndIf         
        Next x           
        Return
       hiz3:    'ileri
        For x=1 To 5*200     
        GPIO.4=1   'gpio.4 step yön dür.
        GPIO.5=1   'gpio.5 step puls dır.       
        DelayUS 60
        GPIO.5=0
        DelayUS 140
         If anhx=0 Then
        GoSub hiz3a
        EndIf         
        Next x
        GPIO.4=0  'yön sıfırlandı     
        DelayMS 20       
        Return
       hiz3a:      'geri
        For x=1 To 5*200
        GPIO.5=1   'gpio.5 step puls dır.       
        DelayUS 60
        GPIO.5=0
        DelayUS 140
        If anhtson=0 Then
        GoTo basla
        EndIf         
        Next x           
        Return
       hiz4:    'ileri
       
       For x=1 To 5     
        GPIO.4=1   'gpio.4 step yön dür.
        DelayMS 5
        GPIO.5=1   'gpio.5 step puls dır.       
        DelayMS 1000
        GPIO.5=0
        DelayMS 1000
         If anhx=0 Then
        GoTo hiz4a                       
        Next x
        EndIf
        GPIO.4=0  'yön sıfırlandı     
        DelayMS 20       
        Return
       hiz4a:      'geri
        For x=1 To 5*15
        GPIO.5=1   'gpio.5 step puls dır.       
        DelayMS 1000
        GPIO.5=0
        DelayMS 1000
        If anhtson=0 Then
        GoTo basla
       
        EndIf
             
        Next x
         GoTo basla           
     End 
         
     

ete

Öncelikle Tuş kontrol sisteminde hata olduğunu söyleyeyim. Aşağıda verilen kodlara bakılırsa;
TUS=1 ise GOTO TUSKONT komutu çalışacak ve altında yer alan diğer satırların hiç birisi icra edilmeyecektir.
Bütün IF sorgularını bir birinin içine sokmuşsun. Bana kalırsa sorgu içine ögrmeden bağımsız çalışacak satırlar olmalı.
Ayrıca satırların biriside RETURN komutuna ait. Bu neden burada?
    If tus=1 Then   'tuş u kontrol ediyoruz 'pull up yaptık pin i
       GoTo tuskont   
       If say<40 Then
          GoSub hiz1
          If say>40 And say<70 Then
             GoSub hiz2   
             If say>70 And say<100 Then
                GoSub hiz3
                If say>140  Then
                   GoSub hiz4
                   Return
                EndIf
             EndIf
          EndIf
       EndIf
    EndIf


Çok iyi anlaşılmamakla birlikte Bu kısımdaki if sorgulamaları bağımsız çalışmalı gibime geliyor. Şöyle;

    If tus=1 Then GoTo tuskont  'tuş u kontrol ediyoruz 'pull up yaptık pin i
         
    If say<40 Then GoSub hiz1
    If say>40 And say<70 Then GoSub hiz2     
    If say>70 And say<100 Then GoSub hiz3     
    If say>140  Then GoSub hiz4
    Goto Basla  'bu komut unutulmuş. Bu satır olmayınca program Gosub ile gidilmesi gereken alt programlara geçiyor ve orada Return komutunu görüp dönmeye çalışıyor. Ama Gosubile gelmediği için dönüş adresini alamıyor ve muhtemelen kitleniyodur.


Ete

atalix

Hocam teşekkürler üzerinde çalışıyorum gelişmeleri de bildiririm.Saygılar.

atalix

Ete hocam selamlar,
biraz geciktim ama bitirdim sonunda, aşağıda yazdığım program çok güzel çalışıyor, saygılar.

Device = 12F675
DEFINE OSCCAL_1K 1
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_OFF, BODEN_OFF, CP_OFF, MCLRE_OFF
Declare adin_res10   'adc nin kaç bit olduğunu ayrlıyoruz
Declare ADIN_TAD 8_fosc
Declare ADIN_STIME 50
TRISIO=%00001111 
CMCON=7
ANSEL=%00000001
ADCON0=%10000000

Symbol tus=GPIO.3
Symbol anhy=GPIO.2
Symbol anhtson=GPIO.1
Dim zmn As Word
Dim x As Byte   
   

DelayMS 200

basla:
     ADCIN 0,zmn
    zmn=(zmn+1)*35/(256)+10  '150 sayısını yakalıyoruz
         
tuskont:
     GPIO=%00000000
     DelayMS 200
     If tus=1 Then   
     GoTo tuskont         
     Else
     If zmn<30 Then
     GoSub hiz1
     EndIf
     If zmn>30 And zmn<70 Then
     GoSub hiz2
     EndIf   
     If zmn>70 And zmn<100 Then
     GoSub hiz3
     EndIf
     If zmn>100  Then
     GoSub hiz4
     EndIf
     EndIf
   GoTo basla             
  hiz1: 
     ileri1:       'ileri1     
        For x=1 To 10                         
        GPIO.4=1   'gpio.4 step yön dür.     
        GPIO.5=1   'gpio.5 step puls dır.
        DelayMS 1 
        GPIO.5=0
        DelayMS 1
      ADCIN 0,zmn
    zmn=(zmn+1)*35/(256)+10  '150 sayısını yakalıyoruz             
     If zmn>30 And zmn<70 Then
     GoTo ileri2
     EndIf   
     If zmn>70 And zmn<100 Then
     GoTo ileri3
     EndIf
     If zmn>100  Then
     GoTo ileri4
     EndIf 
        If anhtson=1 Then
        GoTo basla
        Else     
        If anhy=0 Then
        GoTo geri1
        Else
        GoTo ileri1
        EndIf                         
        EndIf           
        Next x                 
     geri1:        'geri1
        GPIO.4=0   'yön sıfırlandı
        For x=1 To 10         
        GPIO.5=1   'gpio.5 step puls dır.       
        DelayMS 1
        GPIO.5=0
        DelayMS 1
      ADCIN 0,zmn
    zmn=(zmn+1)*35/(256)+10  '150 sayısını yakalıyoruz   
     If zmn>30 And zmn<70 Then
     GoTo geri2
     EndIf   
     If zmn>70 And zmn<100 Then
     GoTo geri3
     EndIf
     If zmn>100  Then
     GoTo geri4
     EndIf                 
        If anhtson=1 Then
        GoTo basla
        EndIf       
        GoTo geri1                             
        Next x         
     Return   
   hiz2: 
     ileri2:       'ileri1     
        For x=1 To 10                         
        GPIO.4=1   'gpio.4 step yön dür.     
        GPIO.5=1   'gpio.5 step puls dır.
        DelayMS 1
        GPIO.5=0
        DelayMS 2
      ADCIN 0,zmn
    zmn=(zmn+1)*35/(256)+10  '150 sayısını yakalıyoruz   
     If zmn<30 Then
     GoTo ileri1
     EndIf       
     If zmn>70 And zmn<100 Then
     GoTo ileri3
     EndIf
     If zmn>100  Then
     GoTo ileri4
     EndIf   
        If anhtson=1 Then
        GoTo basla
        Else     
        If anhy=0 Then
        GoTo geri2
        Else
        GoTo ileri2
        EndIf                         
        EndIf           
        Next x                 
     geri2:        'geri1
        GPIO.4=0   'yön sıfırlandı
        For x=1 To 10         
        GPIO.5=1   'gpio.5 step puls dır.       
        DelayMS 1
        GPIO.5=0
        DelayMS 2
      ADCIN 0,zmn
    zmn=(zmn+1)*35/(256)+10  '150 sayısını yakalıyoruz   
     If zmn<30 Then
     GoTo geri1
     EndIf       
     If zmn>70 And zmn<100 Then
     GoTo geri3
     EndIf
     If zmn>100  Then
     GoTo geri4
     EndIf     
        If anhtson=1 Then
        GoTo basla
        EndIf       
        GoTo geri2                             
        Next x         
     Return                                   
    hiz3: 
     ileri3:       'ileri1     
        For x=1 To 10                         
        GPIO.4=1   'gpio.4 step yön dür.     
        GPIO.5=1   'gpio.5 step puls dır.
        DelayMS 1
        GPIO.5=0
        DelayMS 3
      ADCIN 0,zmn
    zmn=(zmn+1)*35/(256)+10  '150 sayısını yakalıyoruz   
     If zmn<30 Then
     GoTo ileri1
     EndIf       
     If zmn>30 And zmn<70 Then
     GoTo ileri2
     EndIf 
     If zmn>100  Then
     GoTo ileri4
     EndIf     
        If anhtson=1 Then
        GoTo basla
        Else     
        If anhy=0 Then
        GoTo geri3
        Else
        GoTo ileri3
        EndIf                         
        EndIf           
        Next x                 
     geri3:        'geri1
        GPIO.4=0   'yön sıfırlandı
        For x=1 To 10         
        GPIO.5=1   'gpio.5 step puls dır.       
        DelayMS 1
        GPIO.5=0
        DelayMS 3
         ADCIN 0,zmn
    zmn=(zmn+1)*35/(256)+10  '150 sayısını yakalıyoruz
     If zmn<30 Then
     GoTo geri1
     EndIf   
     If zmn>30 And zmn<70 Then
     GoTo geri2
     EndIf             
     If zmn>100  Then
     GoTo geri4
     EndIf         
        If anhtson=1 Then
        GoTo basla
        EndIf       
        GoTo geri3                             
        Next x         
     Return 
                     
     hiz4: 
     ileri4:       'ileri1     
        For x=1 To 10                         
        GPIO.4=1   'gpio.4 step yön dür.     
        GPIO.5=1   'gpio.5 step puls dır.
        DelayMS 1
        GPIO.5=0
        DelayMS 4
      ADCIN 0,zmn
    zmn=(zmn+1)*35/(256)+10  '150 sayısını yakalıyoruz   
     If zmn<30 Then
     GoTo ileri1
     EndIf       
     If zmn>30 And zmn<70 Then
     GoTo ileri2
     EndIf 
     If zmn>70 And zmn<100 Then
     GoTo ileri3
     EndIf   
        If anhtson=1 Then
        GoTo basla
        Else     
        If anhy=0 Then
        GoTo geri4
        Else
        GoTo ileri4
        EndIf                         
        EndIf           
        Next x                 
     geri4:        'geri1
        GPIO.4=0   'yön sıfırlandı
        For x=1 To 10         
        GPIO.5=1   'gpio.5 step puls dır.       
        DelayMS 1
        GPIO.5=0
        DelayMS 4
         ADCIN 0,zmn
    zmn=(zmn+1)*35/(256)+10  '150 sayısını yakalıyoruz
     If zmn<30 Then
     GoTo geri1
     EndIf       
     If zmn>30 And zmn<70 Then
     GoTo geri2
     EndIf 
     If zmn>70 And zmn<100 Then
     GoTo geri3
     EndIf     
        If anhtson=1 Then
        GoTo basla
        EndIf       
        GoTo geri4                             
        Next x         
     Return
    End           
                 
       
     
                 
   

ete


atalix

Teşekkür ederim hocam, yavaş yavaş ilerliyorum.Bu programı 16f877a da kullanmak istiyorum iki adet adc kullanmam gerekiyor biraz bilgi verebilirmisiniz A port unu kullanmam gerekiyor ama pek vakıf değilim ADC ayarlarını nasıl yapmam gerekiyor bilemiyorum, saygılar.

ete

Bu konuda yazılmış ders notlarım var ve forumda verilmiş durumda. Aşağıdaki linki incele

http://etepic.com/index.php?topic=16.0

Ete

F®T

Declare adin_res10   'adc nin kaç bit olduğunu ayrlıyoruz

Bu komut satırını şu şekil düzenlersen iyi olur.

Declare adin_res 10   'adc nin kaç bit olduğunu ayrlıyoruz

res ile 10 arasında boşluk yok.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

atalix


Powered by EzPortal