Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Для VasilyS. Вот пример динь-динь. Весь ситнетический. Cotton 0%. (+)

Отправлено Quasy 14 мая 2008 г. 14:46



// В первом приближении похоже, но я не Шульберт.
// Мега128 попалась.
// Кварц 11059 попался.
// Выдается парафазно на выводы D6/D7.
// Можно поиграться с частотвми, чтоб похожей было на bell.

////////////////////////// СИ ФАЙЛ
#include <iom128.h>
#define QUA 11059000UL
#define WaitMs(q_mS) __delay_cycles((unsigned long)((((float)QUA)* \
((float)q_mS))/1000.00)+0.5 )
extern void DIN_DON_ASM( void );
void main( void )
{
DDRD |= 0xc0;
PORTD = 0x40;

XDIV = ( 121 | 0x80 );
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();

for(;;)
{
DIN_DON_ASM();
WaitMs(150); // XDIV менялся значит число мс врет!!!
}
}//main
//////////////////////////

////////////////////////// АСМ-ФАЙЛ
#include <iom128.h>
;---------------------------------------------------------
;--- Ассемблерная подпрограмма, выдающая "динь-дон".
;---------------------------------------------------------
NAME DIN_DON
;---------------------------------------------------------
#define CONST_DLIT_PAU1 (50)
#define CONST_DLIT_PAU2 (70)
#define CONST_DELAY_PAU1 (114)
#define CONST_DELAY_PAU2 (168)
;---
#define WORK R16
#define REG_DUTY R17
#define REG_DLIT R18
#define REG_DECREM R19
#define REG_ZERO R20
#define CTRL_TIMER TCCR2
#define COUNT_TIMER TCNT2
#define USED_PORT PORTD
#define USED_DDR DDRD
#define USED_PIN1 6
#define USED_PIN2 7
#define REG_FLAG TIFR
#define MASK_FLAG 0x40

