попытался написать программу для аттини13 . так только инициализация забрала всю память . в чем дело? код я почти дописал , осталось уместить в 1кб и поправить константы .
вот что должна делать программа : согласовывать входное сопротивдение степдауна с выходным . входное вычисляется по оборотам генератора , на выходе напряжение должно быть 13в . напряжение генератора на хх около 10в*1000 оборотов . ток кз-5а
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 256 Config Portb.3 = Output Config Portb.4 = Output Start Timer1
Do Incr Pwm1a Decr Pwm1b Waitms 100 Loop End
Так вот на строчку Decr pwm1b (уменьшение скважности на выводе PWM1B) BASCOM ругается благим матом: "Error 15 Wrong data type". Что я написал не так и как это исправить?
elf.arxont писал(а):Пытаюсь потренироваться с ШИМом в BASCOM'e. Пишу...
Здравствуйте.
Вы указали заголовочный файл 2313DEF.DAT, а это старый МК AT90S2313. И у него только один регистр сравнения - OCR1A. Потому компилятор и ругается на несуществующий регистр OCR1B (PWM1B). Просто выберите правильный контроллер, и все у Вас будет хорошо.
edm2007, спасибо! А я-то думал, что за чертовщина, что он ругается на ровном месте. А оказалось, что это я прохлопал. AT90S2313 это ж древняя версия Тини2313, у которого даже фьюзов нет, насколько я помню. И помню, что прошивки от AT90S2313 подходят к ATtiny2313, а вот наоборот.... Поменял тип МК, все откомпилировалось
DdrA = &B01111111 'направление линий порта A: 1 - на вывод PortA = &B01110000
DdrB = &B01111111 PortB = &B00000000
A Alias PortB.2 'Тут вписываем порты к которым подключены сегменты индикатора B Alias PortB.0 C Alias PortB.4 D Alias PortB.6 E Alias PortB.5 F Alias PortB.1 G Alias PortB.3 Dp Alias PortA.6 Dig1 Alias PortA.0 Dig2 Alias PortA.1 Dig3 Alias PortA.2
UPR Alias PORTA.5 tFREQ Alias PORTA.4 BUZZ Alias PORTA.3
Dim I As Byte , X As Byte , Digs(3) As Byte , SegmLink As Byte , Dg as Byte Dim U as Word , Ut as Word Dim Bright as Byte Dim WordTmp As Word , DpRz As Byte , Razr As Byte , Full As Byte
Dim Second As Byte , Minut As Byte , Hour As Byte , Delit as Byte , TickCnt As Byte ' переменные для часов
Dim MinutCh As Byte , HourCh As Byte ' Время заряда до полного
Declare Sub GetU Declare Sub DisplU Declare Sub DisplTime(Byval Hr as Byte , Byval Mn as Byte)
StartTesting: GetU DpRz = 0 ' < 8 вольт. Либо очень разряжен, либо его нет совсем, либо 6 вольтовый If U < 80 then BegTst: Digs(3) = 24 : Digs(2) = 14 : Digs(1) = 23 ' Дисплей "t E S" Ut = U UPR = 0 ' Включаю заряд Wait 1 GetU if U > 160 then ' Аккумулятор не подключен UPR = 1 ' Выключаю заряд Digs(3) = 11 : Digs(2) = 10 : Digs(1) = 24 'Дисплей "b A t" Wait 10 Goto BegTst end if
For i = 1 to 30 ' DpRz = 1 Wait 1 DpRz.1 = NOT DpRz.1 ' Waitms 500 next i
UPR = 1 ' Отключить заряд For i = 3 to 1 step -1 DpRz = i Wait 2 Next i DpRz = 0 GetU If U < Ut then ' Не заряжается Digs(3) = 11 : Digs(2) = 10 : Digs(1) = 13 ' Дисплей "b A d" ' BUZZ = 1 ' Wait 1 ' BUZZ = 0 Wait 10 Goto BegTst end if If U > 45 and U < 80 then Ut = 72 Goto Charge end if end if Ut = 146 Charge: ' Цикл зарядки GetU If U > Ut then if U > 160 then Goto BegTst if Ut = 146 then Ut = 130 if Ut = 72 then Ut = 62 Digs(3) = 15 : Digs(2) = 25 : Digs(1) = 20 ' Дисплей "F U L" DpRz = 0 If Full = 0 then HourCh = Hour : MinutCh = Minut end if Full = 1 if HourCh = Hour AND MinutCh = Minut then Buzz = 1 Waitms 300 Buzz = 0 end if Wait 1 Call DisplTime(HourCh , MinutCh) Goto Charge end if
If Ut < 130 then Digs(3) = 25 : Digs(2) = 33 : Digs(1) = 6 ' Дисплей "u = 6" wait 5 end if
If Full = 1 Then ' Был заряжен на полную Digs(3) = 24 : Digs(2) = 30 : Digs(1) = 36 ' Дисплей "t r c" Wait 30 UPR = 0 Wait 10 UPR = 1 'Выключаю заряд Goto Charge end if UPR = 0 'Включаю заряд на примерно минуту Call DisplTime(Hour , Minut) ' Показываем 2 секунды часы ххh и две секунды минуты xx| Call DisplU 'Напряжение на батарее For i = 1 to 50 ' Мигает точкой 50 секунд DpRz = 2 Waitms 500 DpRz = 0 Waitms 500 Next i UPR = 1 'Выключаю заряд Wait 1 ' Пауза, что бы мерить напряжение на батарее, а не выход зарядного Goto Charge 'конец основного цикла
Sub DisplTime(Hr , Mn ) ' DpRz = 0 Digs(2) = Hr Mod 10 Hr = Hr \ 10 Digs(3) = Hr Mod 10 Digs(1) = 34 wait 2 Digs(2) = Mn Mod 10 Mn = Mn \ 10 Digs(3) = Mn Mod 10 Digs(1) = 35 wait 2 end sub
Sub DisplU WordTmp = U DpRz = 2 for i = 1 to 3 Digs(i) = WordTmp Mod 10 WordTmp = WordTmp \ 10 next i
end sub
Sub GetU Start Adc U = 0 For i = 1 to 3 Waitms 30 U = U + Getadc(6) Next i Stop Adc U = U / 15 End Sub
Timer0_int: ' Обработка прерываний таймера0 $asm Push R31 'сохраним регистры PUSH R26 Push R25 Push R24 Push R20 Push R16 Push R10 Push R0 In R31 , Sreg Push R31 $End asm set Dig1 : Set Dig2 : Set Dig3 Lds R31 , {Bright} 'Сдвимем биты в переменной по кольцу LSR R31 BRCC R_NUL ORI R31, 128 R_nul: Sts {Bright} , R31 BRCS ON_LCD RJMP End_IntTimer0 ON_LCD:
'---- Ниже все вызывается 1 раз в час Lds R31 , {Hour} inc R31 Sts {Hour} , R31 CPI R31, 99 brlo EndTimer1_Int clr R31 Sts {Hour} , R31 STS {Full} , R31 ' После 99 часов считаем, что нужен полный цикл заряда
EndTimer1_Int:
Pop R31 Out Sreg , R31 'восстановим регистры Pop R31 ' reti $end asm Return
DdrA = &B01111111 'направление линий порта A: 1 - на вывод PortA = &B01110000
DdrB = &B01111111 PortB = &B00000000
A Alias PortB.2 'Тут вписываем порты к которым подключены сегменты индикатора B Alias PortB.0 C Alias PortB.4 D Alias PortB.6 E Alias PortB.5 F Alias PortB.1 G Alias PortB.3 Dp Alias PortA.6 Dig1 Alias PortA.0 Dig2 Alias PortA.1 Dig3 Alias PortA.2
UPR Alias PORTA.5 tFREQ Alias PORTA.4 BUZZ Alias PORTA.3
Dim I As Byte , X As Byte , Digs(3) As Byte , SegmLink As Byte , Dg as Byte Dim U as Word , Ut as Word Dim Bright as Byte Dim WordTmp As Word , DpRz As Byte , Razr As Byte , Full As Byte
Dim Second As Byte , Minut As Byte , Hour As Byte , Delit as Byte , TickCnt As Byte ' переменные для часов
Dim MinutCh As Byte , HourCh As Byte ' Время заряда до полного
Declare Sub GetU Declare Sub DisplU Declare Sub DisplTime(Byval Hr as Byte , Byval Mn as Byte)
StartTesting: GetU DpRz = 0 ' < 8 вольт. Либо очень разряжен, либо его нет совсем, либо 6 вольтовый If U < 80 then BegTst: Digs(3) = 24 : Digs(2) = 14 : Digs(1) = 23 ' Дисплей "t E S" Ut = U UPR = 0 ' Включаю заряд Wait 1 GetU if U > 160 then ' Аккумулятор не подключен UPR = 1 ' Выключаю заряд Digs(3) = 11 : Digs(2) = 10 : Digs(1) = 24 'Дисплей "b A t" Wait 10 Goto BegTst end if
For i = 1 to 30 ' DpRz = 1 Wait 1 DpRz.1 = NOT DpRz.1 ' Waitms 500 next i
UPR = 1 ' Отключить заряд For i = 3 to 1 step -1 DpRz = i Wait 2 Next i DpRz = 0 GetU If U < Ut then ' Не заряжается Digs(3) = 11 : Digs(2) = 10 : Digs(1) = 13 ' Дисплей "b A d" ' BUZZ = 1 ' Wait 1 ' BUZZ = 0 Wait 10 Goto BegTst end if If U > 45 and U < 80 then Ut = 72 Goto Charge end if end if Ut = 146 Charge: ' Цикл зарядки GetU If U > Ut then if U > 160 then Goto BegTst if Ut = 146 then Ut = 130 if Ut = 72 then Ut = 62 Digs(3) = 15 : Digs(2) = 25 : Digs(1) = 20 ' Дисплей "F U L" DpRz = 0 If Full = 0 then HourCh = Hour : MinutCh = Minut end if Full = 1 if HourCh = Hour AND MinutCh = Minut then Buzz = 1 Waitms 300 Buzz = 0 end if Wait 1 Call DisplTime(HourCh , MinutCh) Goto Charge end if
If Ut < 130 then Digs(3) = 25 : Digs(2) = 33 : Digs(1) = 6 ' Дисплей "u = 6" wait 5 end if
If Full = 1 Then ' Был заряжен на полную Digs(3) = 24 : Digs(2) = 30 : Digs(1) = 36 ' Дисплей "t r c" Wait 30 UPR = 0 Wait 10 UPR = 1 'Выключаю заряд Goto Charge end if UPR = 0 'Включаю заряд на примерно минуту Call DisplTime(Hour , Minut) ' Показываем 2 секунды часы ххh и две секунды минуты xx| Call DisplU 'Напряжение на батарее For i = 1 to 50 ' Мигает точкой 50 секунд DpRz = 2 Waitms 500 DpRz = 0 Waitms 500 Next i UPR = 1 'Выключаю заряд Wait 1 ' Пауза, что бы мерить напряжение на батарее, а не выход зарядного Goto Charge 'конец основного цикла
Sub DisplTime(Hr , Mn ) ' DpRz = 0 Digs(2) = Hr Mod 10 Hr = Hr \ 10 Digs(3) = Hr Mod 10 Digs(1) = 34 wait 2 Digs(2) = Mn Mod 10 Mn = Mn \ 10 Digs(3) = Mn Mod 10 Digs(1) = 35 wait 2 end sub
Sub DisplU WordTmp = U DpRz = 2 for i = 1 to 3 Digs(i) = WordTmp Mod 10 WordTmp = WordTmp \ 10 next i
end sub
Sub GetU Start Adc U = 0 For i = 1 to 3 Waitms 30 U = U + Getadc(6) Next i Stop Adc U = U / 15 End Sub
'---- Ниже все вызывается 1 раз в час Lds R31 , {Hour} inc R31 Sts {Hour} , R31 CPI R31, 99 brlo EndTimer1_Int clr R31 Sts {Hour} , R31 STS {Full} , R31 ' После 99 часов считаем, что нужен полный цикл заряда
EndTimer1_Int:
Pop R31 Out Sreg , R31 'восстановим регистры Pop R31 ' reti $end asm Return
Добрый вечер уважаемы коты! Начну с того, чтов Баском я новичек. И на данный момент могу писать ооочень простенькие програмки, а то что посложене делаю по шаблону или меняю что-то в откоментированных исходниках. Появилась необходимость снимать данные с термопары и выводит на жк. Нашел микросхему драйвера термопары MAX6675 она считывает данные с термопары и передает в МК по spi Вот загвостка в том как настроить чтобы драйвер передваал данные в МК . Знаю что для этого нужна библиотека. НО! Библиотеки есть только на зыке С/с++. Может кто поможет решить эту задачу в Баском? Библиотеки и пример работы в С/С++ предоставлю! Спасибо!
[quote="dimon-790"] СПАСИБО! помогло другая проблема всё работает (пишет A1.7:204:bat:tes) потом (bat:tes)по кругу циклирует а напряжение не показывает. Tfreq-отвечает за это порт 4 если я правильно понимаю (14 нога тини26). \ Если на 14 ногу подать 5вольт на дисплее должно быть 999? и как переназначить порт ввода который следит за напругой? Tfreq- как оно работает если в программе присутствует 1 раз ито при назначении портов?