; SINDDS10.ASM voir annexes en fin de ce fichier ; Check avec Fluke 199 scopmeter 200Mhz 2,5Gs/S ! ; la relation montre que le nb de cycle à prendre en compte est de 26 au lieu de 28 ; rev 10/09/04 ..pb sur table sinus il faut "128-Sin(x)" et non pas "128+sin(x)" ; car le DAC 588 sort 2,56V pour FF = 8 entree en l'air (8 bits NON SIGNES) ; PB turn over indice 34 .. modif ..sir incr indice à 36 =>retour à 0 ; ..donc indice=0 =0,1Hz à indice=35=1500Hz (sinus sur 128 pas) inclus ; probleme en milieu de table ; 255 puis 256=0!! ; => limitation amplitude à 127 pour mini=128-127=1 et maxi =128+127=255 ; dt 0xF7,0xF9,0xFB,0xFD,0xFE,0xFF,0x0,0x0 ; dt 0x0,0x0,0x0,0xFF,0xFE,0xFD,0xFB,0xF9 ;------------------ ; SINEDD9.asm ; rev 23 aout 04 : usage table 256 octest de 2 serie de 128 pas donc 2 sinusoides! ; rev 19 aout 2004 modif Init_F_Depart => en sub routine ; relation proportionelle: coeff * 0,0212874 = freq ; car decalage indice/terminal et realité (verifié avec frequencemetre FreqAR_1.asm ) ;rev 30 juin 04 : SINDDS8.ASM avec table unique, separée, de 256 octets pour 256 pas 1 sinusoide ;rev 24 juin 04 : PB debordement de page avec test 35 -> test 34 ..OK ;rev 18 juin 04 : augmentation taille 20 à 36 val freq ;rev 13 juin 04 : rajout indexation valeur frequence en Hz ;rev 08 avril 04 : indexation frequnce sur indice ;rev 07 avril 04 : adaptation PF pour AD588 ; SINEDDS3.asm ; 21 mars 2004 version avec PIC @ 20Mhz ;---------------- ;Building SINEDDS7.HEX... ;Compiling SINEDDS7.ASM: ;Command line: "F:\MPLAB\MPASMWIN.EXE /aINHX8M /e+ /l+ /x+ /c+ /rdec /p16F84 /q C:\MPLAB\DDS\SINEDDS7.ASM" ;Build completed successfully. ; 13 mars 2004 rev PF SINEDDS1.ASM: ;SINDDS (C) Copyright 2003 by Richard Prinz.OE1RIB Richard.Prinz@MIN.at ;----------------------- ;#define miniSimDE ifdef miniSimDE p=16F84 __CONFIG 0x3FF2 RADIX DEC else ERRORLEVEL -302 Processor 16F84 EXPAND __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC endif ifdef miniSimDE include else include endif ;************************************************** ; ; Schematic / Loop version ; DAC 8bits ; 16F84 AD558 +5V + 9V ; 20 MHz | | ; +------+ +-------+-+ / ; | |----------|1 D0 11| |/ ; | | B0-B7 | 16|---------| 2N2222 NPN ; | |----------|8 D7 |out |\> ; | | gnd ----|9 CS 14|-----------\ ; | | Gnd ----|10 CE 15|-----------+-- analog Fout -----> ; | | +------+--+ sense | ; | | RA1 Key | 12 | ; | 18|---------/ - | 13 | ; | | RA2 Key -+-0V | ; | 1 |---------/ + - ; | | RA3 | | R ; | 2 |-------->RS232 Tx | | 2,2K ; | | RA4 | | ; | 3 |-------|<|---R 1,2K--<+5V + ; | | | ; +------+ -|- 0V ; ;************************************************** ; Definitions ;************************************************** #define PAGE0 BCF 3,5 #define PAGE1 BSF 3,5 ;#define Debug 1 ;************************************************** ; Variables ;************************************************** ifdef miniSimDE org 0x0C FREQ_H Equ $ FREQ_M Equ $+1 FREQ_L Equ $+2 ACC_H Equ $+3 ACC_M Equ $+4 ACC_L Equ $+5 TEMP Equ $+6 SER Equ $+7 DELAY_W Equ $+8 DELAY_T Equ $+9 DELAY_H Equ $+10 DELAY_L Equ $+12 RsCount Equ $+13 RsBuffer Equ $+14 count1 Equ $+15 indice Equ $+16 RsByte Equ $+17 Cpt1 Equ $+18 sauve Equ $+19 btmp Equ $+20 bun EQU $+21 bdix EQU $+22 else cblock 0x0C FREQ_H FREQ_M FREQ_L ACC_H ACC_M ACC_L TEMP SER DELAY_W DELAY_T DELAY_H DELAY_L indice RsCount RsBuffer count1 RsByte Cpt1 sauve btmp bun bdix endc endif ;************************************************** ; -- input -- #define Rs_Port PORTA #define Rs_Rx 0 ; RA0 #define KeyUp 2 ; RA1 #define KeyDown 1 ; RA2 ; --output -- #define Rs_Tx 3 ; RA3 #define LedR 4 ; RA4 #define Augmente PORTA,KeyUp ; #define Diminue PORTA,KeyDown ; #define SERIAL_TX Rs_Port,Rs_Tx ; serial RS232 output #define SERIAL_RX Rs_Port,Rs_Rx ; serial RS232 input PCLBit macro label,bit,check local mask mask set (1 << bit) if (check == 1) if (high($)) == (high(label)) messg "Source and destination "label" on same Page!" endif endif if ((high($) & mask) == (high(label) & mask)) bcf PCLATH,bit else bsf PCLATH,bit endif endm ;************************************************** ; M A I N - E N T R Y ;************************************************** ORG 0x000 Start PAGE1 movlw B'00000111' movwf TRISA movlw B'00000000' movwf TRISB PAGE0 ;************************************************** ; Output frequency (using 24 bit accumulator) ; f = deltaPhase * fClock/2^24 ; fClock = f Quartz /4 = 20000000/4=50000 ; number of cycles to output the data ( 26 cycles ) ; (the output loop needs between 26 and 32 cycles to output calculate, lookup and the data) ; f = FREQ_H/FREQ_M/FREQ_L * (Quartz/4/28)/16777216 ; f = FREQ_H/FREQ_M/FREQ_L * (5000000/28)/16777216 ; f = FREQ_H/FREQ_M/FREQ_L * 0.00212874 ; fMax (theoretical) = 0.5 * fClock ;=================================================== ; ---- START ---- ; 1 Hz #define STARTAT_H 0x00 #define STARTAT_M 0x00 #define STARTAT_L 0x5D ; ---- STEP ---- ; 100 Hz ; #define STEP_H 0x00 ; #define STEP_M 0x27 ; #define STEP_L 0x52 ; ---- ROLL ---- ; 5001 Hz #define ROLLAT_H 0x07 #define ROLLAT_M 0xAE #define ROLLAT_L 0x79 ;************************************************** ; Main Loop ;************************************************** Pres clrf btmp clrf bun clrf bdix clrf indice clrf sauve ifdef miniSimDE ; SIMULATEUR DE pic goto NoPresentation endif Pres1 CALL RS_CRLF clrf Cpt1 Pres11 movf Cpt1,w CALL read_EE incf Cpt1,f ANDLW 0x0FF ; test sur (W) BTFSC STATUS, Z ; zero= fin de message ? GOTO Pres2 Call RS_Putchar goto Pres11 Pres2 CALL RS_CRLF call delay_256ms movlw EE1-EE0 MOVWF Cpt1 Pres21 movf Cpt1,w CALL read_EE incf Cpt1,f ANDLW 0x0FF ; test sur (W) BTFSC STATUS, Z ; zero= fin de message ? GOTO Pres3 Call RS_Putchar goto Pres21 Pres3 CALL RS_CRLF call delay_256ms movlw EE2-EE0 MOVWF Cpt1 Pres31 movf Cpt1,w CALL read_EE incf Cpt1,f ANDLW 0x0FF ; test sur (W) BTFSC STATUS, Z ; zero= fin de message ? GOTO PresEnd Call RS_Putchar goto Pres31 PresEnd CALL RS_CRLF NoPresentation clrf ACC_H clrf ACC_M clrf ACC_L ; clrf PORTA clrf PORTB call Init_F_Depart ; set START frequency call debounce_50ms CALL RS_CRLF goto changeF ; affiche freq correspondant à indice=0 NCOLoop ; entree à 1 ? btfss PORTA,2 ; 1 ou 2 goto Touche ; 2 btfss PORTA,1 ; 1 ou 2 goto Touche ; 2 AddFreq ; add freq value to phase accumulator 24bit movf FREQ_L,w ; 1 addwf ACC_L,f ; 1 movf FREQ_M,w ; 1 btfsc STATUS,C ; 1 ou 2 incfsz FREQ_M,w ; 1 ou 2 addwf ACC_M,f ; 1 movf FREQ_H,w ; 1 btfsc STATUS,C ; 1 ou 2 incfsz FREQ_H,w ; 1 ou 2 addwf ACC_H,f ; 1 LookupSine movf ACC_H,w ; 1 call SINE_TABLE ; 2 + 5 in subroutine ;Sortie sur DAC558 8 bits movwf PORTB ; 1 goto NCOLoop ; 2 ; 27 cycles mini ..33 maxi ;************************************************** ; Process commands to NCO ;************************************************** Touche ; touche à zero call delay_256ms btfss PORTA,2 goto Augmentation btfss PORTA,1 goto Diminution goto NCOLoop Augmentation call delay_256ms btfss PORTA,2 goto Augmentation incf indice,f movf indice,W ; @ modif 10/09/04 subLw 36 ; si depasse 35 => retour à 0 btfsS STATUS,Z goto changeF clrf ACC_H clrf ACC_M clrf ACC_L call Init_F_Depart goto changeF Diminution call delay_256ms btfss PORTA,1 goto Diminution movf indice,w sublw 1 BTFSC STATUS,C goto NCOLoop decf indice,f goto changeF changeF call delay_256ms movlw B'00010000' ; clignote led xorwf PORTA,f ; affichage sur RS232 ...................... movf indice,w movWf sauve ; registre de travail call bcd2 ; affichage valeur indice movlw '=' call RS_Putchar ; mutliplie indice par 3 BCF STATUS,C rlf sauve,w ; sauve=indice *2 Addwf indice,w ; sauve= indice*2 + indice movwf sauve call Freq_Table movwf FREQ_H call hex8 incf sauve,f movf sauve,W call Freq_Table movwf FREQ_M call hex8 incf sauve,f movf sauve,W call Freq_Table movwf FREQ_L call hex8 movlw '=' call RS_Putchar MOVF indice,w call Affiche_Frequence goto NCOLoop Init_F_Depart CLRF indice CLRF sauve movlw STARTAT_H movwf FREQ_H movlw STARTAT_M movwf FREQ_M movlw STARTAT_L movwf FREQ_L return ORG 0x0fd Freq_Table bSf PCLATH,0 ; 1 bcf PCLATH,1 ; 1 addwf PCL,f ; 1 ; 34 valeurs possible sur un PIC16F84 ; utiliser Pic_Calculs.XLS DDS pour les obtenir les 2 tables ci-dessous ; (ou autres valeurs) et copier coller depuis excel ; les valeurs ne sont pas forcement consecutives car le choix est indexe. dt 0x00, 0x00, 0x04 ;0.1Hz dt 0x00, 0x00, 0x2B ;1Hz dt 0x00, 0x00, 0xDA ;5Hz dt 0x00, 0x01, 0xB4 ;10Hz dt 0x00, 0x04, 0x42 ;25Hz dt 0x00, 0x08, 0x85 ;50Hz dt 0x00, 0x0C, 0xC7 ;75Hz dt 0x00, 0x11, 0x0A ;100Hz dt 0x00, 0x15, 0x4C ;125Hz dt 0x00, 0x19, 0x8F ;150Hz dt 0x00, 0x22, 0x14 ;200Hz dt 0x00, 0x2A, 0x99 ;250Hz dt 0x00, 0x33, 0x1E ;300Hz dt 0x00, 0x3B, 0xA3 ;350Hz dt 0x00, 0x44, 0x28 ;400Hz dt 0x00, 0x4C, 0xAD ;450Hz dt 0x00, 0x55, 0x32 ;500Hz dt 0x00, 0x5D, 0xB7 ;550Hz dt 0x00, 0x66, 0x3C ;600Hz dt 0x00, 0x6E, 0xC1 ;650Hz dt 0x00, 0x77, 0x46 ;700Hz dt 0x00, 0x7F, 0xCB ;750Hz dt 0x00, 0x88, 0x50 ;800Hz dt 0x00, 0x90, 0xD5 ;850Hz dt 0x00, 0x99, 0x5A ;900Hz dt 0x00, 0xA1, 0xDF ;950Hz dt 0x00, 0xAA, 0x64 ;1000Hz dt 0x00, 0xB2, 0xE9 ;1050Hz dt 0x00, 0xBB, 0x6E ;1100Hz dt 0x00, 0xC3, 0xF3 ;1150Hz dt 0x00, 0xCC, 0x78 ;1200Hz dt 0x00, 0xD4, 0xFD ;1250Hz dt 0x00, 0xDD, 0x82 ;1300Hz dt 0x00, 0xE6, 0x08 ;1350Hz dt 0x00, 0xEE, 0x8D ;1400Hz dt 0x00, 0xFF, 0x97 ;1500Hz Freq_TABLE_fin equ $ Freq_value EQU $ DT " 0.1" DT " 1" DT " 5" DT " 10" DT " 25" DT " 50" DT " 75" DT " 100" DT " 125" DT " 150" DT " 200" DT " 250" DT " 300" DT " 350" DT " 400" DT " 450" DT " 500" DT " 550" DT " 600" DT " 650" DT " 700" DT " 750" DT " 800" DT " 850" DT " 900" DT " 950" DT "1000" DT "1050" DT "1100" DT "1150" DT "1200" DT "1250" DT "1300" DT "1350" DT "1400" DT "1500" Freq_value_fin equ $ EcartTable EQU Freq_value -(Freq_Table +3) ;************************************************** ; SINE Frequency Table with 256 entries ; copy and paste from SineDDS MatLab script ;************************************************** ORG 0x1FD SINE_TABLE bsf PCLATH,1 ; 1 bcf PCLATH,0 ; 1 addwf PCL,f ; 1 ; ATTENTION table en debut de page !!! ; table de 2 cycles en 256 pas! donc 128 pas par sinusoide ! dt 0x80,0x7A,0x74,0x6E,0x68,0x62,0x5C,0x56 dt 0x50,0x4A,0x45,0x3F,0x3A,0x35,0x30,0x2B dt 0x27,0x22,0x1E,0x1A,0x17,0x14,0x10,0x0E dt 0x0B,0x09,0x07,0x05,0x04,0x03,0x02,0x02 dt 0x01,0x02,0x02,0x03,0x04,0x05,0x07,0x09 dt 0x0B,0x0E,0x10,0x14,0x17,0x1A,0x1E,0x22 dt 0x27,0x2B,0x30,0x35,0x3A,0x3F,0x45,0x4A dt 0x50,0x56,0x5C,0x62,0x68,0x6E,0x74,0x7A dt 0x80,0x87,0x8D,0x93,0x99,0x9F,0xA5,0xAB dt 0xB1,0xB7,0xBC,0xC2,0xC7,0xCC,0xD1,0xD6 dt 0xDA,0xDF,0xE3,0xE7,0xEA,0xED,0xF1,0xF3 dt 0xF6,0xF8,0xFA,0xFC,0xFD,0xFE,0xFF,0xFF dt 0xFF,0xFF,0xFF,0xFE,0xFD,0xFC,0xFA,0xF8 dt 0xF6,0xF3,0xF1,0xED,0xEA,0xE7,0xE3,0xDF dt 0xDA,0xD6,0xD1,0xCC,0xC7,0xC2,0xBC,0xB7 dt 0xB1,0xAB,0xA5,0x9F,0x99,0x93,0x8D,0x87 dt 0x81,0x7A,0x74,0x6E,0x68,0x62,0x5C,0x56 dt 0x50,0x4A,0x45,0x3F,0x3A,0x35,0x30,0x2B dt 0x27,0x22,0x1E,0x1A,0x17,0x14,0x10,0x0E dt 0x0B,0x09,0x07,0x05,0x04,0x03,0x02,0x02 dt 0x01,0x02,0x02,0x03,0x04,0x05,0x07,0x09 dt 0x0B,0x0E,0x10,0x14,0x17,0x1A,0x1E,0x22 dt 0x27,0x2B,0x30,0x35,0x3A,0x3F,0x45,0x4A dt 0x50,0x56,0x5C,0x62,0x68,0x6E,0x74,0x7A dt 0x80,0x87,0x8D,0x93,0x99,0x9F,0xA5,0xAB dt 0xB1,0xB7,0xBC,0xC2,0xC7,0xCC,0xD1,0xD6 dt 0xDA,0xDF,0xE3,0xE7,0xEA,0xED,0xF1,0xF3 dt 0xF6,0xF8,0xFA,0xFC,0xFD,0xFE,0xFF,0xFF dt 0xFF,0xFF,0xFF,0xFE,0xFD,0xFC,0xFA,0xF8 dt 0xF6,0xF3,0xF1,0xED,0xEA,0xE7,0xE3,0xDF dt 0xDA,0xD6,0xD1,0xCC,0xC7,0xC2,0xBC,0xB7 dt 0xB1,0xAB,0xA5,0x9F,0x99,0x93,0x8D,0x87 SINE_TABLE_fin equ $ ;************************************************** ; Tool routines ;************************************************** Affiche_Frequence movwf Cpt1 BCF STATUS,C RLF Cpt1,f ;indice x 2 RLF Cpt1,w ;indice x 2 ADDLW EcartTable ; indice *4 + deplacement movwf sauve clrf Cpt1 Encore_Affich movf sauve,w call Freq_Table call RS_Putchar incf sauve,f incf Cpt1,f movf Cpt1,W andLW 0x03 btfsC STATUS,Z goto Affich_fin Goto Encore_Affich Affich_fin movlw 'H' call RS_Putchar movlw 'z' call RS_Putchar call RS_CRLF return debounce_50ms movlw 0x00 movwf DELAY_H movlw D'50' movwf DELAY_L call Delay return delay_256ms movlw 0x01 movwf DELAY_H movlw 0x00 movwf DELAY_L call Delay return ;===================================== ; delay parameter ; DELAY_H msb ; DELAY_L lsb ; of the 16 bit number of milliseconds to wait. ; so it is possible to wait from 1ms to 65535ms ;----------------------------------------------- Delay comf DELAY_H,f ; 1 1 comf DELAY_L,f ; 1 1 incf DELAY_L,f ; 1 1 btfsc STATUS,Z ; 1/2 1/2 incf DELAY_H,f ; 1 1 ; --------------------------------------------- = 5 always ; inner loop for 1000 instruction cycles ; at 20MHz each instruction takes 4 clock ; 1 cycle =0,2µS ; 5000 instruction cycles = 1ms ; -----------------------------------Cycles----- Delay01 movlw D'250' ; 1 1 movwf DELAY_T ; 1 1 Delay02 goto $+1 ; 2 -> 0.4µS goto $+1 ; 2 goto $+1 ; 2 goto $+1 ; 2 goto $+1 ; 2 goto $+1 ; 2 goto $+1 ; 2 goto $+1 ; 2 --- 16x0,2µS=3.2µS decfsz DELAY_T,f ; 1/2 249*1 + 1x2 goto Delay02 ; 2 249*x2 goto $+1 ; 2 goto $+1 ; 2 goto $+1 ; 2 ; ------------------------------------- = 4994 cycles incf DELAY_L,f ; 1 1 btfsc STATUS,Z ; 1/2 1/2 incfsz DELAY_H,f ; 1/2 1/2 goto Delay01 ; 2 2 in the loop always 5 ; ------------------------------------- = 5 cycles return ; 2 on exit the 5 from above + 1 ; ------------------------------------- = 6 cycles ;*************************************************** ;special pour routine d"attente bit 4800 Bauds @20Mhz delay_RS4800 MOVLW 172 ; 170 * 3 cycles *0,2µS=103µS MOVWF count1 DECFSZ count1,F GOTO $-1 MOVLW 172 ; 103µS MOVWF count1 ; 4800 bauds => 208µS DECFSZ count1,F GOTO $-1 Return ;-------------------------------------- hex8 movwf btmp ; affichage octet --> hexadecimal 2 digits ( de 00 a FF ) swapf btmp,W andlw 0x0f addlw -0x0a btfsc STATUS,C addlw 0x07 addlw 0x3a call RS_Putchar movf btmp,W andlw 0x0f addlw -0x0a btfsc STATUS, C addlw 0x07 addlw 0x3a call RS_Putchar movlw '.' call RS_Putchar return ;------------------------------------------ bcd2 movwf btmp ; affichage octet --> decimal 2 digits ( de 0 a 99 ) movlw '0' movwf bdix bcd21 movlw 10 subwf btmp,w bnc bcd22 movwf btmp incf bdix,f goto bcd21 bcd22 movlw '0' addwf btmp,w movwf bun movf bdix,w call RS_Putchar movf bun,w call RS_Putchar return ;---------------------- RS_Putchar PAGE0 movwf RsBuffer Movlw 8 ;correspond … un byte de 8 bits Movwf RsCount ;place dans RsCount Bcf SERIAL_TX ;bit start … 0 Call delay_RS4800 ;wait valeur 1bit 4800 Bauds Rrf RsBuffer,F ;shift droite dans carry Btfsc STATUS,C ;si carry 0 alors saute Goto $+3 ;carry =1 Bcf SERIAL_TX ;Tx =0 Goto $+2 Bsf SERIAL_TX ;Tx =1 Call delay_RS4800 Decfsz RsCount,F ;RsCount =RsCount -1 Goto $-8 Bsf SERIAL_TX ;bit de stop … 1 Call delay_RS4800 ;byte envoye Call delay_RS4800 nop nop return ;--------------- RS_CRLF movf RsByte,w ;sauve W movlw 13 call RS_Putchar nop movlw 10 call RS_Putchar movwf RsByte ;restitue W return ;------------------------------ Read_RS Clrf RsByte Movlw H'08' ;byte 8 bit Movwf RsCount Btfsc SERIAL_RX ;Attendre bit start Goto $-1 ;si zero = bit start = goto loop Rx_Loop call Delay ;bit de start Bcf STATUS,C ;Carry=0 Btfsc SERIAL_RX ;lit et test l"entrée RB0 Bsf STATUS,C ;Rx =1, saute si Rx =0 rrf RsByte,F Decfsz RsCount,F Goto Rx_Loop Return ;------------------ read_EE movwf EEADR ; defini offset addresse PAGE1 ; 16F84 !!!! bsf EECON1,RD ; mode lecture PAGE0 ; 16F84 !!!! movf EEDATA,W ; recupere lecture return FinProgramme EQU $ ORG 0x2100 ; "1234567890123456" ; message taille modulo 16 EE0 DT "SINDDS10.asm ",0 EE1 DT "84-0130 G83-20 ",0 EE2 DT "10/09/04 AD588",13,10 EE4 DT "RS232 4800b",13,10,0 finEprom EQU $ end ;---------------- ;ICPROG ;PIC16F84 ;checksum C8A6 ;Config word 3FF2h ;ID value FFFF ;oscillateur HS ;WDT off ;PWRT on ;CP off ;-------------------------------------------------------------- ; voir Pic_Calculs.XLS feuille "DDS" et "Sinus en Hexa" ;----------------------------------------------------------------- ;----------------------------------------------------------------- ; resultat sur terminal: ;----------------------------------------------------------------- ; ;SINDDS10.asm ;84-0130 G83-20 ;10/09/04 AD588 ;RS232 4800b ; ; ;00=00.00.04.= 0.1Hz <- mini ;01=00.00.2B.= 1Hz ;02=00.00.DA.= 5Hz ;03=00.01.B4.= 10Hz ;04=00.04.42.= 25Hz ;05=00.08.85.= 50Hz ;06=00.0C.C7.= 75Hz ;07=00.11.0A.= 100Hz ;08=00.15.4C.= 125Hz ;09=00.19.8F.= 150Hz ;10=00.22.14.= 200Hz ;11=00.2A.99.= 250Hz ;12=00.33.1E.= 300Hz ;13=00.3B.A3.= 350Hz ;14=00.44.28.= 400Hz ;15=00.4C.AD.= 450Hz ;16=00.55.32.= 500Hz ;17=00.5D.B7.= 550Hz ;18=00.66.3C.= 600Hz ;19=00.6E.C1.= 650Hz ;20=00.77.46.= 700Hz ;21=00.7F.CB.= 750Hz ;22=00.88.50.= 800Hz ;23=00.90.D5.= 850Hz ;24=00.99.5A.= 900Hz ;25=00.A1.DF.= 950Hz ;26=00.AA.64.=1000Hz ;27=00.B2.E9.=1050Hz ;28=00.BB.6E.=1100Hz ;29=00.C3.F3.=1150Hz ;30=00.CC.78.=1200Hz ;31=00.D4.FD.=1250Hz ;32=00.DD.82.=1300Hz ;33=00.E6.08.=1350Hz ;34=00.EE.8D.=1400Hz ;35=00.FF.97.=1500Hz <- maxi ;00=00.00.04.= 0.1Hz ;01=00.00.2B.= 1Hz ;02=00.00.DA.= 5Hz ;03=00.01.B4.= 10Hz ;04=00.04.42.= 25Hz