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

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

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

Сообщение edm2007 »

Ну отлично, Вы все правильно делаете, значит. :)) А теперь поставьте точку останова в исходнике там, где идет обработка нажатой при включении кнопки (брекпоинт ставится двойным нажатием по строке исходника). Теперь при запуске симуляция остановится на этой точке. Или не остановится, если туда не попадет. А далее можно будет пошагово (кнопка с ботинком) пройти по коду, смотря что творится.

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

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

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

[uquote="edm2007",url="/forum/viewtopic.php?p=3095790#p3095790"]А теперь поставьте точку останова в исходнике там, где идет обработка нажатой при включении кнопки (брекпоинт ставится двойным нажатием по строке исходника). Теперь при запуске симуляция остановится на этой точке. Или не остановится, если туда не попадет. А далее можно будет пошагово (кнопка с ботинком) пройти по коду, смотря что творится.[/uquote]
Поставил красную точку break point. Запускаю симуляцию (F12)и она останавливается в указанной точке (строка, где происходит проверка кнопки до подачи питания).
Далее нажимаю на ботинок(и) (пошагово) - происходит проверка Debounce кнопок и всех условий If внутри цикла Do...Loop
Ну и можете проект с протеусом прикрепить, ежели чего... :tea:

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

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

Сообщение edm2007 »

А почему Вы перед изменением режима, не считываете его номер из EEPROM? Ведь

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

Mmode = Mmode + 1                                        'инкрементируем        


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

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

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

[uquote="edm2007",url="/forum/viewtopic.php?p=3095838#p3095838"]А почему Вы перед изменением режима, не считываете его номер из EEPROM? Ведь
всегда равна 1. Эта единица и будет всегда записываться в EEPROM, при попытке изменить режим.[/uquote]
Ой. А вот и первый баг :)
Исправил, но все равно не фурычит. И даже режим не переключается.
Привожу кусочек код опроса кнопки до включения:

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

If Btn = 0 Then
   Mmode = S ---->> ДОБАВИЛ ТОЛЬКО ЭТУ СТРОЧКУ.
   Waitms 500
   Mmode = Mmode + 1                                        'инкрементируем
   Waitms 500
   S = Mmode                                                'сохраняем в S Eram
   Waitms 500
   Led = 1                                                  'мигаем 1 раз
   Waitms 100
   Led = 0
   Waitms 100

   If Mmode >= 2 Then                                       'Сбрасывам в ноль, если Mmode больше или равно 2.
   Mmode = 0

   Else                                                     'в противном случае
   If Btn = 1 Then                                          'если кнопку не нажимали
   Waitms 500
   Mmode = S                                                'считываем раннее записанное значение Mmode (режима)
   End If                                                   'конец условия
   Wait 3
   End If                                                   'конец условия
   End If                                                   'конец условия
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Второй нюанс работы с EEPROM: изначально по всем адресам записано значение FF. А значит при первом включении нужно инициализировать нужные ячейки. Вообще в Вашем случае при первой попытке изменить режим должно считаться 255, далее 255 +1 = 0. И этот 0 запишется в память. При следующей попытке изменить режим уже будет 1. Далее - 2. А значит выполнится условие

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

If Mmode >= 2 Then                                       'Сбрасывам в ноль, если Mmode больше или равно 2.
Mmode = 0


Но тут нет сохранения в EEPROM. А значит Mmode будет при зажатой кнопке равна 2 (и сразу 0), и так далее. Проще говоря, Mmode всегда будет 0 (а в EEPROM при этом счетчик будет шагать, переменную S ведь никто не обнулял в этом условии). :tea:

Добавлено after 5 minutes 44 seconds:
Кстати, для того чтобы полностью сбросить МК в протеусе (и EEPROM в том числе), при остановленной симуляции выберите "Отладка -> Сброс постоянных данных модели".
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
KOTик
Встал на лапы
Сообщения: 148
Зарегистрирован: Пн июн 07, 2010 16:16:57
Контактная информация:

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

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

Сделал так:

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