#define OUT_L1_LEVEL CBI USED_PORT,USED_PIN1
#define OUT_L2_LEVEL CBI USED_PORT,USED_PIN2
#define OUT_H1_LEVEL SBI USED_PORT,USED_PIN1
#define OUT_H2_LEVEL SBI USED_PORT,USED_PIN2
#define INIT_DDR_PIN1 SBI USED_DDR,USED_PIN1
#define INIT_PORT_PIN1 CBI USED_PORT,USED_PIN1
#define INIT_DDR_PIN2 SBI USED_DDR,USED_PIN2
#define INIT_PORT_PIN2 CBI USED_PORT,USED_PIN2
;---------------------------------------------------------
PUBLIC DIN_DON_ASM
;---------------------------------------------------------
RSEG CODE
;---------------------------------------------------------
DIN_DON_ASM:
;---------------------------------------------------------
PUSH WORK
PUSH REG_DUTY
PUSH REG_DLIT
PUSH REG_DECREM
PUSH REG_ZERO
INIT_DDR_PIN1
INIT_PORT_PIN1
INIT_DDR_PIN2
INIT_PORT_PIN2
;--- stop Timer
CLR REG_ZERO
OUT CTRL_TIMER,REG_ZERO
;--- Загрузка значения длительности в регистр
FIRST_TON:
LDI REG_DLIT, CONST_DLIT_PAU1
LOOP_T1:
;--- Инициализация декрементируемого регистра длительности
MOV REG_DECREM, REG_DLIT
; NOP
INTO1: OUT CTRL_TIMER, REG_ZERO ; stop TC2
;--- Пауза...
LDI WORK, CONST_DELAY_PAU1 ; load const delay1
AV_00: DEC WORK
BRNE AV_00
;--- Инициализация длительности таймера
MOV REG_DUTY,REG_DLIT
COM REG_DUTY
OUT COUNT_TIMER, REG_DLIT
;--- Сброс флага таймера
LDI WORK,MASK_FLAG
OUT REG_FLAG,WORK
;--- Запуск таймера
LDI WORK,0x01
OUT CTRL_TIMER,WORK ; START
;--- Ожидание окончания периода 1 таймера
AV_01: IN WORK, REG_FLAG
ANDI WORK, MASK_FLAG
BREQ AV_01
OUT COUNT_TIMER, REG_DUTY
;--- Сброс флага таймера
LDI WORK,MASK_FLAG
OUT REG_FLAG,WORK
MOV WORK,REG_DLIT
ANDI WORK,0x04
BREQ AV_08
LDI WORK,0x03
AV_03: DEC WORK
BRNE AV_03
;--- Вывод уровня на динамик
AV_08:
OUT_L1_LEVEL
OUT_H2_LEVEL
AV_04: IN WORK, REG_FLAG
ANDI WORK, MASK_FLAG
BREQ AV_04
OUT COUNT_TIMER, REG_DUTY
;--- Сброс флага таймера
LDI WORK,MASK_FLAG
OUT REG_FLAG,WORK
;--- Вывод уровня на динамик
OUT_H1_LEVEL
OUT_L2_LEVEL
DEC REG_DECREM
BRNE INTO1
CPI REG_DLIT,15
BRNE AV_77
LDI REG_DLIT,0x01
AV_77: DEC REG_DLIT
BRNE LOOP_T1
;--- Пауза между тонами
LDI REG_DLIT,250
AV_999: LDI WORK,50
AV_998: DEC WORK
BRNE AV_998
DEC REG_DLIT
BRNE AV_999
;-------------------
;--- Второй тон
SECOND_TON:
;--- Инициализация декрементируемого регистра длительности
LDI REG_DLIT,CONST_DLIT_PAU2
LOOP_T2:
MOV REG_DECREM,REG_DLIT
; NOP
INTO2: OUT CTRL_TIMER,REG_ZERO ; STOP
;--- stop Timer
LDI WORK,CONST_DELAY_PAU2
AV_10: DEC WORK
BRNE AV_10
;--- Инициализация длительности таймера
MOV REG_DUTY,REG_DLIT
COM REG_DUTY
OUT COUNT_TIMER,REG_DLIT
;--- Сброс флага таймера
LDI WORK,MASK_FLAG
OUT REG_FLAG,WORK
;--- Запуск таймера
LDI WORK,0x01; 1
OUT CTRL_TIMER,WORK
AV_11: IN WORK, REG_FLAG
ANDI WORK, MASK_FLAG
BREQ AV_11
OUT COUNT_TIMER,REG_DUTY
;--- Сброс флага таймера
LDI WORK,MASK_FLAG
OUT REG_FLAG,WORK
MOV WORK,REG_DLIT
ANDI WORK,0x04
BREQ AV_09
;--- Пауза
LDI WORK,0x03
AV_23: DEC WORK
BRNE AV_23
;--- Вывод уровня на динамик
AV_09:
OUT_L1_LEVEL
OUT_H2_LEVEL
AV_14: IN WORK, REG_FLAG
ANDI WORK, MASK_FLAG
BREQ AV_14
OUT COUNT_TIMER,REG_DUTY
;--- Сброс флага таймера
LDI WORK,MASK_FLAG
OUT REG_FLAG,WORK
;--- Вывод уровня на динамик
OUT_H1_LEVEL
OUT_L2_LEVEL
DEC REG_DECREM
BRNE INTO2
CPI REG_DLIT,15
BRNE AV_78
LDI REG_DLIT,0x01
AV_78: DEC REG_DLIT
BRNE LOOP_T2
OUT CTRL_TIMER, REG_ZERO ; stop TC2
OUT_L1_LEVEL
OUT_L2_LEVEL
POP REG_ZERO
POP REG_DECREM
POP REG_DLIT
POP REG_DUTY
POP WORK
RET
///////////////////////


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 123:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru