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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Главный вопрос.


Главный вопрос.

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

1

Чтобы Вы хотели увидеть на форуме, какие темы Вас интересуют, в каком направлении следует развивать форум?

0

2

Я думаю нужно работать на тему работа BASCOM'a, точнее как с помощью него связать несколько железок и т.д.

0

3

бонально:
Мне кажется над тему для новичка типа меня  которому в диалоге форума показалибы, точней намекнули куда  заглянуть (источник, тема, страница) на его все вопросы.
Да эт долго и нудно. - зато сократится число тупиков в нете, которые незнают с чего начать.
объяснить как создать исходник на бесике с самого начала.
вот.
просьба не кидать в мя помидорами.
ихмо я неплохой  кондидат для обучения.

вот что уже  есть, и незнаю чё дальше делать , GBA_faq1.DOC ещё недочитал.
'***********  ****algoritm***  **************
'3 этапа обработки сигнала:
'измерение частоты
'запись
'вывод на дисплей.
'***********  *****zada4a*****  **************
'измерение частоты 10-30 Hz,период измерения-2-4 секунды, индикация в формате-00,00Hz(четырехразрядный семисегментный индикатор).
' (!!!)в атмеге дисплей подключён к PD, а стробирование к PC.
'минимальное число компонентов;
'хочу еа AVR именно на бесике.
'***********  ******* 1 ******  **************
'Измерение частоты (вариант 1)
'Только порты с функцией входа таймера: T0, T1, T2, T3
'! Два таймера: один формирует базу времени (интервал счета периодов измеряемой частоты);
'второй – счетчик числа периодов. В прерывании первого запускается и останавливается второй таймер.
'В прерывании второго таймера считается число переполнений в программном счетчике.
'
'***********  ******* 2 ******  **************
'Светодиодный 7(14) - сегментный индикатор
'Любые – 8(16) линий данные, остальные для кодирования знакоместа (соответственно двоичного или позиционного)
'В прерывании с частотой 300 – 1000 Гц производится программой вывод данных в мультиплексном режиме из внутреннего буфера,
'в котором формируется код всех сегментов индикатора

$crystal = 4000000                                              'Добавил 6 февраля, уже лучше. только с кодирофкой шрифта проблема.
$regfile =
Config Pinb.0 = Input                                       '*âõîä ÷àñòîòîìåðà, ïîäà¸òñÿ ëîã ñèãíàë 1\0                                    '                                   '
Config Pina.3 = Output                                      'óïðàâëåíèå 4 ñåãìåíòîì
Config Pina.2 = Output                                      'óïðàâëåíèå 3 ñåãìåíòîì
Config Pina.1 = Output                                      'óïðàâëåíèå 2 ñåãìåíòîì
Config Pina.0 = Output                                      'óïðàâëåíèå 1 ñåãìåíòîì
Config Pinb.7 = Output                                      'A
Config Pinb.6 = Output                                      'G
Config Pinb.5 = Output                                      'F
Config Pinb.4 = Output                                      'E
Config Pinb.3 = Output                                      'D
Config Pinb.2 = Output                                      'C
Config Pinb.1 = Output                                      'B

Set Portb.0                                                 'ÏÐÎÁÀ
Waitms 5                                                    'ÐÀÁÎÎÒÀÅÒ!
Reset Portb.0                                               ' :).

Отредактировано Magnus (2007-02-06 22:09:23)

0

4

'---------------------------------------
'  БОЛВАНКА ДЛЯ ИЗМЕРЕНИЯ ЧАСТОТЫ
'---------------------------------------
Повторяю еще раз!
Определение частоты производится в режиме измерения периода входной частоты
Далее приведена нарезка программы (только измерительная часть - скелет) для решения этой задачи
'---------------------------------------
'Кусочек 0: Определить тип МК и необходимые переменные

$regfile = "m323def.dat"                'подходит и для чипов ATMega323 (ATMega8,ATMega16,ATMega32)
'---------------------
Dim R_cp As Byte                        'счетчика измерительных интервалов периода
Dim R_stp As Byte                       'статус программы при измерении периода
Dim C_msb As Byte                       'счетчик переполнений таймера 1
Dim R_tim As Word                       'счетчик времени исполнения процесса
Dim R_bd As Long                        'двоичный результат
Dim Ua As Single                        'временное значение
'---------------------

