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

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

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

Сообщение edm2007 »

Именно в коде? Да как минимум то, что Wait непригодна для точного отсчета временных интервалов. Даже при работе на внутреннем генераторе и используя таймер, будет погрешность отсчета. Что уж тут говорить про Wait. Ну а про то, что микроконтроллер сидит целую секунду в задержке, я вообще молчу. В этой конструкции оно не важно, но начинающие запросто утягивают такие "решения", и потом втыкают их во все свои проекты.

Асинхронный режим хорош, да. В статье речь идет о часах, там Баском своими силами все настраивает и запускает. Но сконфигурировать таймер для своих целей не составит труда. Только обработчик самому нужно будет написать.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

Внутренний генератор вообще не стабильная штука.
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

Извиняюсь edm2007, но прошу помощи!
Вопрос, если используем не 4-х, а 3-х разрядные LED индикаторы, меняем значение разрядов в коде соответственно на 3, а цифры обрезаются со старшего разряда т.е было 1234 выводится 234 я честное слово не пойму?

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

'************************ [прерывание таймера Т0] ******************************
Refresh:
'=============== Разряды ===================
 Incr Count : If Count > 3 Then Count = 1                   ' увеличиваем значение счетчика на 3 разряда
   Ledout = Lookup(count , Razr)                            ' забираем номер разряда
  Gosub Registr

'========== Второй индикатор ===============
 Ledout = Lookup(number(count + 3) , Digits)                ' забираем код цифры для ВТОРОГО индикатора
  If H_flag2(count) = 1 Then                                 ' если установлен флаг
   Ledout = Ledout Xor &B10000000                           ' зажигаем точку
  End If
 Gosub Registr                             'закидываем в регистр

'========== Первый индикатор ===============
 Ledout = Lookup(number(count) , Digits)                    ' забираем код цифры для ПЕРВОГО индикатора
  If H_flag1(count) = 1 Then                                 ' если установлен флаг
   Ledout = Ledout Xor &B10000000                           ' зажигаем точку
  End If
 Gosub Registr                             ' закидываем в регистр

 Pulseout Portc , 2 , 20                                    ' защелкиваем данные (для 4МГц импульс 5мкс)

Return


'<---------- подпрограмма отправки данных в регистр
Registr:

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

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

Сообщение edm2007 »

А разнос по разрядам как выглядит?
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

Выложил весь проект.

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

Led_indikator:                                              ' в прерывании выводим данные на LED индикаторы
'................................. Разряды .....................................
 Incr Count : If Count > 3 Then Count = 1                   ' увеличиваем значение счетчика на 3 разряда
    Ledout = Lookup(count , Razr)                           ' забираем номер разряда
 Gosub Registr                                             ' закидываем в регистр
'---------- Второй индикатор (ток) ----------
 Call Preobraz_chisel                                       ' преобразуем данные с АЦП
  Pr = 2                                                    ' устанавливаем флаг
   Ledout = Lookup(number(count + 3) , Digits)              ' забираем код цифры для ВТОРОГО индикатора
'<................ управление точками ВТОРОГО индикатора
  If H_flag2(count) = 1 Then                                ' если установлен флаг
    Ledout = Ledout Xor &B10000000                          ' зажигаем точку
  End If
 Goto Registr                                               ' закидываем в регистр
'---------- Первый индикатор (напряжение)----------
 Call Preobraz_chisel()
  Pr = 1
   Ledout = Lookup(number(count) , Digits)                  ' забираем код цифры для ПЕРВОГО индикатора
'<................ управление точками ПЕРВОГО индикатора
  If H_flag1(count) = 1 Then                                ' если установлен флаг
    Ledout = Ledout Xor &B10000000                          ' зажигаем точку
  End If
  Goto Registr

 Pulseout Portc , 2 , 20                                    ' защелкиваем данные (для 4МГц импульс 5мкс)

Return