Mmode = S
If Btn = 0 Then
   Waitms 500
....

В эмуляторе в этом случае переменная Mmode каждый раз увеличивается, при смене режима. А вместе с ней и значение в еепром.
Почему то Mmode не сбрасывается в 0, ведь стоит следующее условие:

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

   If Mmode >= 2 Then                                       'Сбрасываем в ноль, если Mmode больше или равно 2.
   Mmode = 0

Таким образом Mmode не равно 1, следовательно, режим сменить не получается :(

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

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

Сообщение edm2007 »

Смотрите, как сейчас дело обстоит у Вас.

1. Включаем агрегат с зажатой кнопкой. Из EEPROM считывается 255.
2. Mmode = 255 + 1 = 0
3. Этот 0 сохраняется в EEPROM.
4. В итоге Mmode = 0 и S = 0, идем в основной цикл.

//----------

1. Включаем агрегат с зажатой кнопкой. Из EEPROM считывается 0.
2. Mmode = 0 + 1 = 1
3. Эта 1 сохраняется в EEPROM.
4. В итоге Mmode = 1 и S = 1, идем в основной цикл.

//----------

1. Включаем агрегат с зажатой кнопкой. Из EEPROM считывается 1.
2. Mmode = 1 + 1 = 2
3. Эта 2 сохраняется в EEPROM.
4. Теперь выполняется условие If Mmode >= 2 Then, и Mmode становится равна нулю.
5. В итоге Mmode = 0, а S = 2 (ее-то никто не сбросил), идем в основной цикл.

//----------

1. Включаем агрегат с зажатой кнопкой. Из EEPROM считывается 2.
2. Mmode = 2 + 1 = 3
3. Эта 3 сохраняется в EEPROM.
4. Снова выполняется условие If Mmode >= 2 Then, и Mmode становится равна нулю.
5. В итоге Mmode = 0, а S = 3, идем в основной цикл.

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

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

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

А как записать 255 в еепром?
В самом начале кода
прописал так: Mmode = 255
При нажатии на кнопку увеличивается на 1 и как бы сохраняется. А вот при повторном включении все-равно Mmode = 255 и так по кругу. Я чего-то не догоняю, туплю :(
Пойду отдохну маленко, обмозгую...
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Вы не о том думаете, запутывая себя же самого. Зачем записывать 255? Перечитайте

edm2007 писал(а):изначально по всем адресам записано значение FF


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

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

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

[uquote="edm2007",url="/forum/viewtopic.php?p=3095994#p3095994"]я не писал что нужно сделать. :)[/uquote]
Учитель :)
Может быть завести еще одну переменную Flag?
Не пинайте сильно.

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

Dim S As Eram Byte                                      
Dim Mmode As Byte                                         
Dim Flag As Byte                                             

If Btn = 0 Then
   Flag = S
   Waitms 500
   Flag = Mmode + 1                                        'инкрементируем
   Waitms 500
   S = Flag                                                'сохраняем в S Eram
   Waitms 500
   Led = 1                                                  'мигаем 1 раз
   Waitms 100
   Led = 0
   Waitms 100

   If Flag >= 2 Then                                       'Сбрасывам в ноль, если Flag больше или равно 2.
   Flag = 0

   Else                                                     'в противном случае
   If Btn = 1 Then                                          'если кнопку не нажимали
   Waitms 500
   Flag = S                                                'считываем раннее записанное значение Mmode (режима)
   End If                                                   'конец условия
   Wait 3
   End If                                                   'конец условия
   End If                                                   'конец условия

Do
....
Loop

...
...
'================= О Б Р А Б О Т Ч И К  П Р Е Р Ы В А Н И Й ==

'/// ---> ВЫКЛЮЧАЕМ ДХО
Drl_off:                                                    'метка
If Flag = 1 And Turn = 1 Then                              'Если выбран Flag=1 и включен поворотник, тогда
Pwm0a = 255                                                 'Включаем ШИМ на полную яркость
Else                                                        'В противном случае, Flag=0 + включен поворотник, тогда
Pwm0a = 0                                                   'Выключаем ШИМ вовсе
End If                                                      'конец условия
Bitwait Turn , Reset                                        'ждем когда поворотник перестанет мигать
Return                                                      'выходим


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

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

