BASCOM AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
ХатёнаГГ
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Пт фев 27, 2009 01:07:41
Откуда: Иваново - город невест

Re: BASCOM AVR в вопросах и ответах

Сообщение ХатёнаГГ »

Привет всем. Снова нуждаюсь в совете. Задумал часы слепить - но застрял на истоках динамической индикации. Суть в чём - всё отлично, кроме цифры 3. Если просто выводить "3", то показывает 0 на третьем знаке - остальные молчат. Потом сделал, что б с кнопок менялось число(+1111 или -1111). И опять вместо троек или двойки(если прибавлять), или четвёрки(если вычитать), т.е. предыдущие значения выводит на второе и третье место.
З.Ы. сейчас ещё заметил баг если "4444", то все выводятся, как и "7777", и "1111",а при остальных значениях последняя цифра вообще не светится.
Спойлер$regfile = "attiny2313.dat"
$crystal = 500000
$hwstack = 32
$swstack = 8
$framesize = 16
Declare Sub Led
Config Portb = Output
Config Portd = Output
Config Pind.2 = Input
Config Pind.4 = Input
Ddrb = &B11111111
Ddrd = &B11101011
B1 Alias Pind.4
B2 Alias Pind.2
Dim R As Integer
Dim T As Integer
Dim W As Integer
Dim N1 As Byte
Dim N2 As Byte
Dim N3 As Byte
Dim N4 As Byte
Dim M1 As Integer
Dim M2 As Integer
Dim M3 As Integer
Dim M4 As Integer
W = 3333
Do
If B1 = 0 Then
W = W + 1111
1:
If B1 = 0 Then
Goto 1
End If
End If

If B2 = 0 Then
W = W - 1111
2:
If B2 = 0 Then
Goto 2
End If
End If
M1 = W
M2 = M1
M3 = M1
M4 = M1

M1 = M1 / 1000 ' M1 = 1234/1000 = 1,234
N1 = Abs(m1)

M2 = M2 Mod 1000 ' M2 =1234 Mod 1000 = 234
M2 = M2 / 100 ' M2 = 234 / 100 = 2,34
N2 = Abs(m2) ' N2 = Abs (2,34) = 2 ' N1 = Abs (1,234) = 1

M3 = M3 Mod 100
M3 = M3 / 10
N3 = Abs(m3)

M4 = M4 Mod 10
N4 = Abs(m4)

Gosub Led
Loop

Sub Led:

Portd = &B00001000 ' print first digit
Select Case N1
Case 0 : Portb = &B00010000
Case 1 : Portb = &B11010110
Case 2 : Portb = &B01001000
Case 3 : Portd = &B01000010
Case 4 : Portb = &B10000110
Case 5 : Portb = &B00100010
Case 6 : Portb = &B00100000
Case 7 : Portb = &B01010110
Case 8 : Portb = &B00000000
Case 9 : Portb = &B00000010
End Select

Waitms 6

Portd = &B00000001 ' print second digit
Select Case N2
Case 0 : Portb = &B00010000
Case 1 : Portb = &B11010110
Case 2 : Portb = &B01001000
Case 3 : Portd = &B01000010
Case 4 : Portb = &B10000110
Case 5 : Portb = &B00100010
Case 6 : Portb = &B00100000
Case 7 : Portb = &B01010110
Case 8 : Portb = &B00000000
Case 9 : Portb = &B00000010
End Select

Waitms 6

Portd = &B00000010 ' print first digit
Select Case N3
Case 0 : Portb = &B00010000
Case 1 : Portb = &B11010110
Case 2 : Portb = &B01001000
Case 3 : Portd = &B01000010
Case 4 : Portb = &B10000110
Case 5 : Portb = &B00100010
Case 6 : Portb = &B00100000
Case 7 : Portb = &B01010110
Case 8 : Portb = &B00000000
Case 9 : Portb = &B00000010
End Select

Waitms 6

Portd = &B00100000 ' print first digit
Select Case N4
Case 0 : Portb = &B00010000
Case 1 : Portb = &B11010110
Case 2 : Portb = &B01001000
Case 3 : Portd = &B01000010
Case 4 : Portb = &B10000110
Case 5 : Portb = &B00100010
Case 6 : Portb = &B00100000
Case 7 : Portb = &B01010110
Case 8 : Portb = &B00000000
Case 9 : Portb = &B00000010
End Select

Waitms 6

End Sub Led

End
kamaz6141
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Ср янв 02, 2013 20:13:25

Re: BASCOM AVR в вопросах и ответах