'<---------- подпрограмма отправки данных в регистр
Registr:

  Shiftout 595data , 595clock , Ledout , 1                  ' задвигаем данные
Return
'********************* подпрогр измерения тока и напряж ************************
Sub Adc_opros
  Start Adc                                                 ' запускаем преобразование
    V_adc = Getadc(0) : I_adc = Getadc(1)                   ' <---- приравниваем переменную V_adc, I_adc к числу которое получили с 0, 1 канала АЦП
  Stop Adc                                                  ' останавливаем работу АЦП
End Sub

'*************************** подпрограмма расчета ******************************
Sub Raschet(lcd_print As Single , V_adc As Word , Perem_v As Single )       'подпрограмма приведения
   Lcd_print = V_adc * Perem_v                              ' данных к удобовоспроизводимому виду
End Sub

'***************** [Считываем показания с АЦП преобразуем в цифры] *************
Sub Preobraz_chisel                                         ' переводим значение АЦП в цифры

 Call Adc_opros

 If Pr = 1 Then Goto Pr1
 If Pr = 2 Then Goto Pr2

 Pr1:
 Call Raschet(lcd_print , V_adc , Perem_v)
   Value = Lcd_print                                        ' переменная для разноса
 For Temp = 3 To 1 Step -1                                  ' в цикле разбиваем переменную по разрядам
   Number(temp) = Value Mod 10
   Value = Value / 10
 Next

 Pr2:
 Call Raschet(lcd_print , I_adc , Perem_i)
   Value = Lcd_print                                        ' переменная для разноса
 For Temp = 6 To 4 Step -1                                  ' в цикле разбиваем переменную по разрядам
   Number(temp) = Value Mod 10
   Value = Value / 10
 Next

End Sub
Вложения
LED на 3 разряда.7z
(62.67 КБ) 192 скачивания
Последний раз редактировалось amv2000 Вс июл 22, 2012 14:19:20, всего редактировалось 1 раз.
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

amv2000 писал(а):было 1234 выводится 234 я честное слово не пойму?


Я вот тоже не пойму, какие 1234, если индикатор трехразрядный? При разносе на 3 разряда мы и получим 234.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

edm2007 писал(а): При разносе на 3 разряда мы и получим 234.

Ну я считал, что 123...Где мы задаем количество цифр, в цикле?

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

 Incr Count : If Count > 3 Then Count = 1                   ' увеличиваем значение счетчика на 3 разряда
    Ledout = Lookup(count , Razr)                           ' забираем номер разряда
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

При разносе 1234 на три разряда?

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

1. 1234 mod 10 = 4   <<<
    1234 / 10 = 123

2. 123 mod 10 = 3    <<<
    123 / 10 = 12

3. 12 mod 10 = 2     <<<
    12 / 10 = 1

уходим...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

В принципе я уже выкрутился можно брать код и на 4 разряда, просто отключить 4 по схеме, но интересно собственно берется только 4 цифры Value = 1234, или можно и три Value = 123 ???
Или во втором случае надо менять

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

Синтаксис:

SHIFTOUT Data , Clock , var , option

Data - пин микроконтроллера для вывода данных

Clock - пин микроконтроллера для вывода тактовых импульсов

var - переменная, которую необходимо отправить в регистр

option - может принимать значения от 0 до 3:

0 – старший значащий бит идет первым, Clock активный уровень низкий
 1 – старший значащий бит идет первым, Clock активный уровень высокий
 2 – младший значащий бит идет первым, Clock активный уровень низкий
 3 – младший значащий бит идет первым, Clock активный уровень высокий
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Да при чем тут это-то? Это совсем не имеет никакого отношения к проблеме. Еще раз говорю, если разбивать переменную 1234 в цикле For Temp = 3 To 1 Step -1, то на выходе мы и получим 2 3 4. Это же очевидно.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

edm2007 писал(а):если разбивать переменную 1234 в цикле For Temp = 3 To 1 Step -1

