CCS SAYI AYIRMAK 74595 İÇİN

Başlatan kalman, 20 Haziran 2005, 18:16:58

kalman

@ Arkadaşlar


Bir sayıyı 4 bölmem gerekiyor örneğin  4268 bunların her biri 4 tane 74hc595 e gitmeli PBP de bu DIG komutuyla oluyor gayet basit fakat
CCS de nasıl olduğu hakkında bilgim yok

1. 74595 e 8 sayısı
2. 74595 e  6 sayısı
3. 74595 e  2 sayısı
4. 74595 e  4 sayısı  gitmesi gerekiyor

Tabi bu değer program akışında devamlı değişiyor bu ccs de pbp kadar kolaymı

Bu konuda düşünceleriniz  :roll:

herkese başarılar

saygılarımla

SpeedyX

for (i=0;i<10;i++) {
  c[i]=b%10;  //(b MOD 10), c[i] = kalan
  b=b-c[i];   //(b - kalan),
  b=b/10;     //(b DIV 10)
}

pbp kadar kolay mı?

Erol YILMAZ

DIG komutunu kullanmadim bilmiyorum ama cok pratik bir fonksiyon oldugunu tahmin ediyorum.

     display[3]=0;
      display[2]=0;
      display[1]=0;
      display[0]=0;

      while(deger>=1000) {  display[3]++;   deger -= 1000; }
      while(deger>=100)  {  display[2]++;   deger -= 100;  }
      while(deger>=10)   {  display[1]++;   deger -= 10;   }
      while(deger>=1)    {  display[0]++;   deger -= 1;    }


Speedyx en kisa olani yazmis belki ama en uzun kodu da ben yazayim istedim :)

deger parcalanacak sayimiz, display[] cikan sayilarimizdir.

kalman

@speedyx ve Erol

acaba bunların 74595 ile toplu bir örneği varmı vermiş olduğunuz cevaplar
için teşekkürler

switch case komutuyla denedim olmuyor constant istiyor

mesala int değer[3] oluşsun

Switch (değer)

case değer[0]
......

aslında tüm olay PBP de çok basit değeri 4 haneye ayır her hanenin karşılığını daha önce kaydedilen değerle karşılaştır mesala 3e karşılık
3 sayısının değerini bul ve sırasıyla shiftout komutuyla gönder bunu yaptım ve gayet iyi çalışıyor fakat PBP in interruptları soft olduğundan dolayı ccS ile yapmak istiyorum

Acaba bu konuda ccs uzmanları yardım edebilirlermi ???

herkese başarılar dilerim

Saygılarımla

Petek

Jal math rutinlerinin test işlemlerinde kullandığım bin2bcd3 proceduru var. Google dan araştırısanız da bulabilirsiniz. 2 baytlık binary sayıyı 3 bayt BCD sayıya dönüştürüyor (6 basamağa kadar ama 2 bayt ile en fazla 5 basamak elde edilir). Siz bu rutini kullanırsanız 3 baytlık BCD değişkenlerinden ilk ikisini alıp kullanacaksınız.

Sizin örnekteki sayınız olan 4268 sayıyı  iki bayt olarak rutine gönderdiğinizde geri dönüşte diğer 3 baytlık değişkende

BCD3 = 0
BCD2 = 0x42
BCD1 = 0x68
olur. Bunları rahatlıkla 595 e gönderebilirsiniz.

Bir ara CCS için de yazmıştım. Bulursam göndereyim.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

Petek

Aşağıdaki örnek işinizi görür.
#include <16f628.h>
#Fuses HS,NOWDT,NOBROWNOUT,NOMCLR
#use delay (clock=4000000)

//#include <bin2bcd3.c>


//---- bin2bcd3 başladı ----
void AdjBcd(int8 *digit)
{
 int8 temp;
 temp = *digit + 3;
 if(bit_test(temp,3)) *digit = temp;
 temp = *digit + 0x30;
 if(bit_test(temp,7)) *digit = temp;
}

void bin2bcd3(int8 *bcd2, int8 *bcd1, int8 *bcd0,
              int8 bin1, int8 bin0)
{byte i, b2, b1, b0;
 b2=0;
 b1=0;
 b0=0;
 for(i=0;i<16;i++)
   {
    AdjBcd(&b0);
    AdjBcd(&b1);
    AdjBcd(&b2);
    #Asm
	    rlf bin0,f
	    rlf bin1,f
	    rlf b0,f
	    rlf b1,f
	    rlf b2,f
    #EndAsm
   }
 *bcd2=b2;
 *bcd1=b1;
 *bcd0=b0;
}
//---- bin2bcd3 bitti -----

main()
{
 byte bin0, bin1, i, bcd2, bcd1, bcd0, bb;
 bin1=0x01; bin0=0x80; // desimal 384
 bin2bcd3(&bcd2, &bcd1, &bcd0, bin1, bin0);
 bb = 0; 
}


Bu da başka bir yöntem
a3= data/1000;
        tmp=data%1000;
        a2  = tmp / 100;
        tmp = tmp % 100;
        a1  = tmp / 10 ;
        a0  = tmp % 10;
        printf(" %d%d%d%d", a3,a2,a1,a0);
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

kalman

@selam petek ve Speedyx verdiğiniz kodları denedim kısa olduğu için

o başka bir yöntem dediğiniz kodla denedim Lcd yazdırdım fakat her nedense sonuç doğru çıkmadı ben 4268 sayısını verdim program ise
0 1 7 2 sayısını lcd ye yazdı

ben size kodu aşağıda veriyorum
#include <lcd.c>
#define LCD_BLANK() {lcd_send_byte(0,1);delay_ms(2);}

void main()
{

int  a3,a2,a1,a0;
 INT TMP;
int data;


lcd_init();
lcd_blank();
data=4268;

 a3= data/1000; 
        tmp=data%1000; 
        a2  = tmp / 100; 
        tmp = tmp % 100; 
        a1  = tmp / 10 ; 
        a0  = tmp % 10; 
 
     printf(lcd_putc," %d  %d %d %d", a3,a2,a1,a0);

Hata nerde Çözemedim
cevaplar için çok teşekkürler
Saygılarımla

kalman

Düzeltiyorum Arkadaşlar
Program Çalışıyor sadece değişkenlerin tipini değiştirmek lazım
eğer 255 ten büyük sayılarla çalışılırsa


sadece
long data
long Tmp
yapın

herkese başarılar

Saygılarımla

Petek

Kalman, kusura bakma, değişken boyutunu yazmamışım.
data ve tmp bende int16 olarak tanımlı.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

CaFFeiNe

Alıntı yapılan: "Erol"
     display[3]=0;
      display[2]=0;
      display[1]=0;
      display[0]=0;

      while(deger>=1000) {  display[3]++;   deger -= 1000; }
      while(deger>=100)  {  display[2]++;   deger -= 100;  }
      while(deger>=10)   {  display[1]++;   deger -= 10;   }
      display[0] = deger;

birazcık daha kısaldı :)

Erol YILMAZ

Alıntı yapılan: "CaFFeiNe"
Alıntı yapılan: "Erol"
     display[3]=0;
      display[2]=0;
      display[1]=0;
      display[0]=0;

      while(deger>=1000) {  display[3]++;   deger -= 1000; }
      while(deger>=100)  {  display[2]++;   deger -= 100;  }
      while(deger>=10)   {  display[1]++;   deger -= 10;   }
      display[0] = deger;

birazcık daha kısaldı :)

O halde son hali nedir? :)

SpeedyX

tüh bende zannettim o kod daha az yer kaplıyor, herşeyi bırakıp analiz yaptım, 16F serisi için durum:

c:
void DigitAyir(int16 b) {
      c[3]=0;
      c[2]=0;
      c[1]=0;
      c[0]=0;

      while(b>=1000) {  c[3]++;   b -= 1000; }
      while(b>=100)  {  c[2]++;   b -= 100;  }
      while(b>=10)   {  c[1]++;   b -= 10;   }
      while(b>=1)    {  c[0]++;   b -= 1;    }
}