'1 Устанавливается прерывание по Int0 , например

'---------------------
Mcucr = &B10000010                      'IDLE - разрешить, INT0 - по спаду
'---------------------

'2

'---------------------
' назначение векторов прерывания.
On Int0 Int0_int Nosave                 'вектор внешнего прерывания 0
On Timer1 Timer1_int Nosave             'вектор прерывания от таймера 1
'---------------------

'3 Переход на главную программу

Goto Mesurement

'4 Сами программы прерывания. Написано на ассемблере для минимизации времени
'исполнения и обеспечения полного контроля за использованием ресурсов

'----------------------------------------------------------------------------------
' обработка внешнего прерывания 0 - используемого для измерения периода
'----------------------------------------------
Int0_int:
$asm
    Push R31                            'сохраним регистры
    In R31 , Sreg
    Push R31
    Push R30
'---------------------
    Lds R31 , {r_stp}                   'считаем статус измерения периода
    And R31 , R31                       'ЕСЛИ СТАТУС РАВЕН 0,
    Breq Int0_2                         'ЗНАЧИТ ЭТО ПЕРВЫЙ ВХОД В ПРЕРЫВАНИЕ
    Lds R31 , {r_cp}
    Dec R31                             'УМЕНЬШИМ СЧЕТЧИК ПЕРИОДОВ.
    Sts {r_cp} , R31
    Brne Int0_3                         'ЕСЛИ ОН НЕ ДОСТИГ НУЛЯ, НА ВЫХОД
'---------------------
'ОБРАБОТКА КОНЦА СЧЕТА ДЛИТЕЛЬНОСТИ ПЕРИОДА
    'R31 = 0
    Out Tccr1b , R31                    'ВЫКЛЮЧИМ СЧЕТЧИК
'---------------------
    Rcall Rd_tim1                       'считать значение, полученное в счетчике таймера 1
    Rcall Dis_timer1                    'запретить прерывание таймера 1
    Rcall Dis_int0                      'запретить внешнее прерывание 0
'---------------------
    Ldi R31 , &HFF
    Sts {ndat} , R31                    'ПОСТАВИТЬ БИТ "ЕСТЬ НОВЫЕ ДАННЫЕ"
    Rjmp Int0_3
'---------------------
'ОБРАБОТКА НАЧАЛА СЧЕТА ДЛИТЕЛЬНОСТИ ПЕРИОДА
Int0_2:
    Nop                                 'для выравнивания времени исполнения.
    Nop
    Nop
    Nop
    Nop
    Ldi R31 , &B00000011
    Out Tccr1b , R31                    'ВКЛЮЧИМ СЧЕТЧИК НА Fкв/64 (дискрет отсчета времени равен 64/Fкв)
    Sts {r_stp} , R31                   'в статус запишем любое не нулевое значение
Int0_3:
    Pop R30                             'восстановим регистры
    Pop R31
    Out Sreg , R31
    Pop R31
    Reti
$end Asm
Return
'----------------------------------------------
'обработка прерывания от таймера 1
Timer1_int:
$asm
    Push R31                            'сохраним регистры
    In R31 , Sreg
    Push R31
'---------------------
    Lds R31 , {c_msb}
    Inc R31
    Sts {c_msb} , R31                   'добавить единицу в счетчик старших разрядов
'---------------------
    Pop R31                             'восстановим регистры
    Out Sreg , R31
    Pop R31
    Reti
$end Asm
Return
'----------------------------------------------------------------------------------
'обработка прерывания от таймера 0 (8-битный таймер)
'используется как часы реального времени с частотой 0,0004883 кГц, период - 2.048 мс
'для этого нужно организовать схему деления 8 МГц/64/256
Timer0_int:
$asm
    Sei                                 'разрешить вложеные прерывания. это важно, когда производится измерение периода
    Push R31                            'сохраним регистры
    In R31 , Sreg
    Push R31
    Push R30
    Lds R30 , {r_tim}                   'обработка счетчика переменных временных интервалов
    Lds R31 , {r_tim + 1}
    Sbiw R30 , 0
    Breq T0_int21
    Sbiw R30 , 1
    Sts {r_tim} , R30
    Sts {r_tim + 1} , R31
    Pop R30
    Pop R31
    Out Sreg , R31
    Pop R31
    Reti
