Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Помогите начинающему с програмкой


Помогите начинающему с програмкой

Сообщений 1 страница 10 из 10

1

Помогите нужно сделать програмку где две кнопки и 6 светодиодов и при нажатии на кнопку светодиоды по очереди загораються

0

2

shinkaruk написал(а):

Помогите нужно сделать програмку где две кнопки и 6 светодиодов и при нажатии на кнопку светодиоды по очереди загораються

А вторая кнопка зачем? И какой кристал будете использовать?

0

3

shinkaruk написал(а):

Помогите нужно сделать програмку

Чем помочь, кнопкой или светодиодами? Схема где?

0

4

Чтоб не флудить - присоеденюсь со своей просьбой: нужен цифровой фильтр с возмжностью отсечки определенного диапазона частот, под схему и выбор контроллера подстроюсь

0

5

Вы читаете как тема называется?
Помогите начинающему с програмкой. Где програмка, где схема?
Если хотите, чтобы за Вас делали всё - есть раздел Продам/Куплю/Услуги.

0

6

Всем привет! Делаю себе автокорректор фар для авто.
Программа должна выдавать ШИМ по показанию АЦП.
Сделал так: через задержку идет несколько считываний АЦП затем вычисляется среднее арифметическое и на основании среднего значения АЦП за период времени выдается значение шим.
Так как чем меньше сервопривод дергает фару тем больше у него будет срок службы поэтому весь диапазон значений АЦП поделил на 5 участков.     
Все работает хорошо (на макетке и в симуляторе), но когда значение АЦП близко к границе участка начинается ненужное дерганье, как нужно построить алгоритм что бы этого не было, может как в термостате?

Скрытый текст:

Для просмотра скрытого текста - войдите или зарегистрируйтесь.

0

7

Mrshilov
Проблема не в этом. Допустим, что в машине лежит столько груза что из за неровности дороги значение АЦП меняется в диапазоне от 350 до 450 в результате фары все время  будут "кивать". Как сделать гистерезис? Плавающие границы?

0

8

Как вариант: разбить на 10 поддиапазонов. Через один и более пд переходить сразу, а в соседний по критерию, скажем раз в минуту, или если за некий период "голосов" за переход будет больше, на N , чем за то, чтобы остаться.

0

9

Civil
Ваш вариант похож на то что хочется, типа если значение АЦП находиться в некой отдаленности от границы значения ШИМ  вычисляем среднее значение нескольких средних арифметических и по итогу решаем в какой дискрете остаться.
Mrshilov
С этого варианта я начал, но вскоре понял что такой алгоритм быстро убьет сервопривод.

0

10

Пока в голову полезло только это:

For Q = 0 To 50
W = Getadc(0)                                              '
S = S + W                                                  '
Waitms 50                                                  '
Next Q                                                      '
A = S / 50                                                  '
A = Abs(a)                                                  '
If A < 100 Or A > 900 Then                                  ' Если напряжение АЦП меньше 0,5 или больше 4,5В
Goto Er                                                     ' Считать ошибкой датчика
End If
'------------- Расчет положения корректора -----------------------
If A > Mi Or A < Ma Then
P = A - Mi
P = P / Dis
P = Abs(p)
End If
If A <= Mi Then
P = 0
End If
If A >= Ma Then
P = 4
End If
'-------------------------Допуск интервала---------------------------------------
If P = 1 Then
T = Dis + 5
T = T + Mi
If A < T Then
  P = 0
End If
End If

If P = 2 Then
T = Dis * 2
T = T + Mi
T = T + 5
If A < T Then
  P = 1
End If
End If

If P = 3 Then
T = Dis * 3
T = T + Mi
T = T + 5
If A < T Then
  P = 2
End If
End If

If P = 4 Then
T = Dis * 4
T = T + Mi
T = T + 5
If A < T Then
  P = 3
End If
End If

'-------------P=0 минимальная загрузка, P=4 максимальная загрузка---------------
Select Case P
  Case 0 : Pwm1a = 128                                      'U = 5.08V
  Case 1 : Pwm1a = 159                                      'U = 6.23V
  Case 2 : Pwm1a = 190                                      'U = 7.46V
  Case 3 : Pwm1a = 221                                      'U = 8.69V
  Case 4 : Pwm1a = 252                                      'U = 10.0V
End Select
    Locate 1 , 2
    Wstr = Str(a)
    Wstrformat = Format(wstr , "000")
    Lcd Wstrformat ; " ADC " ; P;
'---------------------------------------------------------------------------
Set Portd.7                                                 ' Мигаем каждый цикл
Waitms 100
Reset Portd.7
Loop

'--------------------------Подпрограмма ошибки датчика--------------------------
Er:
'Stop Watchdog
Set Portd.6                                                 ' Зажигаем светодиод ошибки датчика
Cls
Lcd "Sensor Error "
Pwm1a = 128                                                 ' Устанавливаем корректор в положение 0
End
'---------------Подпрограмма прирывания по кнопки-------------------------------
Button:                                                     ' Обработка прерывания по кнопки
Do
Z = 0                                                      ' Сброс флага удачного считывания
If Pind.4 = 0 Then                                         ' Нажата кнопка максимальная загрузка
  Z = 1                                                     ' Нажатие считано
  Ma = Getadc(0)                                            ' Сохраняем значение максимальной загрузки
End If
If Pind.5 = 0 Then                                         ' Нажата кнопка минимальная загрузка
  Z = 1                                                     ' Нажатие считано
  Mi = Getadc(0)                                            ' Сохраняем значение минимальной загрузки
End If
Loop Until Z = 0                                            ' Если дребезг помешал вычислению нажатой кнопки, повторяем
Raz = Ma - Mi                                               ' Вычисляем разность между максимальной и минемальной загрузкой
Dis = Raz / 5                                               ' Вычисляем значение одной дискреты
Midata = Mi                                                 ' Сохраняем в EEPROM значение минемальной загрузки
Madata = Ma                                                 ' Сохраняем в EEPROM значение максимальной загрузки
Razdata = Raz                                               ' Сохраняем в EEPROM значение разности между загрузками
Disdata = Dis                                               ' Сохраняем в EEPROM значение одной дискреты
Set Portd.7                                                 ' Мигаем при сохранении в EEPROM 1 секунда
Waitms 1000
Reset Portd.7
Gifr = 64                                                   ' Сброс флага прерывания
Return

Может подчеркнутую часть кода можно записать компактней?

Отредактировано boida (2015-04-21 22:39:09)

0


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Помогите начинающему с програмкой