Сообщение edm2007 »

Хе. Давайте с самого начала, режим должен переключаться как? 0 - 1 - 0 - 1? Вы в условии

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

If Mmode >= 2 Then                                       'Сбрасывам в ноль, если Mmode больше или равно 2.
Mmode = 0


сбрасываете режим в ноль, но при этом оставляете его в переменной S, хотя это копия режима. Как минимум, должно быть так

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

If Mmode >= 2 Then                                       'Сбрасывам в ноль, если Mmode больше или равно 2.
Mmode = 0
S = Mmode                                                'сохраняем в S Eram


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

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

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

[uquote="edm2007",url="/forum/viewtopic.php?p=3097224#p3097224"]сбрасываете режим в ноль, но при этом оставляете его в переменной S, хотя это копия режима. Как минимум, должно быть так

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

If Mmode >= 2 Then                                       'Сбрасывам в ноль, если Mmode больше или равно 2.
Mmode = 0
S = Mmode                                                'сохраняем в S Eram
[/uquote]
Спасибо!
Сделал так:

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

'/// ---> НАСТРОЙКА РЕЖИМА РАБОТЫ
'До подачи питания нажимаем кнопку и держим до тех пор,
'Значение Mmode не изменится
'LED мигнет 1раз сигнализируя о том, что настройка сохранилась

Mmode = S
If Btn = 0 Then
   Waitms 500
   Mmode = Mmode + 1                                        'инкрементируем
   Waitms 500
   S = Mmode                                                'сохраняем в S Eram
   Waitms 500
   Led = 1                                                  'мигаем 1 раз
   Waitms 100
   Led = 0
   Waitms 100

   If Mmode >= 2 Then                                       'Сбрасывам в ноль, если Mmode больше или равно 2.
   Mmode = 0
   S = Mmode ------> 'ВОТ ЭТА СТРОЧКА, из-за которой вся головная боль началась :)

   Else                                                     'в противном случае
   If Btn = 1 Then                                          'если кнопку не нажимали
   Waitms 500
   Mmode = S                                                'считываем раннее записанное значение Mmode (режима)
   End If                                                   'конец условия
   Wait 3
   End If                                                   'конец условия
   End If                                                   'конец условия



В симуляторе работает просто замечательно :)
Гляжу в окна AVR Variables и AVR EPROM Memory = Переменные Mmode и S меняются одинаково: 1 и 0; 0 и 1.
Вечером в железе попробую.
Еще раз спасибо, учитель! :)
Эта строка мне столько крови выпила вы прошлый уик-энд. Да и из головы что-то вылетело условие, что если Mmode = 0 его тоже нужно сохранять.
Урааа! :kill:
rojnov
Встал на лапы
Сообщения: 127
Зарегистрирован: Вс мар 27, 2011 07:48:48
Откуда: г. Екатеринбург

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

Сообщение rojnov »

Приветствую всех, кто не спит, и прошу посильной помощи. Написал малюсенькую, но очень

нужную, программульку, а она не хочет работать, хотя по идее должна была. Задача такая: в

рабочем режиме контакты на входе замкнуты( использую INT0 у Tiny13 на 6 ноге). На выходе МК

(PB.2) стоит оптореле, которое далее по схеме включает силовую часть. Периодичести раз в 2

мин контакты на входе размыкаются на 1 сек, и надо, чтобы выход на эти размыкания не

реагировал. Но если вход разомкнут более чем на 2 сек, устройство на выходе выключается.
Прошу посмотреть свежим взглядом, чего ему не хватает. Собрал на макетке, вместо оптореле

воткнул светодиод.

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

$regfile = "attiny13a.dat"
$crystal = 4800000
$hwstack = 8
$swstack = 16
$framesize = 32

