PIC BASIC PRO Öğreniyoruz soru cevapları

Başlatan aster, 19 Mayıs 2005, 17:33:33

pea

Evet 64 bit makinede mpasm ile derliyorum.

pea

Sorunum 470k ohm'luk kalitesiz trimpottan kaynaklanıyormuş , datasheet'i iyice okuyunca anladım.
Önerilen kaynak empedansı ve ADC Acquisition Time denklemlerini okuyunca anladım ki sürekli ve sorunlu ADC oluyordu , bu da çıkışı bozuyordu.
5k ohm pot takınca geçti.

emrah

#332
ete hocam pwm derslerinizden kesmetmr0 programında ledler yanıp sönme yapıyor. bu sorunu nasıl aşabilirm?

programı 16f877 içine yükledim board üzerine kurdum devreyi ve 1 tane rgb led bagladım, led yanıp sönme yaparak oluşan rengi gösteriyor. pic osilatörünü 20mhz rezanatör  baglayıpta denedim yine aynı deişen birşey olmuyor.

devreye 6 adet buton bagladım herbir kanalı artırıp azaltmak için ve bu degerleri görebilmek için lcd ekran koydum. fakat butonlarla ayarlama yaparken sanki kırmızıyı ayarlerken yeşilide ayarlıyomusm gibi  yeşil renkte etkilenito yada mavi led etkileniyor. program şöyle;



TRISA=0
TRISB=%11111111
TRISC=0
TRISD=0
TRISE=0

porta=0
portb=0
portc=0
portd=0
porte=0



DEFINE LCD_DREG PORTD 'LCD data port
DEFINE LCD_DBIT 4 'LCD data starting bit 0 or 4
DEFINE LCD_RSREG PORTD 'LCD register select port
DEFINE LCD_RSBIT 3 'LCD register select bit
DEFINE LCD_EREG PORTD 'LCD enable port
DEFINE LCD_EBIT 2 'LCD enable bit
DEFINE LCD_LINES 2 'Number lines on LCD


DEFINE OSC 20

@ DEVICE pic16F877                                                   
@ DEVICE pic16F877, WDT_OFF                 
@ DEVICE pic16F877, PWRT_ON                
@ DEVICE pic16F877, PROTECT_OFF         
@ DEVICE pic16F877, HS_OSC

ON INTERRUPT GoTo KESME   
OPTION_REG=%10001000      
INTCON=%10100000

ADCON1=7

DUTY_A VAR BYTE
DUTY_B VAR BYTE
DUTY_C VAR BYTE
LEDA VAR BYTE
LEDB VAR BYTE
LEDC VAR BYTE
I VAR BYTE

PAUSE 100
LCDOUT $FE,1


   DUTY_A=80
   DUTY_B=30
   DUTY_C=10



BASLA:


LCDOUT $FE,$80,"R =",DEC3 DUTY_A
LCDOUT $FE,$88,"G =",DEC3 DUTY_B
LCDOUT $FE,$C0,"B =",DEC3 DUTY_C


IF PORTB.0=0 THEN DUTY_a=DUTY_a+1:GOSUB BEKLE
IF PORTB.1=0 THEN DUTY_a=DUTY_A-1:GOSUB BEKLE

IF PORTB.2=0 THEN DUTY_B=DUTY_B+1:GOSUB BEKLE
IF PORTB.3=0 THEN DUTY_B=DUTY_B-1:GOSUB BEKLE

IF PORTB.4=0 THEN DUTY_C=DUTY_C+1:GOSUB BEKLE
IF PORTB.5=0 THEN DUTY_C=DUTY_C-1:GOSUB BEKLE

IF DUTY_A=100 THEN DUTY_A=0
IF DUTY_B=100 THEN DUTY_B=0
IF DUTY_C=100 THEN DUTY_C=0

IF DUTY_A=255 THEN DUTY_A=99
IF DUTY_B=255 THEN DUTY_B=99
IF DUTY_C=255 THEN DUTY_C=99


GOTO BASLA

BEKLE:
FOR I=0 TO 100
PAUSE 1
NEXT I
RETURN


DISABLE
KESME:
      LEDA=LEDA+1
      IF (PORTC.1=1 AND LEDA=DUTY_A) OR (PORTC.1=0 AND LEDA=100-DUTY_A) THEN
         PORTC.1=1-PORTC.1
         LEDA=0
      ENDIF
             
     
      LEDB=LEDB+1
      IF (PORTC.2=1 AND LEDB=DUTY_B) OR (PORTC.2=0 AND LEDB=100-DUTY_B) THEN
         PORTC.2=1-PORTC.2
         LEDB=0
      ENDIF
     
      LEDC=LEDC+1
       IF (PORTC.3=1 AND LEDC=DUTY_C) OR (PORTC.3=0 AND LEDC=100-DUTY_C) THEN
         PORTC.3=1-PORTC.3
         LEDC=0     
      ENDIF
         
      TMR0=254
      INTCON.2=0       
      RESUME
      ENABLE
     
END

ete

ADCON1=%10000100
komutu yerine

ADCON1=7

yaz bakalım ne olacak

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

