Picproje Elektronik Sitesi

DERLEYİCİLER => PIC C => Konuyu başlatan: hacettepeli_muhendis - 27 Temmuz 2004, 12:20:39

Başlık: basit sorun
Gönderen: hacettepeli_muhendis - 27 Temmuz 2004, 12:20:39
#if defined(__PCM__)
#include <16F84a.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4000000)
#endif

#byte port_b=6


int8 i;

BYTE const leds[4]={0b0010,0b0100,0b10000,0b0001};
void main()
{

  set_tris_b(0b11110000);

while(true){

  for(i=0;i<4;i++)
  {
     port_b=leds;
     delay_ms(50);
  }

}


}

PIC C programında bu kodu yazdım b0-b4 arasında ledlerin akarak yanmasını bekliyordum PIC Simulator IDE ve Proteus'da da denedim beklediğim gibi çalışıyordu simülasyonu programın ancak programı Pic e yüklediğimde beklediğim şey olmuyor sadece B1 bacağı high olup kalıyor eğer leds array inin ilk elemanını başka bişey yaparsam mesela
{0b0010,0b0100,0b10000,0b0001} yerine
{0b0001,0b0010,0b0100,0b10000} bu seferde B0 bacağı high olup kalıyor

ledler bacaklara 2.2k lık dirençlerle bağlı osc devresindeki kapasitörler 22uF di 100uF yaptım birşey değişmedi

high olan bacağın voltajına baktım 4.94V civarında yani fazla akımda çekmiyorum sanırım sizce sorun ne olabilir

şimdiden yardımınız için tşkler
Başlık: Re: basit sorun
Gönderen: DumrulBey - 27 Temmuz 2004, 12:34:09
Alıntı yapılan: "hacettepeli_engineer"...
while(true){
...
Yukarıdaki satırda "true" yerine "1" kullan bakalım düzelecek mi? Ayrıca HEX kodunu bir yere gönderirsen daha iyi analiz edebiliriz. Kodları foruma göndermek için "Code" düğmesini kullanmakta fayda var.

Eğer yazılımda bir dandiklik yoksa belki resetlemeyle alakası olabilir. MCLR' ucuna 10 K'lık bir direnç ile Vdd'ye bağladın mı? WDT diyeceğim ama onu iptal etmişsin. Aslında bir kere çalışıp başa dönüyor veya dizinin ilk elemanı gönderiliyor gibi. Allah Allah !!!

Başarılar...
Başlık: basit sorun
Gönderen: hacettepeli_muhendis - 27 Temmuz 2004, 12:50:16
MCLR yi direk bağladım 5V a ordan bi problem çıkıyor olabilir mi yani?


0000: 3000 008A 2821 0000 100A 108A 110A 0782  .Š!..Š.‚
0008: 3402 3404 3410 3401 300F 0084 0800 1903  .....„..
0010: 2820 3001 008D 018C 0B8C 2814 0B8D 2813  ..ŒŒ..
0018: 304A 008C 0B8C 281A 0000 0000 0B80 2811  JŒŒ...€.
0020: 2832 0184 301F 0583 30F0 0066 018E 080E  2„.ƒğfŽ.
0028: 3C03 1C03 2834 080E 2004 008D 0086 3032  ..4..†2
0030: 008F 280C 0A8E 2827 2826 0063 3FFF 3FFF  Â.Ž'&cÿÿ



; Generated by WinDis84, (c) Nigel Goodwin 1998.

           LIST      P=16F84, F=INHX8M
           include "P16FXX.inc"
           ORG     0x0000

           MOVLW   0x00
           MOVWF   PCLATH
           GOTO    Label_0001
           NOP
Label_0009  BCF     PCLATH    , 00
           BCF     PCLATH    , 01
           BCF     PCLATH    , 02
           ADDWF   PCL       , f
           RETLW   0x02
           RETLW   0x04
           RETLW   0x10
           RETLW   0x01
Label_000A  MOVLW   0x0F
           MOVWF   FSR
           MOVF    INDF      , W
           BTFSC   STATUS    , Z
           GOTO    Label_0002
Label_0006  MOVLW   0x01
           MOVWF   0x0D
Label_0004  CLRF    0x0C
Label_0003  DECFSZ  0x0C      , f
           GOTO    Label_0003
           DECFSZ  0x0D      , f
           GOTO    Label_0004
           MOVLW   0x4A
           MOVWF   0x0C
Label_0005  DECFSZ  0x0C      , f
           GOTO    Label_0005
           NOP
           NOP
           DECFSZ  INDF      , f
           GOTO    Label_0006
Label_0002  GOTO    Label_0007
Label_0001  CLRF    FSR
           MOVLW   0x1F
           ANDWF   STATUS    , f
           MOVLW   0xF0
           TRIS    PORTB
Label_000C  CLRF    0x0E
Label_000B  MOVF    0x0E      , W
           SUBLW   0x03
           BTFSS   STATUS    , C
           GOTO    Label_0008
           MOVF    0x0E      , W
           CALL    Label_0009
           MOVWF   0x0D
           MOVWF   PORTB
           MOVLW   0x32
           MOVWF   0x0F
           GOTO    Label_000A
Label_0007  INCF    0x0E      , f
           GOTO    Label_000B
Label_0008  GOTO    Label_000C
           SLEEP

           ORG     0x2000
           DATA    0x0F
           DATA    0x0F
           DATA    0x0F
           DATA    0x0F

           ORG     0x2007
           DATA    0x19

           ORG     0x2100
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF
           DATA    0xFF

           END


Checksum:C0E2
ID Value:FFFF

Config Word:3FF9h
Başlık: SLEEP!
Gönderen: DumrulBey - 27 Temmuz 2004, 12:56:31
İlk gördüğüm SLEEP komutu idi. PIC mışıl mışıl uyuyor galiba...:)

Kodu tam incelemedim ama muhtemelen ondan. PIC C fazla bilmiyorum, o yüzden bir şekilde SLEEP olayını iptal etmen gerekiyor herhalde. Başka bir şey bulursam iletirim...
Başlık: basit sorun
Gönderen: z - 27 Temmuz 2004, 15:09:42
PIC16F84 için 0x2000 adresi anlamsız geldi. Büyük olasılıkla kodların ezilmesine neden oluyor.

Daha önce goto ile dallanıldığı için sleep komutu sorun oluşturmayacak.

2.2K da led için yeterli parlaklığı vermeyecektir. 330R daha iyi.
Başlık: Re: basit sorun
Gönderen: baba - 27 Temmuz 2004, 15:18:32
Alıntı yapılan: "hacettepeli_engineer"

ledler bacaklara 2.2k lık dirençlerle bağlı osc devresindeki kapasitörler 22uF di 100uF yaptım birşey değişmedi

mclr 10K direnç ile ya da doğrudan (farketmez) vdd'ye çekmek yeterli.
dirençler için 470R iyi olur.
osc kondansatörü;
yanlış yazdın sanıyorum mikrofarad değil pikofarad olacak değil mi....(4Mhz için 22piko tak)
Başlık: basit sorun
Gönderen: hacettepeli_muhendis - 27 Temmuz 2004, 15:27:13
mikro yazdım pikomu olması lazım? ayrıca bu kadar kritik mi?

470 ohm takarsam daha fazla akım çekmiş olmamı ben fazla çekmiyim diye 2.2k takmıştım ama bide onları deniyim elimde pF kond yok bide RC osc deniyim
Başlık: basit sorun
Gönderen: z - 27 Temmuz 2004, 15:27:39
BYTE const leds[4]={0b0010,0b0100,0b10000,0b0001}; Buda hatalı ama hayati değil ledlerden birisi hiç yanmaz sadece.

BYTE const leds[4]={0b0010,0b0100,0b1000,0b0001}; olmalı

Hic bir şey değiştirmeden verdiğin Asm kodlarda org 0x2000 END arasını silip asm derleyici ile derlesen çalıştığını göreceksin.
Başlık: basit sorun
Gönderen: baba - 27 Temmuz 2004, 15:54:50
ooo

piko olmalı

mikro değil

aralarında tam 1milyon kat fark var..
Başlık: basit sorun
Gönderen: hacettepeli_muhendis - 27 Temmuz 2004, 15:58:39
ok silip deniyim ama o kodu ben yazmadım PCW nin ürettiği kod o şekilde

o kodu ic-prog koyuyor disassemble diyince

asıl kod şu şekilde


CCS PCM C Compiler, Version 3.203, 16465

              Filename: D:\PIC\PICC\myworx\deneme.LST

              ROM used: 62 words (6%)
                        Largest free fragment is 962
              RAM used: 3 (4%) at main() level
                        4 (6%) worst case
              Stack:    1 locations

*
0000:  MOVLW  00
0001:  MOVWF  0A
0002:  GOTO   019
0003:  NOP
....................
.................... #if defined(__PCM__)
.................... #include <16F84a.h>
....................  //////// Standard Header file for the PIC16F84A device ////////////////
.................... #device PIC16F84A
.................... #list
....................
.................... #fuses XT,NOWDT,NOPROTECT
.................... #use delay(clock=4000000)
0004:  MOVLW  0F
0005:  MOVWF  04
0006:  MOVF   00,W
0007:  BTFSC  03.2
0008:  GOTO   018
0009:  MOVLW  01
000A:  MOVWF  0D
000B:  CLRF   0C
000C:  DECFSZ 0C,F
000D:  GOTO   00C
000E:  DECFSZ 0D,F
000F:  GOTO   00B
0010:  MOVLW  4A
0011:  MOVWF  0C
0012:  DECFSZ 0C,F
0013:  GOTO   012
0014:  NOP
0015:  NOP
0016:  DECFSZ 00,F
0017:  GOTO   009
0018:  RETLW  00
.................... #endif
....................
.................... #byte port_b=6
....................
.................... int8 i;
....................
.................... BYTE const leds[4]={0b0001,0b0010,0b0100,0b1000};
.................... void main()
.................... {
0019:  CLRF   04
001A:  MOVLW  1F
001B:  ANDWF  03,F
....................
....................    set_tris_b(0b11110000);
001C:  MOVLW  F0
001D:  TRIS   6
....................
.................... while(true){
....................    port_b=0b0001;
001E:  MOVLW  01
001F:  MOVWF  06
....................
....................    for(i=1;i<4;i++)
0020:  MOVWF  0E
0021:  MOVF   0E,W
0022:  SUBLW  03
0023:  BTFSS  03.0
0024:  GOTO   02C
....................    {
....................       delay_ms(50);
0025:  MOVLW  32
0026:  MOVWF  0F
0027:  CALL   004
....................       port_b=port_b*2;
0028:  BCF    03.0
0029:  RLF    06,F
....................    }
002A:  INCF   0E,F
002B:  GOTO   021
....................
....................    for(i=4;i>1;i--)
002C:  MOVLW  04
002D:  MOVWF  0E
002E:  MOVF   0E,W
002F:  SUBLW  01
0030:  BTFSC  03.0
0031:  GOTO   039
....................    {
....................       delay_ms(50);
0032:  MOVLW  32
0033:  MOVWF  0F
0034:  CALL   004
....................       port_b=port_b/2;
0035:  BCF    03.0
0036:  RRF    06,F
....................    }
0037:  DECF   0E,F
0038:  GOTO   02E
....................    delay_ms(50);
0039:  MOVLW  32
003A:  MOVWF  0F
003B:  CALL   004
....................
....................
.................... }
003C:  GOTO   01E
....................
....................
.................... }
....................
003D:  SLEEP

Configuration Fuses:
  Word  1: 3FF9   XT NOWDT NOPUT NOPROTECT



sanırım kapasitörlerden oluyor 22pF bulup tekrar deniim sonucu yazarım
Başlık: basit sorun
Gönderen: z - 27 Temmuz 2004, 16:35:51
Normalde 0x2000 ve sonrası adresler kod alanı değil. Kullandığın
simülator bu alanı program alanına dahil edebilir yada dairesel hale getirip ana kodun baştarafını ezebilir. Sadece yorumum ve doğru mu bilemem.

O yüzden asm den o kısmı silip atmanı önermiştim. Proteusda dediğim gibi yapınca çalıştı çünkü.
Başlık: basit sorun
Gönderen: hacettepeli_muhendis - 27 Temmuz 2004, 16:42:07
proetus da çalışıyor zaten program pic simulator ide de de çalışıyor

hardware sorunu var sanırım şu kapasitörler ama proetusda kristal bağlayıp 22uF bağlayıp denemiştim çalışıyordu

ee sizde şimdi diyeceksiniz "gerçek dünya ya hoşgeldin"  :)
Başlık: basit sorun
Gönderen: z - 27 Temmuz 2004, 16:54:14
Kusura bakma ilk yazını hızlıca okuduğumda proteusda da çalışmıyor şeklinde algıladım. (Bu hatayı çok yaparım.)

Arkadaşlar yazmıştı, Xtal kapasiteleri için 22-47 piko aralığında kondansatör seç.
Başlık: basit sorun
Gönderen: tnen - 27 Temmuz 2004, 17:15:51
Merhaba dostlar. Bendende bir fikir set_tris_b yi 0xf0 yap belki 0b11110000 den kaynaklanıyor olabilir bir de dedlerin yanma suresi 50ms ye yazmıssın bunu gözün algılayamaz bence bunu biraz daha yükselt mesela 500ms ye yap birde böyle dene .Bende yeni basladım C ile calışmaya ama int8 i yerine int i yazsak ne olur diye dir düsünce aldı beni
hadi kolay gelsin..
Başlık: basit sorun
Gönderen: hacettepeli_muhendis - 27 Temmuz 2004, 17:40:24
int8 i kendime kolay geldiği için yazıyorum int te aynı şey sanırım

8 i görünce 2^8=256 aklıma geliyor o bakımdan

tüm portları out port yapıp yine denemiştim

delay_ms(10000) de denedim 10sn yeterli sanırım gözüm için yine bişey değişmemişti :)
Başlık: basit sorun
Gönderen: tnen - 28 Temmuz 2004, 10:07:33
#if defined(__PCM__)
#include <16F84a.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4000000)
#endif

#byte port_b=6


int i;

BYTE const leds[4]={0x01,0x02,0x04,0x08};
void main()
{
set_tris_b(0b11110000);

while(true){

for(i=0;i<4;i++)
{
port_b=leds;
delay_ms(500);
}

}


}


birde bu sekilde dene dostum bakalım calısacak mı
bu arada int8 in ne anlama geldigini ögrendim. Tesekkurler dostum. Adamlar int32 bile tanımlamıslar ya.
Başlık: basit sorun
Gönderen: hacettepeli_muhendis - 28 Temmuz 2004, 11:17:01
ok hocam bide bunu deniyim sağol
Başlık: basit sorun
Gönderen: tnen - 28 Temmuz 2004, 15:36:52
:1000000000308A00212800000A108A100A11820795
:100010000134023404340834103084000008031919
:10002000202801308D008C018C0B14288D0B132897
:100030004A308C008C0B1A2800000000800B11281D
:10004000342884011F308305F03066008E010E08CD
:10005000033C031C38280E0804208D008600023063
:100060008F00FA3090000C288F0B31288E0A272839
:0400700026286300DB
:02400E00F93F78
:00000001FF
;PIC16F84A


Buda hex hali hocam derlerken bir olay mı var da  calışmıyo senin program bi karşılaştırırsın. Hadi kolay gelsin umarım calışır.
Başlık: basit sorun
Gönderen: hacettepeli_muhendis - 28 Temmuz 2004, 22:39:07
hex te problem yok sanırım olay şu 22pF lık kapasitörlerde bitiyor
Başlık: basit sorun
Gönderen: hacettepeli_muhendis - 30 Temmuz 2004, 22:07:38
beyler tşkler sorun kapasitörlermiş tahmin ettiğimiz gibi  22pF bulamadım ama 15pF ve 10pF lık iki tanesi işimi gördü tşkler  8)