Config Pinb.1 = Input
Config Portb.2 = Output
Config Int0 = Falling
On Int0 Pr
Enable Interrupts
Enable Int0
Dim A As Long
Hrom Alias Pinb.1
Rele Alias Portb.2
A = 0 : Reset Rele

Do
If Hrom = 1 Then Incr A
   If A = 1200000 Then
      Reset Rele
      Powerdown
   End If

Loop

Pr:
A = 0 : Set Rele
Return

End


Добавлено after 9 hours 25 minutes 37 seconds:
Понял, что через Int0 работать не будет. Сделал еще проще. Но светик, вместо того, чтобы

спокойно гореть, очень часто мигает. На размыкание кнопки на входе реакции тоже нет. Пока

думаю.

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

$regfile = "attiny13a.dat"
$crystal = 4800000
$hwstack = 8
$swstack = 16
$framesize = 32

Config Pinb.3 = Input
Config Portb.1 = Output
Hrom Alias Pinb.3
Rele Alias Portb.1
Dim A As Long
A = 0 : Reset Rele

Do
If Hrom = 0 Then Set Rele
If Hrom = 1 Then
 Incr A
   If A = 1200000 Then
      Reset Rele : A = 0
   End If
End If
Loop
Аватара пользователя
Gordon Shumway
Мучитель микросхем
Сообщения: 485
Зарегистрирован: Пн авг 20, 2007 21:35:45
Откуда: Мытищи, Московская область
Контактная информация:

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

Сообщение Gordon Shumway »

[uquote="rojnov",url="/forum/viewtopic.php?p=3114941#p3114941"]светик, вместо того, чтобы
спокойно гореть, очень часто мигает. На размыкание кнопки на входе реакции тоже нет. Пока
думаю.

If A = 1200000 Then
Reset Rele : A = 0[/uquote]

Ну, логично. Здесь светик должен моргать примерно 4 раза в секунду. При такой тактовой частоте A становится равна 1200000 за 0,25 секунд.
Для решения вашей задачи проще не считать тики на такой частоте, а использовать встроенный таймер для замера времени и считать его переполнения.
2 секунды на частоте 4,8 мгц - это 37 переполнений 8-битного таймера c делителем 1024

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

$regfile = "attiny13a.dat"
$crystal = 4800000
$hwstack = 8
$swstack = 16
$framesize = 32

Config Pinb.3 = Input
Config Portb.1 = Output
Hrom Alias Pinb.3
Rele Alias Portb.1
Dim A As byte
A = 0 : Reset Rele

Config Timer0 = Timer , Prescale = 1024
Enable Timer0
Enable interrupts
On Timer0 Incr_a
Stop Timer0

Do

If Hrom = 0 Then Set Rele
If Hrom = 1 Then
     Start timer0
     While Hrom = 1
     If A > 37 Then
         Stop Timer0
         A = 0
         Reset Rele
         Exit While
      End If
     Wend
       Stop Timer0
       A = 0
End If

Loop


Incr_a:
incr a
return

End                                                         'end program


Пока Hrom = 0 - светик горит, таймер стоит. На Hrom стал 1 - таймер затикал, переполнения считаются в подпрограмме Incr_a. Стало 37 переполнений - остановили таймер, сбросили А, cбросили Rele. Если На Hrom уже не 1, а A еще не стало 37 - остановили таймер, сбросили А, Rele не трогаем.
Проверить не на чем, но вроде компилится. Проверяйте. Обратите внимание на фузы установки частоты кристалла, так как таймер рассчитывается исходя из этой частоты.
С уважением,
Алексей.
rojnov
Встал на лапы
Сообщения: 127
Зарегистрирован: Вс мар 27, 2011 07:48:48
Откуда: г. Екатеринбург

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

Сообщение rojnov »

Спасибо, вечером попробую. Вообще-то я начинал с использования таймера, но почему-то решил, что проще считать тики МК чем возиться с таймером. В итоге мысль пошла не в ту сторону.
rojnov
Встал на лапы
Сообщения: 127
Зарегистрирован: Вс мар 27, 2011 07:48:48
Откуда: г. Екатеринбург

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

