Отговори на тема  [ 20 мнения ]  Отиди на страница 1, 2  Следваща
как да конвертирам десетично число в код на ад9833 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Яну 14, 2007 5:58 pm
Мнения: 67
Мнение как да конвертирам десетично число в код на ад9833
колеги здр,авейте ,пробвах да създам програма за първи път ,за пик + лцд + 4 бутона за реализация на генератор с ад9833
нещата се получават добре ,докато стигнах до ад9833
кажете ми как да организирам програмата ,тъи като задавам константи за 1,10,100,1000,10000,100000,1000000 Хз поглеждайки ги в прозиводителя за този 4ип но . опитите да направя пресмятащата част ,т.е. да конвертирам десетично зададени те ми стойностти в такива строго фиксирани стоиностти

значи немога да разбера ако за 1хз е 4000 400B
за 2 хз е 4000 4015
за 3 хз е 4000 4020

от 1хз към 2хз разликата е H'0A'
OT 2 hz do 3 hz -----------h'0B'

И Т.Н. основната разлика продължава да е '0В' , НО се случва по нататък по незнайна за мен пречина тази разлика между две съседни честоти да намалява до '0А'
ТОВА МЕ ОБЪРКА Е СЪМ ВЕЧЕ В ШАХ И МАТ
ПОМОГНЕТЕ МИ ДА РАЗБЕРА АЛГОРИТЪМА за ад9833


Нед Дек 20, 2009 10:25 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 10:28 am
Мнения: 2658
Мнение 
ами като за начало пробвай да си изтеглиш документацията на чипа, помага понякога :)


Нед Дек 20, 2009 10:56 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Яну 14, 2007 5:58 pm
Мнения: 67
Мнение 
това вече бях го правил,но специално немога да схвана ,как стават нещата, тъй като има формула пресмята се ,но не винаги отговарят на калкулирането което се прави в сайта
и от там нямам престава как да организирам програмата ,тъи като немога да рзбера какъв е редът в образуването на честотите
нека някои помогне ,даже да разгледам примерна програма ,стига да е писана на асемблер 4е С+ не го разбирам


Нед Дек 20, 2009 2:03 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение 
Абсолютно винаги отговаря, ами не си знаеш честотата на осцилатора дето клатиш АД-то.


Нед Дек 20, 2009 3:07 pm
Профил ICQ WWW
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Яну 14, 2007 5:58 pm
Мнения: 67
Мнение 
знам си я ,тази честота на осцилатора точно 25 Mхз

просто ми кажете стъпката не винаги е една и съ6та

значи самата програма която разглеждах ,явно не е е добре писана
ТАКА например нека за примера само да задам за настройка на единиците на ад9833, а другите уми6лено няма да ги пиша
така нека за FD7 (0 do 9) да задаваме произволно избрана от нас стойност ,като трябва да получим съответен код на za FB1, FB2, FB3, FB4
АМИ фактически не се получават реално всички правилно ,има някакъв гъдел в резултата когато настъпва пренос към старши разред и тогава се добавя към резултата h'01' t.e INCF FB(0-4).., F и така да получаваме правилна стойност,помагайте
;UNITS

INCF FD7,W ;REGISTER TO TEST FD7
MOVWF GP1

MOVLW H'00' ;OFFSET VALUE 10(X.1)=1Hz
MOVWF ADD1

MOVLW H'40'
MOVWF ADD2

MOVLW H'40'; NALOJENO DA SE PROMENI ----------------------------PROMENQNO NQKOLKO PATI
MOVWF ADD3

MOVLW H'0A'; TUK BE6E 0A
MOVWF ADD4

CALL ADD32


;SUBROUTINE ADD32

;ADDS THE OFFSET IN ADD1-4 TO FB1-4, GP1 TIMES

ADD32 DECF GP1,F ;DECREMENT GP1

BTFSC STATUS,Z ;RETURN IF ZERO
RETURN

MOVF ADD4,w ;ADD FB4+ADD4 (LS BYTE)
ADDWF FB4,f
BTFSC STATUS,C ;IF A BIT HAS CARRIED INCREMENT NEXT BYTE UP

INCF FB4,f ; TUKA BE6E FB3
GOTO ADD32

MOVF ADD3,W ;ADD FB3+ADD3
ADDWF FB3,F

BTFSC STATUS,C ;IF A BIT HAS CARRIED INCREMENT NEXT BYTE UP
INCF FB3,F

MOVF ADD2,W ;ADD FB2+ADD2
ADDWF FB2,F

