Ответ в теме: Программирование МК AVR



#22175
augadi@mail.ru
Участник

Помогите переписать программу с BASCOM-AVR на атмел студио
———————————-
$regfile = «m8adef.dat» ‘ATmega8A
$crystal = 8000000 ‘8МГц (деление на 8 отключить)
$baud = 9600 ‘——————————————————————————
Ddrb = &B11111111 ‘PB7, PB6, PB5, PB4, PB3, PB2, PB1, PB0
Ddrc = &B11111111 ‘N/C, RESET, PC5, PC4, PC3, PC2, PC1, PC0
Ddrd = &B11001010 ‘PD7, PD6, PD5, PD4, PD3, PD2, TXD, RXD
‘——————————————————————————
Dim Count_led As Byte ‘счетная переменная
Dim Count_debounce As Byte ‘счетная переменная
Dim N(3) As Integer ‘значения трех разрядов

Dim Wt As Byte ‘регулировка времени открытия симистора
Dim Led As Byte ‘индикация мощности
‘——————————————————————————
Config Int0 = Falling ‘вход детектора 0
On Int0 Imp_0 ‘обработка прерывания INT0
‘——————————————————————————
Config Timer0 = Timer , Prescale = 1024 ‘переполнение каждые 0,032сек.
On Timer0 Perepolnenie_0 ‘обработка прерывания TIMER0
‘——————————————————————————
Dig1 Alias Portc.1 ‘сотни
Dig2 Alias Portc.3 ‘десятки
Dig3 Alias Portc.5 ‘единицы

Opto Alias Portd.3 ‘управление симистором

Up_button Alias Pind.4 ‘кнопка UP
Down_button Alias Pind.5 ‘кнопка DOWN

Buzzer Alias Portd.6 ‘пищалка
‘——————————————————————————
Enable Interrupts ‘разрешаем использование прерываний
Enable Timer0 ‘разрешаем прерывание по переполнению TIMER0
Enable Int0 ‘разрешаем внешнее прерывание INT0
‘——————————————————————————
Wt = 195 ‘минимальный накал

Maine: ‘основной цикл

Do

If Count_debounce > 40 Then Reset Buzzer ‘антидребезг

Gosub Refresh_led ‘обработка индикации

If Up_button = 0 And Buzzer = 0 Then
If Wt < 255 Then Wt = Wt + 6 ‘увеличиваем мощность
Set Buzzer ‘пикаем
Count_debounce = 0 ‘сбрасываем счетчик антидребезга
End If

If Down_button = 0 And Buzzer = 0 Then
If Wt > 195 Then Wt = Wt — 6 ‘уменьшаем мощность
Set Buzzer ‘пикаем
Count_debounce = 0 ‘сбрасываем счетчик антидребезга
End If

Select Case Wt ‘соответствие открытия симистора % мощности
Case 195 : Led = 1
Case 201 : Led = 10
Case 207 : Led = 20
Case 213 : Led = 30
Case 219 : Led = 40
Case 225 : Led = 50
Case 231 : Led = 60
Case 237 : Led = 70
Case 243 : Led = 80
Case 249 : Led = 90
Case 255 : Led = 100
End Select

Loop
End
‘——————————————————————————
Refresh_led: ‘подготовка данных для вывода на индикатор

N(1) = Led ‘разбиваем число на цифры
N(2) = N(1)
N(3) = N(1)

N(1) = N(1) / 100 ‘1 цифра
N(1) = Abs(n(1))

N(2) = N(2) Mod 100 ‘2 цифра
N(2) = N(2) / 10
N(2) = Abs(n(2))

N(3) = N(3) Mod 10 ‘3 цифра
N(3) = Abs(n(3))

Incr Count_led ‘выбираем разряд для загрузки
If Count_led > 3 Then Count_led = 1 ‘всего 3 разряда

Set Dig1 : Set Dig2 : Set Dig3 ‘гасим индикатор

Portb = Lookup(n(count_led) , Digits) ‘закидываем в порт код цифры

Select Case Count_led ‘включаем соответствующий разряд индикатора
Case 1 : If N(1) <> 0 Then Reset Dig1 ‘гашение незначащего 0 в 1 разряде
Case 2 : If N(3) <> 1 Then Reset Dig2 ‘гашение незначащего 0 в 2 разряде
Case 3 : Reset Dig3 ‘3 разряд
End Select

Waitms 2 ‘частота обновления индикатора

Return
‘——————————————————————————
Imp_0: ‘прерывание от детектора нуля

Timer0 = Wt ‘чем большее значение, тем быстрее переполнится таймер
Start Timer0

Return
‘——————————————————————————
Perepolnenie_0: ‘переполнение TIMER0

Stop Timer0
Set Opto ‘включение симистора
Waitus 100 ‘курим
Reset Opto ‘выключение симистора

Incr Count_debounce ‘антидребезг

Return
‘——————————————————————————
Digits: ‘цифры, выводимые на LED-индикатор

Data &B00000011 , &B10011111 , &B00100101 , &B00001101 , &B10011001 ‘0 1 2 3 4
Data &B01001001 , &B01000001 , &B00011111 , &B00000001 , &B00001001 ‘5 6 7 8 9
‘——————————————————————————