Здравствуйте! Делаю себе генератор на XR2206. Вопрос стал за частотомером. Т.к. корпус маленький, то lcd не влез. Решил остановиться на сегментных индикаторах + 7219.
За основу взял забугорный код + код для 7219
Код:'$regfile = "2313def.dat" $regfile = "attiny2313.dat" '+-----------------------------------------------------------------------------+ '| AVR Attiny2313 Frequency Meter 1.1 (7 digits, 10MHz) | '| Pawe³ Kisielewski (manekinen) manekinen@mdiy.pl - MDIY.PL | '| Not for commercial/profit/sell purposes | '| Compiler: Bascom AVR 2.0.7.6 Date: 25.03.3013 | '+-----------------------------------------------------------------------------+ 'I Modyfikacjê dla wysw. LCD I 'I opracowa³: Waldek I 'I---------------------------I 'Crystal, put here your crystal frequency $crystal = 22118400 'L:FF; H:DF 'Divide your crystal frequency by 1024 and put below 'F.e. 16000000/1024=15625; 20000000/1024=19531,25 (use 19531); 25000000/1024=24414,0625 (use 24414) Const Compare = 21600 Ddrd.1 = 1 : Portd.1 = 0 Ddrd.2 = 1 : Portd.2 = 0 Ddrd.3 = 1 : Portd.3 = 0 Cs Alias Portd.1 Ser_clk Alias Portd.2 Ser_data Alias Portd.3 Ddrd.4 = 0 : Portd.4 = 1 'we->pin 8 Config Timer0 = Counter , Edge = Falling Enable Timer0 On Timer0 Count Nosave Config Timer1 = Timer , Prescale = 1024 , Clear Timer = 1 On Oc1a 1s Nosave Enable Compare1a Compare1a = Compare Enable Interrupts Dim Multiplier As Word At &H70 Dim Fr_byte_copy As Byte At &H74 Dim Frequency As Dword Dim Digit(8)as Byte Dim Y As Byte Dim Disp_num As Byte Dim Disp_data As Byte Dim Digit_str As String * 6 Dim Temp_str As String * 3 Gosub Max7219_setup Do Digit_str = Str(frequency) Digit_str = Format(digit_str , "000000") Gosub Prepare Loop End Prepare: Do For Y = 1 To 6 Temp_str = Mid(digit_str , Y , 1) Select Case Temp_str Case "0" : Temp_str = "126" '&b01111110 Case "1" : Temp_str = "48" '&b00110000 Case "2" : Temp_str = "109" '&b01101101 Case "3" : Temp_str = "121" '&b01111001 Case "4" : Temp_str = "51" '&b00110011 Case "5" : Temp_str = "91" '&b01011011 Case "6" : Temp_str = "95" '&b01011111 Case "7" : Temp_str = "112" '&b01110000 Case "8" : Temp_str = "127" '&b01111111 Case "9" : Temp_str = "123" '&b01111011 Case "." : Temp_str = "128" '&b10000000 End Select Digit(y) = Val(temp_str) Disp_num = Y 'çíàêîìåñòî (ðàçðÿä) íà êîòîðûé âûâîäèì òåêóùóþ öèôðó Disp_data = Digit(y) 'äàííûå êîòîðûå îòïðàâëÿåì íà âûáðàííûé ðàçðÿä Gosub Disp_write Next Y Loop Until Y = 7 'êîãäà âûâåëè äàííûå íà âñå 4 ðàçðÿäà âîçâðàùàåìñÿ â ãëàâíûé öèêë Return 1s: $asm push R24 IN R24,counter0 STS &H74,R24 IN R24, SREG push R24 PUSH R10 push R11 push R12 push R13 push R14 push R15 push R16 push R17 push R18 push R19 push R20 push R21 push R22 push R23 push R25 push R26 push R27 push R28 push R29 push R30 push R31 $end Asm Frequency = Multiplier Shift Frequency , Left , 8 Frequency = Frequency + Fr_byte_copy Multiplier = 0 $asm pop R31 pop R30 pop R29 pop R28 pop R27 pop R26 pop R25 pop R23 pop R22 pop R21 pop R20 pop R19 pop R18 pop R17 pop R16 pop R15 pop R14 pop R13 pop R12 pop R11 pop R10 'reset timer1 & counter0 at the same time ldi R24,&H00 Out Tcnt1l , R24 Out Tcnt1h , R24 Out Tcnt0 , R24 'erase timer0 interrupt flag in R24,tifr SBR R24,&H01 Out Tifr , R24 pop R24 Out Sreg , R24 pop R24 $end Asm Return Count: $asm push R16 IN R16, SREG push R24 push R25 'Incr Multiplier lds R24,&H70 lds R25,&H71 adiw R24,&H01 sts &H70,R24 STS &H71,R25 POP R25 POP R24 Out Sreg , R16 pop R16 $end Asm Return 'Ïåðåäàåì äàííûå â max7221 Disp_write: Ser_data = 0 Ser_clk = 0 Cs = 0 Shiftout Ser_data , Ser_clk , Disp_num , 1 'îòïðàâëÿåì íîìåð ðàçðÿäà Shiftout Ser_data , Ser_clk , Disp_data , 1 'îòïðàâëÿåì äàííûå â ýòîò ðàçðÿä Cs = 1 Return 'èíèöèàëèçàöèè max7221 Max7219_setup: Disp_num = &H0C : Disp_data = 0 'ðåæèì Shutdown (0-âêëþ÷åí, 1-âûêëþ÷åí) Gosub Disp_write Disp_num = &H09 : Disp_data = 0 'ðåæèì ïðÿìîãî óïðàâëåíèÿ ñåãìåíòàìè èíäèêàòîðà Gosub Disp_write Disp_num = &H0A : Disp_data = 10 'óðîâåíü ñâå÷åíèÿ ñåãìåíòîâ (0-ìèíèìóì, 15-ìàêñèìóì) Gosub Disp_write Disp_num = &H0B : Disp_data = 5 '÷èñëî èñïîëüçóåìûõ ðàçðÿäîâ (ñ÷åò îò 0) Gosub Disp_write Disp_num = &H0F : Disp_data = 0 'òåñòîâûé ðåæèì âûêëþ÷åí (0-âûêëþ÷åí, 1-âêëþ÷åí) Gosub Disp_write Disp_num = &H0C : Disp_data = 1 Gosub Disp_write Return
Исходник на оригинал частотомера
Будет 6 цифр. Частота в герцах.
В общем в протеусе запускается, но как то криво... Чем выше частота тем медленней считает.
Эксплуатация будет от 1Гц до 100кГц. Еще ни как не соображу, как точки расставить чтобы когда частота 1кГц на дисплее светилось 1.ххх и так далее на всех частотах.
Уважаемые подправьте код! буду очень благодарен! Железо все на руках уже.
Отредактировано NewUserBascom (2017-06-29 00:20:04)
, но все равно информация очень полезна для развития 