BASCOM AVR в вопросах и ответах
Re: BASCOM AVR в вопросах и ответах
Подскажите, прочитал в обучалке, что для работе с ЖКИ-панелями не обязательно подключать библиотеку lcd4.lbx, а достаточно в конфигураторе настроить подключение. В Bascom-симуляторе все работает нормально и без библиотеки, но на реальном экране без нее ничего не выводит. Может нужно указать еще какие-нибудь настройки?
- max50
- Мучитель микросхем
- Сообщения: 497
- Зарегистрирован: Ср дек 10, 2008 21:24:28
- Откуда: Алтайский край, Барнаул
Re: BASCOM AVR в вопросах и ответах
Нужно правильно сконфигурировать дисплей. Посмотри по ссылке:
http://radiokot.ru/forum/viewtopic.php?p=751859#p751859
http://radiokot.ru/forum/viewtopic.php?p=751859#p751859
Того, кто не задумывается о далеких трудностях, ожидают близкие неприятности.
Re: BASCOM AVR в вопросах и ответах
Мой фрагмент кода не отличается по настройкам от указанного примера (только пины другие):
В конфигураторе задано точно такое же подключение. Но как только я убираю строку $lib "lcd4.lbx", на экран ничего не выводится.
Код: Выделить всё
$regfile = "AtTiny2313.dat"
$crystal = 4000000
$hwstack = 32
$swstack = 10
$framesize = 40
$lib "lcd4.lbx"
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.2 , Rs = Portb.0
Config Lcd = 16 * 2
Cursor Off
Locate 1 , 1
Lcd.............В конфигураторе задано точно такое же подключение. Но как только я убираю строку $lib "lcd4.lbx", на экран ничего не выводится.
- kip96
- Держит паяльник хвостом
- Сообщения: 965
- Зарегистрирован: Ср авг 26, 2009 08:24:50
- Откуда: 1300км от Пупа
Re: BASCOM AVR в вопросах и ответах
А куда у Вас контакт RW подключён ? Усли на порт, перекинте на землю.
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Re: BASCOM AVR в вопросах и ответах
RW на земле. Конечно, подключение библиотеки - не так страшно: память МК еще не забита.
Re: BASCOM AVR в вопросах и ответах
dhouse писал(а):RW на земле. Конечно, подключение библиотеки - не так страшно: память МК еще не забита.
Подключение той или иной библиотеки на увеличение размера кода почти не влияет. Это касается только длинных переменных типа LONG, SINGLE, DOUBLE. Ну и в некоторых случаях WORD. Если в коде используятся только переменные типа BYTE и BIT, всяко-разные библиотеки на размер почти не влияют, ну может на пару %%. Не более того.
Цапу крутить надо!!! Ку или не ку?
Re: BASCOM AVR в вопросах и ответах
dhouse писал(а):В конфигураторе задано точно такое же подключение. Но как только я убираю строку $lib "lcd4.lbx", на экран ничего не выводится.
Так сделайте:
Код: Выделить всё
$regfile = "AtTiny2313.dat"
$crystal = 4000000
$hwstack = 32
$swstack = 10
$framesize = 40
Config Portb = Output
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.2 , Rs = Portb.0
Config Lcd = 16 * 2
Deflcdchar 0 , 31 , 16 , 30 , 17 , 17 , 17 , 30 , 32
Cursor Off
Do
Locate 1 , 1
Lcd "BPETE!!!"
Locate 2 , 1
Lcd "BCE PA" ; Chr(0) ; "OTAET"
Waitms 500
Loop
EndЦапу крутить надо!!! Ку или не ку?
Re: BASCOM AVR в вопросах и ответах
А вот такой вопрос. Кто знает, почему при любом входном значении АЦП - на индикаторе нули (индикатор с ОА) Код ниже:
Код: Выделить всё
$regfile = "attiny26.dat"
$crystal = 8000000
$lib "mcsbyte.lbx"
$lib "mcsbyteint.lbx"
'********************************************************************
Ddra = &B11110100 : Porta = 0
Ddrb = &B01110111 : Portb = 0
Config Adc = Single , Prescaler = Auto , Reference = Off
Config Timer0 = Timer , Prescale = 8
Config Watchdog = 2048
'********************************************************************
'
'*******************
Razr1 Alias Portb.0
Razr2 Alias Portb.1
Razr3 Alias Portb.2
A Alias Portb.4 : B Alias Portb.5 : C Alias Portb.6 : D Alias Porta.4
E Alias Porta.5 : F Alias Porta.6 : G Alias Porta.7
'*******************
Dim Result As Byte
Dim W As Byte , Z As Byte , Y As Byte , I As Byte , X As Byte
Dim Chislo(8) As Integer
'*********************************
Const Uref = 5
Const K = 5
'*********************************
On Timer0 Pulse
Enable Timer0
Enable Interrupts
'*********************************
For X = 1 To 3
Chislo(x) = 10
Next
Do
Stop Timer0
Start Adc
Result = Getadc(0)
Stop Adc
Start Timer0
Result = Result * Uref
Result = Result / 1024
If Result < K Then Chislo(3) = 11
Chislo(1) = Result Mod 10
Chislo(2) = Result / 10
Chislo(3) = 0
If Result >= K Then
Set Porta.2
Chislo(1) = 10
Chislo(2) = 10
Chislo(3) = 10
End If
Waitms 1800
Loop
End
Pulse:
Reset Watchdog
Stop Timer0 ' останавливаем таймер 0
Set Razr1 : Set Razr2 : Set Razr3
Incr W : If W > 3 Then W = 1 ' выбираем какую цифру сейчас включать
Y = 0
Gosub Look : A = Z ' переходим к подпрограмме Look, которая определяет нужно ли сейчас загорется сегменту А
Gosub Look : B = Z
Gosub Look : C = Z
Gosub Look : D = Z
Gosub Look : E = Z
Gosub Look : F = Z
Gosub Look : G = Z
Start Timer0 ' запускаем таймер0
Return
Look: ' подпрограмма которая определяет нужно ли сейчас гореть сегменту, который вызвал эту подпрограмму
Z = Chislo(w) * 7 : Z = Y + Z ' определяем порядковый номер числа из таблици DATA. W - это цифра которую будем выводить 0..1..2..3...9,
Z = Lookup(z , Cifri) ' выбираем из таблици включить или выключить нужный сегмент
Incr Y 'Y это номер сегмента (A=0 B=1 C=2...)
Return 'возвращаемся на место откуда сюда прислали
Cifri:
' |Chislo(i) | # Символа |
Data 1 , 1 , 1 , 1 , 1 , 1 , 0 '0
Data 0 , 1 , 1 , 0 , 0 , 0 , 0 '1
Data 1 , 1 , 0 , 1 , 1 , 0 , 1 '2
Data 1 , 1 , 1 , 1 , 0 , 0 , 1 '3
Data 0 , 1 , 1 , 0 , 0 , 1 , 1 '4
Data 1 , 0 , 1 , 1 , 0 , 1 , 1 '5
Data 1 , 0 , 1 , 1 , 1 , 1 , 1 '6
Data 1 , 1 , 1 , 0 , 0 , 0 , 0 '7
Data 1 , 1 , 1 , 1 , 1 , 1 , 1 '8
Data 1 , 1 , 1 , 1 , 0 , 1 , 1 '9
Data 0 , 0 , 0 , 0 , 0 , 0 , 1 '10 "-"
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 '11 "" пусто
'*******************************************************************************Цапу крутить надо!!! Ку или не ку?
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Во-первых: где у Вас в индикации зажигается нужный разряд? Там только гашение... Просто не дописали? Впрочем, дело не в этом. Вы пытаетесь запихнуть результат чтения АЦП в переменную типа byte (Result) забыв о том что результат 10-ти битный. Ну и про расчет я молчу, как можно делить на 1024 если переменная byte.
Да еще до кучи цифры прописаны для ОК. Так что это у Вас не нули горят а прочерки.
Строчка Set Razr1 : Set Razr2 : Set Razr3 гасит все разряды (в вашем случае с ОА она наоборот включает все разряды), так что индикация не работает совсем.
Да еще до кучи цифры прописаны для ОК. Так что это у Вас не нули горят а прочерки.
Строчка Set Razr1 : Set Razr2 : Set Razr3 гасит все разряды (в вашем случае с ОА она наоборот включает все разряды), так что индикация не работает совсем.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
После того как код станет работоспособным в плане индикации, обратите внимание на расчет:
Допустим мы считали 1000. 1000*5 / 1024 = 4,88. Так как переменная целая, то и результат заберется только до точки. То бишь Result = 4. С таким расчетом можно будет вывести только 1 - 2 - 3 - 4 - 5 В. Без десятых и сотых.
Код: Выделить всё
Result = Result * Uref
Result = Result / 1024
Допустим мы считали 1000. 1000*5 / 1024 = 4,88. Так как переменная целая, то и результат заберется только до точки. То бишь Result = 4. С таким расчетом можно будет вывести только 1 - 2 - 3 - 4 - 5 В. Без десятых и сотых.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Re: BASCOM AVR в вопросах и ответах
Ну, допустим, я умножу результат на 100. Тогда в переменной будет число 488. Так вот, я не пойму, как его распихать по разрядам?
Цапу крутить надо!!! Ку или не ку?
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Ну зачем ее дополнительно умножать? Тем более так просто не получится, надо будет переменную с точкой делать. Можно просто сделать переменную Result типа Long и константу 500. На нее и умножать. В результате в Result будут 3 цифры, которые можно спокойно разбить на разряды. Например, так:
Код: Выделить всё
' если необходимо - гасим незначащий ноль
If Result >= 100 Then Chislo(1) = Result / 100 Else Chislo(1) = 11
Result = Result Mod 100 ' забираем вторую и третью цифры
Chislo(2) = Result / 10 ' распихиваем их по разрядам
Chislo(3) = Result Mod 10
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Re: BASCOM AVR в вопросах и ответах
Все равно нифига не получается.
При таком коде:
- - на индикаторе вот это:http://image050.mylivepage.ru/chunk50/3536729/2520/%21%21%21.png?download=1
Вот эти две строки убирал:Результат тот же. На идикаторе : "U2.00". - и это при входном напряжении 4.76 вольта. И от этих нулей я никак не могу избавиться, хотя входное напряжение меняю всяко-разно.
Код: Выделить всё
Dim Result As Long , Ch As Byte
Dim W As Byte , Z As Byte , Y As Byte , I As Byte , X As Byte
Dim Chislo(8) As Integer
Dim Dp_flag1 As Bit , Dp_flag2 As Bit , Dp_flag3 As Bit , Dp_flag4 As Bit
'*********************************************************************
Const Umax = 500
'*********************************************************************
On Adc Adc_isr
On Timer0 Pulse
Enable Adc
Enable Timer0
Enable Interrupts
'*********************************************************************
Dp_flag1 = 0
Dp_flag2 = 0
Dp_flag3 = 0
Dp_flag4 = 0
Do
Ch = 5
Stop Timer0
Start Adc
Idle
Stop Adc
Start Timer0
Result = Result * 5
Result = Result / 1024
Result = Result * Umax
If Result >= 100 Then Chislo(3) = Result / 100 Else Chislo(3) = 11
Result = Result Mod 100
Chislo(2) = Result / 10
Chislo(1) = Result Mod 10
Chislo(4) = 12
Dp_flag3 = 1
If Result > Umax Then
Dp_flag3 = 0
Chislo(1) = 10
Chislo(2) = 10
Chislo(3) = 10
Chislo(4) = 10
End If
Waitms 1500
Loop
End- - на индикаторе вот это:http://image050.mylivepage.ru/chunk50/3536729/2520/%21%21%21.png?download=1
Вот эти две строки убирал:
Код: Выделить всё
Result = Result * 5
Result = Result / 1024Цапу крутить надо!!! Ку или не ку?
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Еще старый код не заработал у Вас (у меня он с минимальными правками вчера сразу запустился), а тут уже 4 разряда.
И опять мне Ваш расчет непонятен. Смотрите, допустим у Вас опорное - 5 В. Значит при 0 В на входе АЦП в регистрах ADCH:ADCL будет 0. А при 5 В на входе в регистрах будет 1023.
Допустим мы подали на вход почти максимум опорного и АЦП считал 1000. Считаем по вашему коду:
1000*5/1024 = 4,88 - вот собственно результат. 4,88 В на входе. Но так как переменная LONG без точки, то результат расчета будет 4. А далее мне совсем непонятно. 4*500 = 2000.
Я имел ввиду так для трех разрядов:
1000*500/1024 = 488. Все, три разряда готовы принять переменную для разноса по разрядам.
Давайте Ваш код полностью. Можно в личку. Там все просто.
Допустим мы подали на вход почти максимум опорного и АЦП считал 1000. Считаем по вашему коду:
1000*5/1024 = 4,88 - вот собственно результат. 4,88 В на входе. Но так как переменная LONG без точки, то результат расчета будет 4. А далее мне совсем непонятно. 4*500 = 2000.
Я имел ввиду так для трех разрядов:
1000*500/1024 = 488. Все, три разряда готовы принять переменную для разноса по разрядам.
Давайте Ваш код полностью. Можно в личку. Там все просто.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
edm2007 писал(а):На идикаторе : "U2.00"
Все правильно, так и будет. Я выше написал почему так будет. Вы никогда при таком расчете от нулей не избавитесь, потому как фактически забираете только первую цифру. Все что Вы можете добиться - это вывести 100 - 200 - 300 - 400 - 500.
Последний раз редактировалось edm2007 Сб апр 16, 2011 10:43:07, всего редактировалось 1 раз.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Re: BASCOM AVR в вопросах и ответах
Видимо, с динамической индикацией мне, таки разобраться не судьба! Ну не понимаю я этих вычислений типа Mod 10, Mod 100 и т.п. Принцип работы понятен, на два разряда могу разбить свободно, а вот если разрядов больше двух - все, затык и всякая хрень на индикаторе. Может кто объяснит, как длинные числа, в том числе с десятичной точкой правильно разбивать поразрядно?
Цапу крутить надо!!! Ку или не ку?
Re: BASCOM AVR в вопросах и ответах
Зачем же в личку, у меня секретов ни от кого нет. Может кому-то еще будет полезно! Вот весь код, правда теперь переделан под мегу8, в тини26 не влазил, хотя потом постараюсь запихнуть и в нее:
Код: Выделить всё
$regfile = "m8def.dat"
$crystal = 8000000
'********************************************************************
Ddrb = &B00111111 : Portb = 0
Config Portd = Output
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Timer0 = Timer , Prescale = 8
Config Watchdog = 1024
'********************************************************************
'********************************************************************
Razr1 Alias Portd.0 : Razr2 Alias Portd.1
Razr3 Alias Portd.2 : Razr4 Alias Portd.3
A Alias Portb.5 : B Alias Portb.4 : C Alias Portb.3 : D Alias Portb.2
E Alias Portb.1 : F Alias Portb.0 : G Alias Portd.7 : Dp Alias Portd.6
'*********************************************************************
Dim Result As Long , Ch As Byte
Dim W As Byte , Z As Byte , Y As Byte , I As Byte , X As Byte
Dim Chislo(8) As Integer
Dim Dp_flag1 As Bit , Dp_flag2 As Bit , Dp_flag3 As Bit , Dp_flag4 As Bit
'*********************************************************************
Const Umax = 500
'*********************************************************************
On Adc Adc_isr
On Timer0 Pulse
Enable Adc
Enable Timer0
Enable Interrupts
'*********************************************************************
Dp_flag1 = 0
Dp_flag2 = 0
Dp_flag3 = 0
Dp_flag4 = 0
Do
Ch = 5
Stop Timer0
Start Adc
Idle
Stop Adc
Start Timer0
'Result = Result * 5
'Result = Result / 1024
Result = Result * Umax
If Result >= 100 Then Chislo(3) = Result / 100 Else Chislo(3) = 11
Result = Result Mod 100
Chislo(2) = Result / 10
Chislo(1) = Result Mod 10
Chislo(4) = 12
Dp_flag3 = 1
If Result > Umax Then
Dp_flag3 = 0
Chislo(1) = 10
Chislo(2) = 10
Chislo(3) = 10
Chislo(4) = 10
End If
Waitms 1500
Loop
End
Pulse:
Reset Watchdog
Stop Timer0
Reset Razr1 : Reset Razr2 : Reset Razr3 : Reset Razr4
Incr W : If W > 4 Then W = 1
Y = 0
Gosub Look : A = Z
Gosub Look : B = Z
Gosub Look : C = Z
Gosub Look : D = Z
Gosub Look : E = Z
Gosub Look : F = Z
Gosub Look : G = Z
Select Case W
Case 1 :
If Dp_flag1 = 1 Then Reset Dp Else Set Dp
Set Razr1
Case 2 :
If Dp_flag2 = 1 Then Reset Dp Else Set Dp
Set Razr2
Case 3:
If Dp_flag3 = 1 Then Reset Dp Else Set Dp
Set Razr3
Case 4:
If Dp_flag4 = 1 Then Reset Dp Else Set Dp
Set Razr4
End Select
Start Timer0
Return
Adc_isr:
push r26
push r27
push r24
in r24,sreg
push r24
push r25
Result = Getadc(ch)
pop r25
pop r24
!out sreg,r24
pop r24
pop r27
pop r26
Return
Look: ' подпрограмма которая определяет нужно ли сейчас гореть сегменту, который вызвал эту подпрограмму
Z = Chislo(w) * 7 : Z = Y + Z ' определяем порядковый номер числа из таблици DATA. W - это цифра которую будем выводить 0..1..2..3...9,
Z = Lookup(z , Cifri) ' выбираем из таблици включить или выключить нужный сегмент
Incr Y 'Y это номер сегмента (A=0 B=1 C=2...)
Return 'возвращаемся на место откуда сюда прислали
Cifri:
' |Chislo(i) | # Символа |
Data 0 , 0 , 0 , 0 , 0 , 0 , 1 '0
Data 1 , 0 , 0 , 1 , 1 , 1 , 1 '1
Data 0 , 0 , 1 , 0 , 0 , 1 , 0 '2
Data 0 , 0 , 0 , 0 , 1 , 1 , 0 '3
Data 1 , 0 , 0 , 1 , 1 , 0 , 0 '4
Data 0 , 1 , 0 , 0 , 1 , 0 , 0 '5
Data 0 , 1 , 0 , 0 , 0 , 0 , 0 '6
Data 0 , 0 , 0 , 1 , 1 , 1 , 1 '7
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 '8
Data 0 , 0 , 0 , 0 , 1 , 0 , 0 '9
Data 1 , 1 , 1 , 1 , 1 , 1 , 0 '10 "-"
Data 1 , 1 , 1 , 1 , 1 , 1 , 1 '11 "" пусто
Data 1 , 0 , 0 , 0 , 0 , 0 , 1 '12 U
'*******************************************************************************Цапу крутить надо!!! Ку или не ку?
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Выше же все есть, буквально тут же. И как в цикле разбить автоматом на 8 разрядов и просто вручную... Я написал пример разноса переменной на 3 разряда. Допустим в переменной 485.
Chislo(1) = Result / 100 - первый разряд (тот что слева), 485/100 = 4,85 Но переменная без десятых, потому заберет только 4.
Result = Result Mod 100 - это остаток от деления на 100. То бишь теперь в переменной 85.
Chislo(2) = Result / 10 - ну а дальше Вы знаете, так как переменная без точки то во втором разряде будет 8.
Chislo(3) = Result Mod 10 - а это остаток от деления на 10 числа 85. То бишь 5.
Все, 4 - 8 - 5. Это самый примитивный разнос в лоб. Можно еще проще.
P.S. Проект протеуса можно? Дабы недоразумений небыло потом.
Chislo(1) = Result / 100 - первый разряд (тот что слева), 485/100 = 4,85 Но переменная без десятых, потому заберет только 4.
Result = Result Mod 100 - это остаток от деления на 100. То бишь теперь в переменной 85.
Chislo(2) = Result / 10 - ну а дальше Вы знаете, так как переменная без точки то во втором разряде будет 8.
Chislo(3) = Result Mod 10 - а это остаток от деления на 10 числа 85. То бишь 5.
Все, 4 - 8 - 5. Это самый примитивный разнос в лоб. Можно еще проще.
P.S. Проект протеуса можно? Дабы недоразумений небыло потом.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Re: BASCOM AVR в вопросах и ответах
edm2007 писал(а):Я имел ввиду так для трех разрядов:
1000*500/1024 = 488. Все, три разряда готовы принять переменную для разноса по разрядам.
Все сделал так, заработало!!!
Проект Протеуса приложил:
- Вложения
-
- Архив WinRAR.rar
- (26.32 КБ) 195 скачиваний
Цапу крутить надо!!! Ку или не ку?
- edm2007
- Поставщик валерьянки для Кота
- Сообщения: 2255
- Зарегистрирован: Вт апр 21, 2009 22:24:10
- Откуда: Иркутск
- Контактная информация:
Re: BASCOM AVR в вопросах и ответах
Блин, это я сам запутался.
Подумал что Вам надо на 4 разряда исключительно АЦП забрасывать. А там же значок U. Тогда конечно и так будет работать.
И тиньки 26 там за глаза.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон