|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 7:10 am
как да конвертирам десетично число в код на ад9833
| Автор |
Съобщение |
|
excitron
Ранг: Минаващ
Регистриран на: Нед Яну 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 |
|
 |
|
zaphod
Ранг: Форумен бог
Регистриран на: Нед Юли 24, 2005 10:28 am Мнения: 2658
|
ами като за начало пробвай да си изтеглиш документацията на чипа, помага понякога 
|
| Нед Дек 20, 2009 10:56 am |
|
 |
|
excitron
Ранг: Минаващ
Регистриран на: Нед Яну 14, 2007 5:58 pm Мнения: 67
|
това вече бях го правил,но специално немога да схвана ,как стават нещата, тъй като има формула пресмята се ,но не винаги отговарят на калкулирането което се прави в сайта
и от там нямам престава как да организирам програмата ,тъи като немога да рзбера какъв е редът в образуването на честотите
нека някои помогне ,даже да разгледам примерна програма ,стига да е писана на асемблер 4е С+ не го разбирам
|
| Нед Дек 20, 2009 2:03 pm |
|
 |
|
relsys
Ранг: Форумен бог
Регистриран на: Пет Ное 25, 2005 11:41 am Мнения: 1680
|
Абсолютно винаги отговаря, ами не си знаеш честотата на осцилатора дето клатиш АД-то.
|
| Нед Дек 20, 2009 3:07 pm |
|
 |
|
excitron
Ранг: Минаващ
Регистриран на: Нед Яну 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 |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
Прочети това
Ако след това отново не успееш да схванеш, то по добре се откажи 
|
| Нед Дек 20, 2009 4:16 pm |
|
 |
|
excitron
Ранг: Минаващ
Регистриран на: Нед Яну 14, 2007 5:58 pm Мнения: 67
|
тази информация има разлика относно използваният от мен ад9833 ,нека помагат и други ,достъчно е някой който се е занимавал да ми обясни тука
|
| Нед Дек 20, 2009 5:15 pm |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 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 |
|
 |
|
excitron
Ранг: Минаващ
Регистриран на: Нед Яну 14, 2007 5:58 pm Мнения: 67
|
помогнете ако ползвам генератор който да дава точни числа или как да се състои програмата и какжо аако трябва да се промени в побликуваната от мене така,че да се работи със закръгляне
|
| Пон Дек 21, 2009 9:42 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
Ами на microchip на сайта трябва да има float routines. Като искаш точност - няма друг начин. По-лесния начин е да изоставиш асемблера. Ако си нагодиш осцилатора да ти работи с цели числа - какво толкова има да се мъдри. А и за 32бит аритемтика си има библиотеки.
|
| Вто Дек 22, 2009 2:37 pm |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
|
| Вто Дек 22, 2009 4:59 pm |
|
 |
|
relsys
Ранг: Форумен бог
Регистриран на: Пет Ное 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 |
|
 |
|
ДедоБоре
Ранг: Форумен бог
Регистриран на: Нед Ное 21, 2004 11:31 pm Мнения: 10088
|
откога не бях виждал паскал...  то и ада не съм вижда отдавна, ма като че ли беше по-скоро
това как влиза в пик?
|
| Вто Дек 22, 2009 11:55 pm |
|
 |
|
relsys
Ранг: Форумен бог
Регистриран на: Пет Ное 25, 2005 11:41 am Мнения: 1680
|
|
| Сря Дек 23, 2009 12:20 am |
|
 |
|
excitron
Ранг: Минаващ
Регистриран на: Нед Яну 14, 2007 5:58 pm Мнения: 67
|
благодаря за съдействието на всички, само че разбирам само асемблер ,дано от вас знаещите да помагат на такова ниво
|
| Сря Дек 23, 2009 12:22 am |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 1 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|