#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
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...
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
İ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...
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.
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)
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
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.
ooo
piko olmalı
mikro değil
aralarında tam 1milyon kat fark var..
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
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ü.
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" :)
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ç.
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..
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 :)
#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.
ok hocam bide bunu deniyim sağol
: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.
hex te problem yok sanırım olay şu 22pF lık kapasitörlerde bitiyor
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)