justice_for_all

wdt açik gozukuyor ama programında hc wdt sıfırlama goremiyorum
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

emrah

 hocam yukardaki mesajda programın son halını ekledim.

dediginzi adcon1=7 yi yazdım düzelmeler fakat yukardaki programa gore 2. ve 3. çıkışlerdan sabit sinyal çıkıyor? lcd ekrandan    DUTY_B,
   DUTY_C değişkenlerinin deiştigini gözlemliyorum fakat çıkışta sabit bir frekans var?  DUTY_A değişkenini butonlarla deiştirdigim zman kırmızı ledde  ışık şiddetinde artma ve azalma var fakat gözle görülebilen kırpısmalar oluyor!

emrah

Alıntı yapılan: justice_for_all - 05 Ocak 2012, 17:47:00
wdt açik gozukuyor ama programında hc wdt sıfırlama goremiyorum

hocam neden bahsettinizi anlamadım? neyi nerede sıfırlamam gerekiyor ?

justice_for_all

yani dmk ıstdgm cwp yazmadan once wdt=on seklindeydi msjı yazdıktan snra duzelmissiniz wdt kapalıyken sorun yok ama wdt acık olunca wdt suresi dolmadan wdt sıfırlamanız gerekmektedir yoksa devre kendini resetleyecektir
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

emrah

wdt nerede sıfrlanması gerekir ? bunu hakkında bir bilgim yoktu. ayarları baska programdan aldım için dogru kodu buldum.  hocam bunu acık olması ne işimze yarar?

justice_for_all

hocam diyelimki wdt acık we 18 ms ye ayarlı wdt saymaya bslar 18ms ye gelince devre kendini resetler bunu engellemek icin wdt sıfırlanır pic basıcte kodu bilmiyorum (ccs de restart_wdt() die bir fonksiyon var) kullanma amacı ise programda istenmeyen kilitlenmeleri gidermek  mesela program biyerde takıldı diyelim wdt sıfırlanmadgı icin bu takılma 18 ms surmusse devre kendini resetler
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

emrah

cevap için teşekkür ederim hocam.

  yukardaki programla elde ettigm pwm sinyali ile rgb ledi çalıştırdım fakat gözün algılayabilecegi şekilde kırpışma oluyor bunu nasıl halledebilirm? aslında olmamamsı gerekir diye biliyorum ve pic osilatörüde 20MHZ. programda yanlış olan biryermi varki?

justice_for_all

timer la yapılan pwmler oyle oluyor bunun sebebi timer kesmesi olusmasıuzun suruyo olabilir veya timer kesme rutinindeki programlar fazla we islemesi uzun suruyo olabilir
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

emrah

hocam rgb ledli saat tasarladım son işlem olarak saati süren picten istenilen reng bilgisini gönderebilecegim bir rgb sürücüsü yapmak yaklaşık 240 adet rgb led çalışacak. önerebileceginiz baska devre varmıdır? pic ile kontrol edebilecegim. yada en yaygın 3 pwm çıkışlı pic hangisidir 16F yada 18F serisinden?

justice_for_all

Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

ete

#344
EmrahGS,

Programına yeniden bakmanı istiyorum.
Özellikle GOSUB BEKLE isimli komutla gidilen BEKLE gecikmesine bir bak istersen.
0 dan 100'e kadar döngü kurmuşsun ama araya PAUSE 1 koymuşsun. Diğer taraftan programın kesme kısmına bakarsak TMR0'a 254 değerini vererek çıkıyorsun. Bu şu anlama geliyor TMR= 254 den itibaren sayacak 255 olacak ve değer 0 olunca yeniden kesme oluşacak. Peki bu ne kadar sürer sence komutların bir gecikmesi olmasa topu topu 2 komut çevrimi yani 2 us lik bir sürede kesme olmasını hedeflemişsin. Teorik olarak mümkün ama pratikte böyle bir şey olması mümkün değil maalesef.
Üstelik Pause 1 gibi bir komut program içinde kullanmış isen. Bu komuta sıra gelince program orada 1000us bekleyecek daha sonra kesme oluştuğu için kesme etiketine gidecek.
Sen 2 us de kesme yaratmak istiyorsan bence o döngüye gecikme komutu bile koyma. Döngü adedini artır ama gecikmeyi oradan kaldır.
Programda çok fazla IF komutu var. Bunların hepsi epeyce bir komut gecikmesi yaratacağını unutma.
Bir trick vereyim; trick, butonların pulldown çalışması halinde geçerli yalnız.
IF PORTB.0=0 THEN DUTY_a=DUTY_a+1:GOSUB BEKLE  satırı yerine
DUTY_a=DUTY_A+PORTB.0 :GOSUB BEKLE şeklinde yaz bakalım ne olacak. Butona basılmış ise PORTB.0=1 olacağı için toplama sonucu Duty_A değeri bir artar. Ama butona basılmamış ise değer sürekli sıfır ekleneceği için değer değişmeyecektir.
BU mantığı diğer satırlarada uygularsan programında belirli bir hızlanma olacaktır.

Ete

Bilgi hazinedir paylaştıkça büyür.            http://etepic.com