Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

как да конвертирам десетично число в код на ад9833
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=7405
Страница 1 от 2

Автор:  excitron [ Нед Дек 20, 2009 10:25 am ]
Заглавие:  как да конвертирам десетично число в код на ад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

Автор:  zaphod [ Нед Дек 20, 2009 10:56 am ]
Заглавие: 

ами като за начало пробвай да си изтеглиш документацията на чипа, помага понякога :)

Автор:  excitron [ Нед Дек 20, 2009 2:03 pm ]
Заглавие: 

това вече бях го правил,но специално немога да схвана ,как стават нещата, тъй като има формула пресмята се ,но не винаги отговарят на калкулирането което се прави в сайта
и от там нямам престава как да организирам програмата ,тъи като немога да рзбера какъв е редът в образуването на честотите
нека някои помогне ,даже да разгледам примерна програма ,стига да е писана на асемблер 4е С+ не го разбирам

Автор:  relsys [ Нед Дек 20, 2009 3:07 pm ]
Заглавие: 

Абсолютно винаги отговаря, ами не си знаеш честотата на осцилатора дето клатиш АД-то.

Автор:  excitron [ Нед Дек 20, 2009 4:13 pm ]
Заглавие: 

знам си я ,тази честота на осцилатора точно 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

Автор:  michev [ Нед Дек 20, 2009 4:16 pm ]
Заглавие: 

Прочети това
Ако след това отново не успееш да схванеш, то по добре се откажи :)

Автор:  excitron [ Нед Дек 20, 2009 5:15 pm ]
Заглавие: 

тази информация има разлика относно използваният от мен ад9833 ,нека помагат и други ,достъчно е някой който се е занимавал да ми обясни тука

Автор:  michev [ Нед Дек 20, 2009 5:36 pm ]
Заглавие: 

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Хз
Ще се наложи да работиш със закръгляне, или да смениш задаващия генератор с друг, при който пресмятането ти дава цели числа

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

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

Автор:  excitron [ Пон Дек 21, 2009 9:42 pm ]
Заглавие: 

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

Автор:  Cekins [ Вто Дек 22, 2009 2:37 pm ]
Заглавие: 

Ами на microchip на сайта трябва да има float routines. Като искаш точност - няма друг начин. По-лесния начин е да изоставиш асемблера. Ако си нагодиш осцилатора да ти работи с цели числа - какво толкова има да се мъдри. А и за 32бит аритемтика си има библиотеки.

Автор:  michev [ Вто Дек 22, 2009 4:59 pm ]
Заглавие: 

Разгледай този сорс код.

Автор:  relsys [ Вто Дек 22, 2009 11:46 pm ]
Заглавие: 

Ето това работи:
Код:
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:55 pm ]
Заглавие: 

откога не бях виждал паскал... :-s то и ада не съм вижда отдавна, ма като че ли беше по-скоро
това как влиза в пик?

Автор:  relsys [ Сря Дек 23, 2009 12:20 am ]
Заглавие: 

ДедоБоре написа:
откога не бях виждал паскал... :-s то и ада не съм вижда отдавна, ма като че ли беше по-скоро
това как влиза в пик?


С Ctrl+F9 :D :D :D

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

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

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

Автор:  excitron [ Сря Дек 23, 2009 12:22 am ]
Заглавие: 

благодаря за съдействието на всички, само че разбирам само асемблер ,дано от вас знаещите да помагат на такова ниво

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/