Сообщение kamaz6141 »

А что с decada.org.ru? Или сайт совсем умер? :cry:
Аватара пользователя
htscooter
Вымогатель припоя
Сообщения: 566
Зарегистрирован: Вт ноя 18, 2008 20:33:17
Откуда: г.Луганск

Re: BASCOM AVR в вопросах и ответах

Сообщение htscooter »

ХатёнаГГ, использовать тут Select case конечно можно, но с массивом как-то проще, и памяти меньше занимает. И непонятно, как Вы подключали сегменты к порту В. Если индикаторы с общим анодом, то тот же ноль будет выглядеть либо Case 0 : Portb = &B00000011, либо Case 0 : Portb = &B11000000
Хорошо и надежно работающая система безусловно красива
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Re: BASCOM AVR в вопросах и ответах

Сообщение radio-kot »

vem566 писал(а): Все заработало.
PROTEUS = СИЛА! в умелых руках.
Будете проходить мимо- проходите!
ХатёнаГГ
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Пт фев 27, 2009 01:07:41
Откуда: Иваново - город невест

Re: BASCOM AVR в вопросах и ответах

Сообщение ХатёнаГГ »

htscooter писал(а):ХатёнаГГ, использовать тут Select case конечно можно, но с массивом как-то проще, и памяти меньше занимает. И непонятно, как Вы подключали сегменты к порту В. Если индикаторы с общим анодом, то тот же ноль будет выглядеть либо Case 0 : Portb = &B00000011, либо Case 0 : Portb = &B11000000

У меня пин DP (точка) не подключен. Нулевой бит порта в "воздухе".
Аватара пользователя
htscooter
Вымогатель припоя
Сообщения: 566
Зарегистрирован: Вт ноя 18, 2008 20:33:17
Откуда: г.Луганск

Re: BASCOM AVR в вопросах и ответах

Сообщение htscooter »

Так все равно, у Вас в "Case 0" единичка смещена аж на 3 бита влево, поэтому я и спросил про подключение индикатора. В первоисточнике, как я посмотрел, нулевой бит соответствует сегменту А, восьмой - Н.
Хорошо и надежно работающая система безусловно красива
осторожно! леоныч!!!
Сверлит текстолит когтями
Сообщения: 1156
Зарегистрирован: Вт дек 09, 2008 20:31:56

Re: BASCOM AVR в вопросах и ответах

Сообщение осторожно! леоныч!!! »

Всем доброго времени суток. Прошу подсказать как правильно прочитать данные с микросхемы tda6508.

Address byte ADB 1 1 0 0 0 MA1 MA0 R/W=1

Status byte SB POR FL 1 1 1 A2 A1 A0

Вот выдержка из даташита.

Вот я пробую читать данные (всего один байт) так.

I2cstart
I2cwbyte &B11000001
I2cstart
I2crbyte Q , Nack
I2cstop

Но не получается ничего. Q = 255 и все... В чем ошибка?
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Re: BASCOM AVR в вопросах и ответах

Сообщение radio-kot »

А вы сделайте как в примерах к BASCOM и наверняка получится.
Будете проходить мимо- проходите!
осторожно! леоныч!!!
Сверлит текстолит когтями
Сообщения: 1156
Зарегистрирован: Вт дек 09, 2008 20:31:56

Re: BASCOM AVR в вопросах и ответах

Сообщение осторожно! леоныч!!! »

radio-kot писал(а):А вы сделайте как в примерах к BASCOM


Оригинальный ответ. Я всяко пробовал. И как в примерах и как в других проектах. Но почему то не работает. Я только учусь, по этому и спрашиваю у специалистов. Если нечем помочь, зачем пишете всякую ерунду?
ХатёнаГГ
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Пт фев 27, 2009 01:07:41
Откуда: Иваново - город невест

Re: BASCOM AVR в вопросах и ответах

Сообщение ХатёнаГГ »

htscooter писал(а):Так все равно, у Вас в "Case 0" единичка смещена аж на 3 бита влево, поэтому я и спросил про подключение индикатора. В первоисточнике, как я посмотрел, нулевой бит соответствует сегменту А, восьмой - Н.

Я подключал как было удобнее и до куда проводов хватало на макетке)
З.Ы. Понял в чём баг - я портом D дрыгал на тройке, вместо В. :)
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение Аlex »

осторожно! леоныч!!! писал(а):Если нечем помочь, зачем пишете всякую ерунду?
Подайте заявку на битву экстрасенсов, приедут к Вам и разгадают тайную проблему. Хотя нет, дайте я попробую - питание на ТДА подали ? :)
Аватара пользователя
константин_KoSS_89
Вымогатель припоя
Сообщения: 602
Зарегистрирован: Пн дек 29, 2008 01:40:28
Откуда: (Украина, г. Стаханов, Луганская обл.) теперь Кемерово :)

Re: BASCOM AVR в вопросах и ответах

Сообщение константин_KoSS_89 »

Подскажите, пытаюсь вывести текст на экран хамелиона, пользуясь примером viewtopic.php?f=25&t=55467

Код: Выделить всё

printf("# ZenerTest\n3\n3\n2 Iст %2imA\n2\r",out_cur[a]);

написал

Код: Выделить всё

$Regfile = "m8def.dat"
$Crystal = 8000000
$Baud = 9200

Do

Print "#123456789\n3\n3\n3\r"

Wait 1

Loop
End

Может чего не так написал, не выдает ничего, прошил тини13 (термометр приставка) - работает, после подключения термометра-приставки при попытке вывести строку из своей программы выводит всё в точности как написано кроме решотки в начале, не реагирует ни на один сервисный код (\n3) После как выключу хамелион, полежит минуты две, включаю и пытаюсь свою строку вбить, ноль, только остатки размазанного "луча" по всему экрану.
Питание на приставки подаю отдельно, на хамелион только масса и Тх... В чём подвох?
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Re: BASCOM AVR в вопросах и ответах

Сообщение radio-kot »

наверно 9600 :beer:
Будете проходить мимо- проходите!
Аватара пользователя
константин_KoSS_89
Вымогатель припоя
Сообщения: 602
Зарегистрирован: Пн дек 29, 2008 01:40:28
Откуда: (Украина, г. Стаханов, Луганская обл.) теперь Кемерово :)

Re: BASCOM AVR в вопросах и ответах

Сообщение константин_KoSS_89 »

:oops: :oops: Все может быть...
Аватара пользователя
KOTик
Встал на лапы
Сообщения: 148
Зарегистрирован: Пн июн 07, 2010 16:16:57
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение KOTик »

Всем доброго мяу!
Сделал простенький шим на тиньке13.
Условие: пока удерживается btn1, Pwm0a = 85;
Иначе Pwm0a = 0
Все работает.
Затем решил сделать плавное нарастание и написал так (код урезанный):

Код: Выделить всё

$regfile = "attiny13.dat"
$crystal = 4800000
$hwstack = 32
$swstack = 8
$framesize = 16
Config PORTB.0 = Output                                     'PWM OUT
Config PINB.4 = Input                                       'button for pwm 30%

btn1 Alias PINB.2
Dim A As Byte

Config Timer0 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down
Start Timer0

Do
If btn1 = 1 Then Gosub pwm30
Loop

pwm30:
Waitms 50
For A = 1 To 85 Step 20
Incr A
Pwm0a = A
Waitms 50
Next A
Return

End