Сообщение rojnov »

Добрый вечер всем! Попробовал в железе (на макетке) и ничего не могу понять. По идее, все должно работать. Попробовал на 2-х разных МК: на одном светик горит нормально, на другом- мигает очень часто. Причем на нажатие кнопки на входе оба не реагируют. Специально перепроверил фьюзы - у обоих одинаково. Попробовал в Протеусе - все работает, как надо. Может быть, с камнями что-то не так?
Наверное, буду делать на печатной плате с МК в SO-8. Они точно новые.
Аватара пользователя
Gordon Shumway
Мучитель микросхем
Сообщения: 485
Зарегистрирован: Пн авг 20, 2007 21:35:45
Откуда: Мытищи, Московская область
Контактная информация:

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

Сообщение Gordon Shumway »

[uquote="rojnov",url="/forum/viewtopic.php?p=3115510#p3115510"]Попробовал в железе (на макетке) и ничего не могу понять. По идее, все должно работать.[/uquote]

Про сопротивление Pinb.3 на плюс 4,7к не забыли ? Протеусу все равно, а в реальных схемах нужно подтягивать. И емкость 0,1 мкф Pinb.3 на землю. Фузы проверяйте, делитель на 8 должен быть выключен.
Я не знаю что у вас за кнопка, может "звенит". Попробуйте вставить задержку:
If Hrom = 1 Then
waitms 200
Start timer0
...
С уважением,
Алексей.
Аватара пользователя
Tankor
Встал на лапы
Сообщения: 139
Зарегистрирован: Вт май 03, 2011 10:13:12
Откуда: Россия, Татарстан

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

Сообщение Tankor »

Может кто сталкивался с алгоритмами предсказания погоды по изменению давления и влажности? Есть алгоритм Zambretti, но реализация только на php, а я в нём ни бум-бум. Что скажете? Может кто уже делал?
IDok
Встал на лапы
Сообщения: 122
Зарегистрирован: Ср фев 01, 2017 17:57:15

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

Сообщение IDok »

друзья, подскажите кто что может. есть программа, надо управлять режимами одной кнопкой. проблема в том, что по нажатию кнопки возврат из прерывания приходит в самую гущу длинного и долгого цикла и пока он не докрутится - переходов нет. надо каким-то макаром попадать из прерывания кнопки в начало программы. Goto не предлагать - не работает
$Regfile="attiny85.dat"
$Crystal=8000000
$hwstack=40
$swstack=16
$framesize=32


Config Portb.0 = Output 'R
config portb.1 = output 'G
config portb.4 = output 'B
Config PORTB.3 = output 'белый свет
Config PINB.2 = input 'кнопка

Config Int0 = Falling : On INT0 Button
Config Timer1 = Timer , Prescale = 1 : On Timer1 Pwm_prog : Enable Timer1 : Enable Interrupts : start timer1 : Enable Int0


Dim S As Byte , A as Byte , C(3) as byte , B as Byte

B=0
for A=0 to 63 'увеличиваем красный
C(1)=lookup(A , TAB_PWM)
waitms 20
next
Do
if B=1 then goto 1
if B=2 then goto 2
loop
2:
do
If B=2 then
тут длинный и долгий ШИМ для светодиодов
End if
Loop

1:
Do
If B=1 Then
PORTB.0 = 0 : PORTB.1 = 0 : PORTB.4 = 0 : PORTB.3 = 1 'включаем белый свет
End if
Loop

end



Pwm_prog:
Return

Button:
Incr B
waitms 10
if B>2 then B = 0
Return


5
Аватара пользователя
serg_svd
Собутыльник Кота
Сообщения: 2560
Зарегистрирован: Ср янв 16, 2008 08:34:04
Откуда: KMV

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

Сообщение serg_svd »

IDok , на мой взгляд программа неправильно написана. Вижу ДВА бесконечных цикла без выхода из них. Бесконечный цикл должен быть один. в нем и крутится основная программа.
Сделайте в нем switch - case по переменной В и будет вам счастье/
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Ответить

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