BTFSC STATUS,C ;IF A BIT HAS CARRIED INCREMENT NEXT BYTE UP
INCF FB2,F

MOVF ADD1,W ;ADD FB1+ADD1 (MS BYTE)
ADDWF FB1,F
BTFSC STATUS,C
INCF FB1,F
GOTO ADD32


Нед Дек 20, 2009 4:13 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение 
Прочети това
Ако след това отново не успееш да схванеш, то по добре се откажи :)


Нед Дек 20, 2009 4:16 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Яну 14, 2007 5:58 pm
Мнения: 67
Мнение 
тази информация има разлика относно използваният от мен ад9833 ,нека помагат и други ,достъчно е някой който се е занимавал да ми обясни тука


Нед Дек 20, 2009 5:15 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение 
25Mhz oscillator
2^28 = 268435456

OSC/2^28 = step
step = 0.0931322574615478515625

1Hz = step * x
x = 1/step = 10.73741824 ~ 11 (проверка: 11х0.0931322574615478515625 = 1.0244548320770263671875 Хз) 11 в 16-тичен вид е 0x0B -> с толкова трябва да увеличаваш/намаляш 28 битовото число за да имаш стъпка 1Хз
Ще се наложи да работиш със закръгляне, или да смениш задаващия генератор с друг, при който пресмятането ти дава цели числа

За другите стъпки - по същия начин смяташ.

едит: Не забравяй, че това след десетичната запетая се натрупва и в един момент ще рефлектира на честотата - т.е честотата измерена на изхода ще е по голяма от тази която си искал да бъде


Нед Дек 20, 2009 5:36 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Яну 14, 2007 5:58 pm
Мнения: 67
Мнение 
помогнете ако ползвам генератор който да дава точни числа или как да се състои програмата и какжо аако трябва да се промени в побликуваната от мене така,че да се работи със закръгляне


Пон Дек 21, 2009 9:42 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение 
Ами на microchip на сайта трябва да има float routines. Като искаш точност - няма друг начин. По-лесния начин е да изоставиш асемблера. Ако си нагодиш осцилатора да ти работи с цели числа - какво толкова има да се мъдри. А и за 32бит аритемтика си има библиотеки.


Вто Дек 22, 2009 2:37 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение 
Разгледай този сорс код.


Вто Дек 22, 2009 4:59 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение 
Ето това работи:
Код:
program fgen;
uses ad9832_driver;

const
  //FCONST : real = 0.0018647; //@8 MHz Clock
  FCONST : real = 0.00232831;  //@10 MHz
  HZ1 : word = 536;   //1 Hz
  //MHZ1 : DWORD = 536334577;//280;//577;    //@8 MHz Clock
  MHZ1 : real = 429496729.6;  //@10 MHz
  //FADS : array[0..5] of DWORD = (HZ1,        HZ1 * 10,    HZ1 * 100,
  //                               HZ1 * 1000, HZ1 * 10000, HZ1 * 100000);
                                 
  FADS : array[0..5] of DWORD = ({(MHZ1 + 500000) div 1000000}{537}430, MHZ1 div 100000,
                                 MHZ1 div 10000, MHZ1 div 1000,
                                 MHZ1 div 100, MHZ1 div 10);
  STEP : array[0..5] of string[8] = ('   1 Hz', '  10 Hz', ' 100 Hz',
                                     '  1 kHz', ' 10 kHz', '100 kHz');

var
  d0, d1, d2, d3, i : byte;
  b1old, b2old, b3old, b4old : byte;
  freg : real;//dword; volatile;
  fsum : byte; volatile;
  freq_out : real;
  keypress : boolean;
 
  text: array[20] of char;
  f_text : string[17];
  line2 : string[16];
 



procedure setup_intosc;
begin
  OSCCON := %11110000; //8 MHz INTOSC
  OSCTUNE := %11000000;  //PLL Enabled For INTOSC
end;

procedure setup_AD9832;
begin
  TRISC.6 := 0;  //FSYNC bit
  PORTC.6 := 1;
end;

procedure Init_CPU;
begin
  ADCON1 := %00001111;
  CMCON := 7;
  TRISA := 255;
  TRISB := 0;
  //PORTB := 0;
  fsum :=4;
  freg := fads[fsum];
  //PORTB.fsum := 1;
  b1old := 0; b2old := 0;
  b3old := 0; b4old := 0;
  keypress := False;
end;

procedure Get_SWG_Data;
begin
  d3 := highest(freg);
  d2 := higher(freg);
  d1 := hi(freg);
  d0 := lo(freg);
