Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

CCS Bölme Hatası

Başlatan rree, 05 Aralık 2011, 18:34:29

rree

CCS ver.4124  denmeler. CCS ver.4114  ile denendi

//Tanımlamalarım bazıları
#include <33FJ32MC204.h>
//#include <MotorDsPrj00.H>
#FUSES PR_PLL,HS,NOWDT,NODEBUG,NOJTAG 
#use delay(clock=80M,oscillator=10M)
#include <MotorDsLib.C>

#Define MotorHiziMaxFwDef 22050
#rom MotorHiziMaxFwDef={2000}//MotorHiziMaxFwDef motormax=200.0
int32 TempDegDW1;

#Define HizHSabiti 520833 

int16  HizsayacMin; //250// 200 Hz
int16  HizsayacMax; // 5208 //10 Hz
unsigned int16 MotorHiziMax; 


read_program_memory(22050,&MotorHiziMax, 2);
  TempAnaB1=MotorHiziMax;
  //HizsayacMin=HizHSabiti/2000;
   HizsayacMin=HizHSabiti/MotorHiziMax;


HizSayacMin=7  çıkıyor . HizsayacMin=260 çıkması lazım. Yanlışlık nerede.

İsis den 'MotorHiziMax'  değişkenin içeriğini bakıyorum '2000' değeri geliyor.
HizsayacMin=HizHSabiti/2000;

Programı sabit tanımlarsam sonuç doğru  HizsayacMin=260 oluyor. Ama ben rom bellekteki değeri değişken ile bölmek zorundayım.   

ErsinErce

32 bitlik değişken tanımlamanız gerekiyor, 16 bit en fazla 65535 değerini alır
260*2000=520.000

rree

int32 HizsayacMin; //250// 200 Hz
int32  HizsayacMax; // 5208 //10 Hz
int32 MotorHiziMax;

Yaptım yine aynı sonuc 7 çıkıyor.

ErsinErce

hiz sabitide 32b olmalı yoksa yanında belirtmek lazım
HizsayacMin=(int32)HizHSabiti/MotorHiziMax;

rree

Denedim yine olmadı bir bölmeyi yaptıramadım.
int32 HizsayacMin; 
int32  HizsayacMax; 
int32 MotorHiziMax; 
int32 TempDword1;


  MotorHiziMax=2000;
  TempDword1=520833;
  HizsayacMin=TempDword1/MotorHiziMax;


Bıraktım sabit tanımlamaları yinede HizsayacMin değeri niye 7 çıkıyor.

rree

HizsayacMin=520833/2000;

Değişken kullanmazsam  sonuc 260 doğru sonuç elde edebiliyorum.

GreeN

MotorHiziMax=2000;
  HizHSabiti = 520833;
   HizsayacMin=(int32)HizHSabiti/MotorHiziMax;
   HizsayacMax=HizHSabiti/MotorHiziMax;


sonuc 260 çıkıyor , Mplab ile izle değişkenleri , proteus sapıtıyor. ;)
Terörü Lanetliyoruz.

rree

İki gündür  kan ter içinde kaldım. Sağol en son bende onu bakıyordum. Şu an elimdeki proteus ver 7.72  ..
DSPIC33FJ32MC204 similesi doğru çalışan bir versiyonu varmıdır.

fahri-

proteusta değişkenleri izlerken formatına dikkat edin. int32 tanımlayıp formatı yanlış ayarlarsanız yanlış değer görürsünüz.

GreeN

Alıntı yapılan: rree - 06 Aralık 2011, 13:31:24
İki gündür  kan ter içinde kaldım. Sağol en son bende onu bakıyordum. Şu an elimdeki proteus ver 7.72  ..
DSPIC33FJ32MC204 similesi doğru çalışan bir versiyonu varmıdır.

https://www.picproje.org/index.php/topic,32841.0.html

7.8.sp2 de üstünkörü denemiştim bir problem kalmamıştı.
Terörü Lanetliyoruz.

rree

Proteus 7.8 Sp2 kurdum. Problem çözülmedi
Asm  ile kod yazdım durumu izlemek için.
int16 Bol_int16(int16 Ax,int16 Bx,int16 Cx)
{   

#Asm
  Clr W0
  MOV Ax,W1
  MOV Bx,W2
  DIV.S W1,W2
  MOV W0, _RETURN_
  MOV W0,C
#endasm
}

Ax=456 verdim
Bx=10 verdim
İsis de registerler izlenimler aşağıda.

1. komut W0 Regisrerini 0  atadım
4. Komutta bölme işlemi yaptıryorum.
   W0 =1 Değerini alıyor.
Sonuç 1 değeri ile geri dönüyor.

mcan

4.054 ile filan dene,benimde son surum ccs c ile problemlerim oldu yuzde yuz benim hatam degil onu biliyorum.

rree

Proteus 7.82 ile int16  bölmeyi yaptı.
int32 bit bölmeyi yapamıyor.

Asm list komutuna ve isi davranışına baktığımda 32bit CCS nin Çağırdığı kütüphaneyi bulamıyor.
....................   HizsayacMin=TempDword1/MotorHiziMax; 
058C:  BCLR.B  43.0
058E:  MOV     828,W0
0590:  MOV     82A,W1
0592:  MOV     838,W2
0594:  MOV     83A,W3
0596:  CALL    30C -----Burada bir zıplama oluyor "33FJ32MC204.h" dosyasına zıplıyor.
059A:  MOV     W0,830
059C:  MOV     W1,832

   Call 30C  kütüohanesine bulamıyor.

Hi-Tech de Dspic 16 bit işlemcinin 32bit bölme library varmıdır  ccs eklenebilirmi.

GreeN

Usta Mplab ile ccs c komutlarını deryebilirsin ve debug mplab sim ile kontrol et bölmeleri. orada çalışıyor. yazdığın komutta değişiklik yapmadan halledebilirsin.
Terörü Lanetliyoruz.

rree

Benim  sinyalleri izlemem  lazım. 200 hz lik 3 fazlı motor projemdi neredeyse sonuna gelmiştim.
İsis deki osilaskop ile açılarını pwm sinyallerini izliyorum.
Şu an geçici çözüm Double word to  word bölme  komutunu buldum. Asm ile yazdım sanırım işimi görecek.
Signed int32  A,B,C,D; 

Unsigned int16 Bol(Unsigned int32 Ax,Unsigned int16 Bx)
{
#Define AxH Ax+2
#Define AxL Ax 
#Asm
clr W0
Mov AxL,W2
Mov AxH,W3
Mov Bx,W4 
repeat #17 
Div.UD W2,W4
MOV W0, _RETURN_
#EndAsm
}
void main(void) // ----------------Ana Program---------------
{
 
  A = 520833 ;
  B = 2000  ;
  //C=A/B;
  C=Bol(A,B);
  
  while (TRUE) {    }   

}


Ben  dspic leri  çok iyi düşünüyordum. Assembler ile yazdığım yukarıdakı komutta bölme işlemini en az 20 cycle harcıyor.

16 bit işlemcilerde Double word / Double word bölme algoritması  bulursam asm ile bölme kütüphanesi oluştururum