Воооот, а если разбивать 123? почему собственно 1234?
Я опрашиваю АЦП, преобразую данные и вывожу их на LED, мне не понятно почему данные на 4 знака?
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Так и разбивайте, кто мешает-то?! Если у Вас индикатор на три разряда, так какого же Вы кота туда пытаетесь вывести четырехразрядную переменную?!! Что вы хотите получить? Индикация пробегает три разряда, разнос выполняется по трем разрядам, а Вам 1234 надо? Передавайте подпрограмме разноса соответствующее значение, и все будет хорошо:

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

Value = 789                                             
 
For Temp = 3 To 1 Step -1                                 
   Number(temp) = Value Mod 10
   Value = Value / 10
Next
.....................................................
Value = 123                                             
 
For Temp = 6 To 4 Step -1                                 
   Number(temp) = Value Mod 10
   Value = Value / 10
Next


Изображение

Только смените тип на Dim Number(6) As Word, разносятся значения более 255...

amv2000 писал(а):мне не понятно почему данные на 4 знака?


Так это Вас спросить нужно, зачем Вы на трехразрядный индикатор пытаетесь вывести 4 знака...
Вложения
LCD+3LED.png
(2.62 КБ) 768 скачиваний
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

edm2007 писал(а):Так это Вас спросить нужно, зачем Вы на трехразрядный индикатор пытаетесь вывести 4 знака...

Тут и не поспоришь, попробовал вручную прописать значение Value и все выводится. Где то в моих преобразованиях косяк, буду смотреть.
Спасибо большое, извините за назойливый выходной!
PS: Нашел! понагорадил переменных даже сам не разберусь, пошел поработал лопатой и ум прояснился.
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Ну так правильно, максимальное значение регистра АЦП - 1023 (что уже не влезет), а Вы в дальнейшем его еще и умножаете...

Тут вот интересно еще:

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

If Pr = 1 Then Goto Pr1
If Pr = 2 Then Goto Pr2

 Pr1:
 
 Pr2:


Это у Вас выбор действия в зависимости от значения? Это так задумано, что при Pr = 2 будет выполняться блок Pr2, а при Pr = 1 будут выполняться оба?
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

edm2007 писал(а):Это так задумано, что при Pr = 2 будет выполняться блок Pr2, а при Pr = 1 будут выполняться оба?

Вообще то нет, замечание принимается. Я еще было засомневался, как говорят в юмористическом монологе...
Так будет правильно?

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

If Pr = 1 Then Goto Pr1
If Pr = 2 Then Goto Pr2

 Pr1:
 Return
 Pr2:
 Return

или так

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

If Pr = 1 Then Goto Pr1
If Pr = 2 Then Goto Pr2

 Pr1:
 Goto Preobr
 Pr2:
Preobr:
 Return
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

Правильней тогда без возврата:

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

If Pr = 1 Then Goto Pr1
If Pr = 2 Then Goto Pr2

 Pr1:
 Goto Preobr
 Pr2:
Preobr:


Если с возвратом, то так:

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

If Pr = 1 Then Gosub Pr1
If Pr = 2 Then Gosub Pr2

 Pr1:
Return
 Pr2:
Return
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

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

If Pr = 1 Then Goto Pr1
If Pr = 2 Then Goto Pr2

 Pr1:
 Goto Preobr
 Pr2:
Preobr:
End sub

Да скорее это, спасибо!
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

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

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

Сообщение edm2007 »

Два Return это плохо. А что за тяга к прыжкам? :) Кто мешал сделать нормальный выбор?

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

If Pr = 1 Then

...................

ElseIf Pr = 2 Then

...................

End If
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

edm2007 писал(а):А что за тяга к прыжкам? :) Кто мешал сделать нормальный выбор?

Да ответ очевиден не догадался :)))
Как в Армии х... тут думать прыгать надо.
Ответить

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