end;

procedure Some_Delay;
begin
  Delay_ms(100);
end;

procedure LCD_Write;
begin
  //ByteToStr(fsum, text);
  line2 := STEP[fsum];
  freq_out := freg * FCONST;
  FloatToStr(freq_out, f_text);
  Lcd_Cmd(Lcd_Clear);
  //LCD_Out(1, 1, 'Fout= ');
  //LCD_Out_CP(f_text);
  //LCD_Out(1, 14, ' Hz');
  //LCD_Out(2, 1, 'Step: ');
  //LCD_Out_CP(line2);
 
  LCD_Out(1, 1, f_text);
  LCD_Out(2, 1, line2);
end;

procedure Set_Freq;
begin
  Get_SWG_Data;
  SWG_Set_Freq(d3, d2, d1, d0);
end;

begin

  //real test
    //freg := 5370;//00000;
    //freq_out := freg * FCONST;
  //end real test
  setup_intosc;
  setup_ad9832;
  Init_CPU;
 
  LCD_Config(PORTB, 3, 2, 1, 0, PORTB, 5, 6, 4);
  //LCD_Init(PORTB);
  //LCD_Config(PORTB, 7, 6, 5, 4, PORTB, 2, 1, 3);
  Some_Delay;
  LCD_CMD(LCD_CURSOR_OFF);
  LCD_Out(1, 1, 'FreqGen 1Hz-1MHz');
  LCD_Out(2, 1, ' radonen - 2009');
  Delay_ms(2000);
  LCD_Write;

  SPI_init;
  Some_Delay;
  SWG_Reset;
  Some_Delay;
  SWG_Select_Source(SWG_CTRL_SS_EXT);
  Some_Delay;

  Get_SWG_Data;
  SWG_Set_Freq(d3, d2, d1, d0);
 
  while True do
    begin

      if Button(PORTA, 0, 1, 1) then b1old := 255;
      if b1old and Button(PORTA, 0, 1, 0) then
        begin
          //PORTB.fsum := 0;
          fsum := fsum - 1;
          if fsum >= 6 then
            fsum := 0;
          //PORTB.fsum := 1;
         
          LCD_Write;
         
          b1old := 0;
        end;
       
      if Button(PORTA, 1, 1, 1) then b2old := 255;
      if b2old and Button(PORTA, 1, 1, 0) then
        begin
          //PORTB.fsum := 0;
          fsum := fsum + 1;
          if fsum > 5 then
            fsum := 5;
          //PORTB.fsum := 1;
         
          LCD_Write;
         
          b2old := 0;
        end;
       
      if Button(PORTA, 2, 1, 1) then b3old := 255;
      if b3old and Button(PORTA, 2, 1, 0) then
        begin
          freg := freg - fads[fsum];
          if (freg < fads[0]) or (freg > fads[5] * 10) then
            freg := fads[0];

          LCD_Write;
         
          b3old := 0;
          keypress := True;
        end;
       
      if Button(PORTA, 3, 1, 1) then b4old := 255;
      if b4old and Button(PORTA, 3, 1, 0) then
        begin
          freg := freg + fads[fsum];
          if freg > fads[5] * 10 then
            freg := fads[5] * 10;
           
          LCD_Write;
         
          b4old := 0;
          keypress := True;
        end;

      //LCD_Write;
      if keypress then
        begin
          Set_Freq;
          //keypress := False;
        end;
    end;
end.


Вто Дек 22, 2009 11:46 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 11:31 pm
Мнения: 10088
Мнение 
откога не бях виждал паскал... :-s то и ада не съм вижда отдавна, ма като че ли беше по-скоро
това как влиза в пик?


Вто Дек 22, 2009 11:55 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение 
ДедоБоре написа:
откога не бях виждал паскал... :-s то и ада не съм вижда отдавна, ма като че ли беше по-скоро
това как влиза в пик?


С Ctrl+F9 :D :D :D

Недей пита, че сега ще настане война тук... нали само на С трябва да се пише :lol: :lol: :lol:

http://www.mikroe.com/en/compilers/mikropascal/pro/pic/

Има и още 2-3 компилатора, единия е все едно драскаш на ТР7.


Сря Дек 23, 2009 12:20 am
Профил ICQ WWW
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Яну 14, 2007 5:58 pm
Мнения: 67
Мнение 
благодаря за съдействието на всички, само че разбирам само асемблер ,дано от вас знаещите да помагат на такова ниво


Сря Дек 23, 2009 12:22 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 20 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни