PulsOut

Başlatan onurinci, 30 Aralık 2022, 05:43:48

onurinci

Hocam selam eski bir dergi projesinde,Triac yerine Mosfet ile sürülebilen DC motor projesine rastladım,yazarın bıraktığı HEX Dump kodu zaman içinde bozulmuş,Checksum hatası veriyor,yeniden derlemeye kalktım fakat şartları yerine getirmeme rağmen PORTB.1'den Pulse çıkışı alamadım,sanki Basic Stamp zamanından kalan eski bir dille yazıldığı için komutlarmı uymuyor diye düşündüm,fakat derlenirken hata'da vermiyor.  saygılar.
'=========================== Title =========================================================
'File:   mot1108.BAS
'Author: Klaus Zahnert
'=========================== Description ===================================================
'Control of a direct current motor with alternating current in half-wave operation, the
' Direction of rotation is generated by current flow in half-waves of different polarity.
' The speed is controlled by pulse width modulation. The digital input used
' Four bits for the speed, one bit for the direction of rotation and one bit for the enable signal
'=========================== Settings ======================================================
Key   VAR  Byte                               ' Eingabe Geschwindigkeit m. Taste
Puls  VAR  Word                               ' Ausgabe  Motor-Geschwindigkeit
TRISA       = %00011111                       ' Port A auf Eingabe setzen
'PORTA=0
'TRISB       = %00000101                       ' Port B auf Eingabe setzen
'PORTB=0
TRISB.2     = 1                               ' Taste KEY-IN auf Eingabe setzen 
INTCON      = $90                             ' Erlaubnis  RB0-Interrupt

DEFINE DEBUG_REG PORTB                        ' Debug Port Voreinstellung
DEFINE DEBUG_BIT 7
DEFINE DEBUG_BAUD 9600
DEFINE DEBUG_MODE 1
DEFINE DEBUG_PACING 1000
                                                                                 '10 Befehle
'=========================== Main ==========================================================
      LOW PORTB.1                             ' Start mit  Motorstrom = 0 B1
      On Interrupt goto Fire                  ' Interrupt-handler zuordnen
                                              ' Die Tasteneingabe der Geschwindigkeit
                                              ' wird ignoriert, solange die Taste KEY-IN
                                              ' nicht bet,,tigt wird
                                              ' *******************
Loop_: If PORTB.2 = 1 then  Loop_               ' Im Durchlaufen der Schleife ist der Motor
                                              ' eingeschaltet, die Geschw.-Tasten sind
                                              ' inaktiv
                                              ' KEY-IN wird gedr�ckt:
                                              ' ********************
                                              ' Eingabe Mode, der Motor h,,lt an,
                                              ' Die Geschwindigkeitstasten sind aktiv
      DISABLE                                 ' Interrupts gesperrt
Key_in: Key   = PORTA                         ' šbergabe Tasteneingabe am  PortA
      Key  = (Key ^ %00001111) & %00001111    ' Inversion d. Geschw.- bits with XOR-Maske
                                              ' Geschw. Bits mit AND-Maske abtrennen
      Puls = 66 * Key                         ' Pulse 0....10 ms f�r die Drehz. Steuerung
      DEBUG "keyed ", DEC Key, "    Puls = ", DEC Puls, "  direction = ",BIN PORTA.4,10,13
                                              ' Ausgabe der eingegebenen Werte an den PC
      If PORTB.2 = 0 then Key_in              ' Halten des Eingabemodus solange KEY-IN gedr.
      ENABLE                                  ' Interrupts erlauben
      Goto Loop_
                                                                                 '11 Befehle
'=========================== Interrupt - Handler ===========================================
Fire: DISABLE                                 ' Interrupts sperren
      If PORTA.4 = 0 then                     ' Wechsel der Motor-Drehrichtung mit
         Pause 10                             ' eingef�gtem Puls 10 ms, Einheit ist 1 msec
      Endif                                   ' abh,,ngig vom  Eingang  PortA.4
      PULSOUT PORTB.1,Puls                    ' Ausgang Motor Steuerung B1
      INTCON.1 = 0                            ' Interrupt Flag r�cksetzen
      RESUME                                  ' R�ckkehr zum Hauptprogramm
      ENABLE                                  ' Interrupts erlauben
                                                                                  '8 Befehle
'===========================================================================================
End                                                                                '1 Befehl

ete

Program PBP için yazılmış. Orjinal dosya bozuk birileri oynamış olsa gerek.
Yeniden derlenen ise çalışıyor. Bir sorun göremedim.
Programda PORTB.1 den çıkan pulsları görebilmen için öncelikle bir key tuşuna basmış olman gerekiyor. Key tuşlarına basılması ise PORTB.2 nin kontrolü altında tutulmuş. Elbette bunun bir sebebi var onu da açıklayacağım.
Sebep programın aksamaya (tuş basma gecikmesine maruz kalmayan) bir puls çıkışına ihtiyacı var aksi taktirde motorun dönmesi sekteye uğrayabilir. Bu nedenle bir Key tuşu basıldıktan sonra tuyşa uygun puls çıkışı yada PWM çıkışını sağlayan şey PORTB.2 nin sürekli 1 konumunda olması dır.
Zira program bu tuş basılı olduğu müddetçe LOOP isimli döngüden ayrılamıyor ama kesmeler o bölümde çalıştığı için sorunsuzca kesmeye gidip PWM sinyalinide düzenli olarak çıkartabiliyor.
Buraya kadar her şey mantıklı. Peki nasıl puls çıkartacağız. Bunun için aşağıdaki sıralamada belirtilen işleri yerine getirmen gerekir.

1. Öncelikle PORTB.2 yi loop dan kurtarmak ve programın basılan tuşları alacağı alt kısıma geçmesini sağlamak için PORTB.2 deki butona basıyoruz. Böylece program LOOP dan kurtulup alt satırlara geçmiş olacaktır. Burada Key tuşlarından birine veya yön butonuna basıp basılı tutuyoruz. Basılı tutmamızın nedeni programın hızlı çalışması nedeni ile key tuşuna basıldığı anda bir puls süresi hesaplaması ama tuşu bırakır bırakmaz sürenin sıfırlanması dır. Puls süresinin sıfırlanmaması için key tuşuna basılı tutuyoruz.
2. Bu aşamada artık Key-in etiketinden kurtulup tekrar loop etiketine takılıp kalmamız gerekir. Zira Key-in kısmında programın kesmeye girmesi Disable komutu kullanılarak engellenmiş durumda.
İşte bu nedenle Key tuşuna basılı tutuyor iken PORTB.2 tuşunu bırakıyoruz.
Böylece program loop etiketine dönüyor ve orada artık kesmeler aktif olduğundan PORTB.1 den de pulslar çıkmaya başlıyor.
Puls genişliğini değiştirmek için demekki önce PORTB.2 deki butona basıp basılı tutarken key tuşlarından birine basıp basılı tutarken PORTB.2 yi serbest bırakıyoruz.

Olay bundan ibaret.

Ete

onurinci

Hocam çok teşekkür ederim,geniş açıklamalarınız için,tüm varyasyonları denediğimi sanıyordum yanılmışım..

Powered by EzPortal