asm:
.................... void DigitAyir(int16 b) { 
....................       c[3]=0; 
*
0410:  CLRF   3C
....................       c[2]=0; 
0411:  CLRF   3B
....................       c[1]=0; 
0412:  CLRF   3A
....................       c[0]=0; 
0413:  CLRF   39
....................  
....................       while(b>=1000) {  c[3]++;   b -= 1000; } 
0414:  MOVF   5F,W
0415:  SUBLW  02
0416:  BTFSC  03.0
0417:  GOTO   427
0418:  XORLW  FF
0419:  BTFSS  03.2
041A:  GOTO   41F
041B:  MOVF   5E,W
041C:  SUBLW  E7
041D:  BTFSC  03.0
041E:  GOTO   427
041F:  INCF   3C,F
0420:  MOVLW  E8
0421:  SUBWF  5E,F
0422:  MOVLW  03
0423:  BTFSS  03.0
0424:  MOVLW  04
0425:  SUBWF  5F,F
0426:  GOTO   414
....................       while(b>=100)  {  c[2]++;   b -= 100;  } 
0427:  MOVF   5F,F
0428:  BTFSS  03.2
0429:  GOTO   42E
042A:  MOVF   5E,W
042B:  SUBLW  63
042C:  BTFSC  03.0
042D:  GOTO   436
042E:  INCF   3B,F
042F:  MOVLW  64
0430:  SUBWF  5E,F
0431:  MOVLW  00
0432:  BTFSS  03.0
0433:  MOVLW  01
0434:  SUBWF  5F,F
0435:  GOTO   427
....................       while(b>=10)   {  c[1]++;   b -= 10;   } 
0436:  MOVF   5F,F
0437:  BTFSS  03.2
0438:  GOTO   43D
0439:  MOVF   5E,W
043A:  SUBLW  09
043B:  BTFSC  03.0
043C:  GOTO   445
043D:  INCF   3A,F
043E:  MOVLW  0A
043F:  SUBWF  5E,F
0440:  MOVLW  00
0441:  BTFSS  03.0
0442:  MOVLW  01
0443:  SUBWF  5F,F
0444:  GOTO   436
....................       while(b>=1)    {  c[0]++;   b -= 1;    } 
0445:  MOVF   5F,F
0446:  BTFSS  03.2
0447:  GOTO   44C
0448:  MOVF   5E,W
0449:  SUBLW  00
044A:  BTFSC  03.0
044B:  GOTO   454
044C:  INCF   39,F
044D:  MOVLW  01
044E:  SUBWF  5E,F
044F:  MOVLW  00
0450:  BTFSS  03.0
0451:  MOVLW  01
0452:  SUBWF  5F,F
0453:  GOTO   445
.................... } 
0454:  RETLW  00

81 satır...

c:
void DigitAyir(int16 b) {
   byte i;
   for (i=0;i<4;i++) {
     c[i]=b%10;
     b-=c[i];
     b/=10;
   }
}

asm:
.................... void DigitAyir(int16 b) {
....................    byte i; 
....................    for (i=0;i<4;i++) { 
*
0435:  CLRF   60
0436:  MOVF   60,W
0437:  SUBLW  03
0438:  BTFSS  03.0
0439:  GOTO   460
....................      c[i]=b%10;  //(b MOD 10), c[i] = kalan 
043A:  MOVLW  39
043B:  ADDWF  60,W
043C:  MOVWF  04
043D:  BCF    03.7
043E:  MOVF   5F,W
043F:  MOVWF  64
0440:  MOVF   5E,W
0441:  MOVWF  63
0442:  CLRF   66
0443:  MOVLW  0A
0444:  MOVWF  65
0445:  CALL   410
0446:  MOVF   77,W
0447:  MOVWF  00
....................      b-=c[i];   //(b - kalan), 
0448:  MOVLW  39
0449:  ADDWF  60,W
044A:  MOVWF  04
044B:  BCF    03.7
044C:  MOVF   00,W
044D:  SUBWF  5E,F
044E:  MOVLW  00
044F:  BTFSS  03.0
0450:  MOVLW  01
0451:  SUBWF  5F,F
....................      b/=10;     //(b DIV 10) 
0452:  MOVF   5F,W
0453:  MOVWF  64
0454:  MOVF   5E,W
0455:  MOVWF  63
0456:  CLRF   66
0457:  MOVLW  0A
0458:  MOVWF  65
0459:  CALL   410
045A:  MOVF   79,W
045B:  MOVWF  5F
045C:  MOVF   78,W
045D:  MOVWF  5E
....................    } 
045E:  INCF   60,F
045F:  GOTO   436
.................... } 
0460:  RETLW  00

53 satır.

M_B

Herkese merhaba
Yenı konu acmak ıstemedıgımden buraya sorunumu yazmak ıstedım.
Sorunum burayla alakalı.

4 tane 7 segmentli dısplayde 12,25  veya 3,54 rakamlarını
gostermek ıstıyorum. burda takıldıgım yer virgul kısmını nasıl yapacagım.
Bu konuda fıkrı olan arkadaslardan yardım bekliyorum.

Tesekkurler
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet