basit sorun

Başlatan hacettepeli_muhendis, 27 Temmuz 2004, 12:20:39

hacettepeli_muhendis

#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
Dünyada 10 çeşit insan vardır binary saymayı bilenler ve bilmeyenler

DumrulBey

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...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

hacettepeli_muhendis

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
Dünyada 10 çeşit insan vardır binary saymayı bilenler ve bilmeyenler

DumrulBey

İ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...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

z

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.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

baba

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)
ÖĞRENDİKÇE    CAHİLLİĞİM       ARTIYOR.

hacettepeli_muhendis

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
Dünyada 10 çeşit insan vardır binary saymayı bilenler ve bilmeyenler

z

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.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

baba

ooo

piko olmalı

mikro değil

aralarında tam 1milyon kat fark var..
ÖĞRENDİKÇE    CAHİLLİĞİM       ARTIYOR.

hacettepeli_muhendis

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
Dünyada 10 çeşit insan vardır binary saymayı bilenler ve bilmeyenler

z

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ü.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

hacettepeli_muhendis

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"  :)
Dünyada 10 çeşit insan vardır binary saymayı bilenler ve bilmeyenler

z

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ç.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

tnen

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..

hacettepeli_muhendis

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 :)
Dünyada 10 çeşit insan vardır binary saymayı bilenler ve bilmeyenler