$end Asm
Return
'----------------------------------------------
'запретить прерывание таймера 1
Dis_timer1:
$asm
    Ldi R31 , &b00000001
    Out Timsk , R31                     'сбросить бит разрешения прерывания таймера 1.
    Ldi R31 , &b00000100
    Out Tifr , R31                      'после запрещения сбросить флаг прерывания таймера 1
$end Asm
Return
'-----------------------------
'запретить внешнее прерывание 1
Dis_int0:
$asm
    Ldi R31 , &b00000000                'сбросить бит разрешения внешнего прерывания.
    Out Gimsk , R31                     'по datasheet этот регистр называется Gicr
    Ldi R31 , &b01000000
    Out Gifr , R31                      'после запрещения сбросить флаг прерывания.
$end Asm
Return
'-----------------------------
'считать значение, полученное в счетчике таймера 1
Rd_tim1:
$asm
    In R30 , Tcnt1l                     'СЧИТАТЬ ДАННЫЕ
    In R31 , Tcnt1h                     'из таймера
    Sts {r_bd} , R30
    Sts {r_bd + 1} , R31
    Lds R30 , {c_msb}
'---------
    In R31 , Tifr                       'проверим бит переполнения таймера 1
    Sbrs R31 , 2                        'этой операцией мы учтем еще не обработанное переполнение таймера
    Rjmp Rdtim_1                        'если бит переполнения таймера 1 установлен,
    Inc R30                             'добавим единицу в счетчик старших разрядов
'---------
Rdtim_1:
    Sts {r_bd + 2} , R30
    Clr R31
    Sts {r_bd + 3} , R31
$end Asm
Return
'----------------------------------------------
'разрешить прерывание таймера 1
Enb_timer1:
$asm
    Ldi R31 , 0                         'очистить
    Out Tcnt1h , R31
    Out Tcnt1l , R31                    'таймер 1
    Sts {c_msb} , R31                   'и счетчик старших разрядов
    Ldi R31 , &b00000100
    Out Tifr , R31                      'перед разрешением сбросить флаг прерывания таймера 1
    Ldi R31 , &b00000101
    Out Timsk , R31                     'разрешить прерывание таймера 1 и таймера 0 (он должен считать реальное время)
$end Asm
Return
'-----------------------------
'разрешить внешнее прерывание 0
Enb_int0:
$asm
    Ldi R31 , &b01000000
    Out Gifr , R31                      'перед разрешением сбросить флаг прерывания.
    Out Gimsk , R31                     'разрешить внешнее прерывание
$end Asm
Return
'----------------------------------------------

'5 Программа измерения с главным циклом

Mesurement:
'установить систему в состояние измерения периода на пределе 2
    R_cp = 1                            'число измеряемых периодов - 1 или сколько нужно
Sys_p:
'надо бы установить!
'    R_tim = 500                         'разрешенное время измерения периода 1 с
    R_stp = 0                           'статус начала измерения периода
    Gosub Enb_timer1                    'очистить и разрешить таймер 1
Mcf:
    If Ndat <> 0 Then                   'есть данные частоты?
       Ndat = 0 : Goto Ndataf
    End If
'---------
    Idle
'здесь надо бы делать проверку времени измерения в режиме измерения периода!
'для этого нужно инициализировать еще один таймер и его прерывание
'иначе пропадание сигнала невозможно детектировать
'проверка времени измерения в режиме измерения периода
'    If R_tim <> 0 Then                  'если не прошло 0.5 с ожидания
'       Goto Mcf
'    End If
'    Gosub Dis_timer1                    'запретить прерывание таймера 1
'    Gosub Dis_int0                      'запретить внешнее прерывание 0
'                                        'индицировать состояние недогрузки
'    Goto Mesurement                     'начать новый цикл измерения
'
Goto Mcf
'-----------------------------
'обработка новых данных
Ndataf:
    Ua = R_bd                           'преобразум данные счетчика в плавающий формат
    Ua = 2000 / Ua                      'получим частоту в кГц

'использовать результат - индицироватьили выводить

    Goto Beginf                         'и начать новый цикл измерения
'------------------------------------------------------------

0

5

сложновато, и нето, мне над для НЧ.
я перешёл на другой язык програмирования,знакомый обучает.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Главный вопрос.