augadi@mail.ru



Ответы в темах

Просмотр 1 сообщения - с 1 по 1 (всего 1)
  • Автор
    Сообщения
  • в ответ на: Программирование МК 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
    ‘——————————————————————————

  • Автор
    Сообщения
  • в ответ на: Программирование МК 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
    ‘——————————————————————————

Просмотр 1 сообщения - с 1 по 1 (всего 1)