Проблема в том, что ШИМ-то плавно нарастает-то, а потом сбрасывает на нОль и опять по кругу. Т.е. циклически.
Получается моргалка с плавным нарастание. Вся проблема, как я понял, в цикле For...Next
2 дня ковыряюсь, и так пишу, и сяк - не получается :(
Ткните пальцем, где ошибка; что не так?
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

Так Вы какой результат хотите получить-то? С циклом For .. Next у Вас вообще ерунда какая-то. Переменная А будет сама увеличиваться с шагом 20, а Вы еще ее инкрементируете...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
KOTик
Встал на лапы
Сообщения: 148
Зарегистрирован: Пн июн 07, 2010 16:16:57
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение KOTик »

edm2007 писал(а):Так Вы какой результат хотите получить-то?

Пока кнопка нажата, плавно нарастает яркость до pwm0a = 85 и удерживается такая яркость.
Отпустил кнопку - LED мгновенно потух (pwm0 = 0).

edm2007 писал(а):С циклом For .. Next у Вас вообще ерунда какая-то. Переменная А будет сама увеличиваться с шагом 20, а Вы еще ее инкрементируете...

Пробовал без For... Next, просто Incr pwm0a - он его увеличивает до 255 и затем гаснет и опять покругу.
А мне нужно плавно инкрементировать до pwm0a = 85 и удерживать на этом уровне до тех пор, пока кнопка удерживается.
Тоже грешу на For... Next - но никак не могу разобраться :facepalm:
Уже который день весь и-нет перелопатил в поисках какого-либо примера - все безуспешно :(
vanyap1
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение vanyap1 »

Я делал так, если правильно помню -
Делал малышке для электромобиля, ато после замены аккумулятора стало сильно рвать редуктор.

Спойлер$regfile = "attiny13.dat"
$crystal = 4800000
$hwstack = 32
$swstack = 8
$framesize = 16
Config PORTB.0 = Output 'PWM OUT
Config PINB.4 = Input 'button for pwm 30%

btn1 Alias PINB.2
Dim A As Byte , B As Byte

Config Timer0 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down
Start Timer0

Do
If Btn1 = 1 Then : B = 85
If A > B Then : Incr A : Waitms 10 : End If
Else : B = 0 : A = 0 : End If
Pwm0a = A

Loop
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

KOTик писал(а):Пока кнопка нажата, плавно нарастает яркость до pwm0a = 85 и удерживается такая яркость.Отпустил кнопку - LED мгновенно потух (pwm0 = 0).


Сделал для меги 8 (на плате для проверки просто она стоит):

Код: Выделить всё

$regfile = "m8def.dat"
$crystal = 4000000

Config Portb.3 = Output                                     'PWM OUT
Config Pinb.5 = Input                                       'button for pwm 30%

Btn1 Alias Pinb.5
Dim A As Byte

Config Timer2 = Pwm , Prescale = 64 , Compare Pwm = Clear Up
Start Timer0

'----------

Do

Debounce Btn1 , 0 , Pwm30 , Sub                             ' кнопка (замыкается на землю, подтяжка внешняя)

Loop

'----------

Pwm30:                                                      ' обработчик кнопки

While Btn1 = 0 And A < 85                                  ' пока кнопка нажата и не дошли до нужной яркости

Incr A                                                      ' плавно увеличиваем яркость
Ocr2 = A
Waitms 50

Wend                                                        ' если же дошли до конца яркости (или отпустили кнопку) выходим из цикла

Bitwait Btn1 , Set                                          ' ожидание отпускания кнопки
Ocr2 = 0                                                    ' гасим светодиод
A = 0                                                       ' и сбрасываем переменную яркости

Return                                                      ' возвращаемся в основной цикл

End


В данном примере при нажатии кнопки на пин подается 0. Если у Вас кнопка замыкается на +5В, то нужно изменить опрос кнопки на Debounce Btn1 , 1 , Pwm30 , Sub,в строке условия изменить на While Btn1 = 1 And A < 85, а в ожидании отпускания кнопки изменить на Bitwait Btn1 , Reset. Ну и само собой кнопка должна быть подтянута либо к земле (в Вашем случае), либо к питанию.

Такой вариант кода хорош тем, что задание выполняется полностью. Яркость нарастает только пока нажата кнопка. Если ее отпустили раньше, то светодиод гаснет тут же.

Если же Вам нужно чтобы светодиод в любом случае загорелся полностью (независимо от того, когда отпустили кнопку), то код может быть таким:

Код: Выделить всё

Do

Debounce Btn1 , 0 , Pwm30 , Sub                             ' кнопка (замыкается на землю, подтяжка внешняя)

Loop

'----------

Pwm30:                                                      ' обработчик кнопки

For A = 1 To 85 Step 1                                      ' плавно увеличиваем яркость

Ocr2 = A
Waitms 50

Next                                                        ' если дошли до конца яркости, выходим из цикла

Bitwait Btn1 , Set                                          ' ожидание отпускания кнопки
Ocr2 = 0                                                    ' гасим светодиод

Return

End


В этом варианте светодиод в любом случае разгорится до конца, и только потом будет проверка удержания кнопки и т.д.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
KOTик
Встал на лапы
Сообщения: 148
Зарегистрирован: Пн июн 07, 2010 16:16:57
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение KOTик »

Кошачье спасибо, кто помог разобраться!
Мррррр :))

vanyap1 - Сам не додумался бы. А вот разобрав Ваш исходник - все стало понятно.
Достаточно было объявить еще одну переменную, а затем их сравнивать.
Правда, пришлось переделать эту строку:

Код: Выделить всё

...
If A < B Then : Incr A : Waitms 10 : End If
...

(было If A > B)

edm2007 - и Вам тоже спасибо!
Разобрал ваш код, благо комменты к каждой строке имеются + пояснения.
Переделал под тиньку, и наглядно увидел что и как работает.
Открыл для себя Bitwait :)
Спасибо, учитель! :))
Ответить

Вернуться в «AVR»