Дата: Воскресенье, 04.09.2016, 19:34 | Сообщение # 1
Группа: Проверенные
Сообщений: 53
Статус: Offline
Здравствуйте, есть задача создавать сигнал синусоидальной формы с "плавающей" частотой в пределах от24.5 до 25.5 кГц. Для простоты решил использовать кусок готовой программы, но столкнулся с ошибкой при компиляции. Подскажите как правельно распределить память в МК. Может есть более простой способ решить задачу с генерацией плавающей частоты синуса? Пока изменение частоты не писал...
Код
$regfile = "attiny2313.DAT" $crystal = 11059200 $hwstack = 60 'Оперативка для GoTo & GoSub $swstack = 60 'Оперативка для GoTo & GoSub $framesize = 16 'Область памяти для операторов PRINT ' ' Config Portb = Output 'Тут R/2R ЦАП
Enable Interrupts ' ' Frequency = r24/r25/r26* (xtal freq/cycles in loop)/16777216 (2^24) ' Fincr = frequenza voluta / multiplier ' Const Cycles = 8 'DDS cycles loop Const Multiplier =(_xtal / Cycles) / 2 ^ 24 Const F_ref = 0.5 'Поправка ' ' Dim Wave(256) As Byte At &H100 Dim Tmpw As Word ' Dim Fincr As Long 'для расчёта частоты Dim Tmpl As Long ' Dim Singl As Single 'расчитанная частота
' Конвертируем и генерируем заданную чаcтоту Fincr = 25000 ' Singl = Fincr / Multiplier Fincr = Singl + F_ref ' ' Restore Sine_table rjmp Run_gen ' Run_gen: Do Read Wave(tmpw) 'trasferisce in ram function table Incr Tmpw Loop Until Tmpw > 256 Loadadr Wave(1) , Z 'ldi r31,$01 ldi r30,$00 ' ldi r29,$00 'clear accumulator ldi r28,$00 lds r24,{Fincr+0} 'LSB passa incremento frequenza lds r25,{Fincr+1} 'usa 24 dei 32 bit lds r26,{Fincr+2} 'MSB Gen: add r28, r24 ' 1 cycle adc r29, r25 ' 1 cycle adc r30, r26 ' 1 cycle ld r0, Z ' 2 cycle ! Out Portb,R0 ' 1 cycle ' sbic Pinc,4 ' 1 check tasto Run/stop rjmp Gen ' 2 cycles totale 9 cicli ' Portd = 127 ' lascia uscita ad 1/2 scala
Стоит задача откомпилировать готовый проект взятый из Австрийского журнала. Это контроллер лямбда зонда.
Программа уже готова и теоретически корректна, надо просто откомпилировать. К сожалению с Bascom не знаком и быстрым нахрапом глюк не понял. По идее идёт обращение к зарезервированному слову, почему выбивает в ошибку? Подозрение на собственную криворукость ака незнание баскома.
Заголовок программы
Код
'########################## 'Es sind drei Versionen dieser Software verfügbar! 'V1: Für LSU4.2 Sonden mit Messbereich Lambda 0,7...1,3 'V2: Für LSU4.2 Sonden mit Messbereich Lambda 1,0...2,0 'V3: Für LSU4.9 Sonden mit Messbereich Lambda 1,0...2,0 'Unterschiede finden sich ausschließlich in den Tabellen für den analogen Ausgang
'Dimension variables Dim Ref As Word , Bat As Word , Ur As Word , Ua As Word , Heater_cal As Word , Lambda_cal As Word , Cal As Bit 'Analog Inputs Dim K_1 As Byte , K_2 As Byte , In_1 As Byte , In_2 As Byte , Temporary As Byte 'Soft SPI Dim Mymcusr As Byte , Status As Byte 'System-Variables Dim T0_1 As Byte , T0_2 As Byte , T0_3 As Bit 'Timing Dim Sercom As String * 3 , Newsercom As Bit , Pwm_bit As Bit , Length As Byte , Fast As Bit , Text As Bit 'UART communication Dim Zeit As Word , Div_zeit As Word , Reg As Word , Esum As Integer , E As Integer , Y As Integer 'Heater Dim P As Integer , I As Integer , Ealt As Integer , Heat_control As Bit , Heat_control_uart As Bit Dim Heat_up As Bit , Vl As Bit Dim Ua_corr As Integer , Ref_corr As Integer , Lambda_cal_corr As Integer , A As Byte , B As Integer , C As Integer
Const Kp = 80 Const Ki = 25
'Copy Mcusr for Watchdog into myMcusr Mymcusr = Peek(0)
'Rename In- and Output pins 'CJ125 In/Out Spi_ss Alias Portd.7 Spi_sck Alias Portb.5 Spi_mosi Alias Portb.0 Spi_miso Alias Pinb.4 Lsu_temp Alias Pinc.0 Lsu_lambda Alias Pinc.1 'LSU and Control In/Out Pwm_heater Alias Portb.1 Bat_voltage Alias Pinc.2 Ref_voltage Alias Pinc.3 'Diagnosis In/Out Error_out Alias Portd.6 Stat_good Alias Portd.5 Analog_out Alias Portb.3 Gp1 Alias Portd.2 Gp2 Alias Pind.3 Gp3 Alias Pind.4
'Declare functions/subs Declare Function Kom(byval Adress As Byte , Byval Command As Byte) As Byte 'Communications with CJ125 Declare Sub Heatercontrol() Declare Sub Serial0charmatch() 'UART-input handler Declare Sub Serialinput() 'UART-input processing Declare Sub Wd() 'Failsafe routine Declare Sub Uart() 'UART-Transmitter Declare Sub Analog() 'Analog-Out tables
'Init program Enable Timer0 'Timer0 Interrupts Enable Interrupts 'Global interrupts On Timer0 Isr_t0 'Timer0 Interrupt handler Set Spi_ss 'Init CJ125 interface Reset Spi_sck Start Timer0
'Check and config Watchdog If Mymcusr.wdrf = 1 Then Call Wd() 'After critical time-out: Go to failsafe End If
Config Watchdog = 2048 'If watchdog isn't reseted after 2 seconds -> Reset and Failsafe Start Watchdog
'Load calibrationvalue for automatic heater reg. Temporary = Kom(86 , 157) 'Change CJ125 into calibrationmode Pwm2 = 208 'Set Analog Out to 4.0V Wait 1 Heater_cal = Getadc(0) 'Get optimal temp. Lambda_cal = Getadc(1) 'Get Lambda=1 Temporary = Kom(86 , 137)