доцент2 |
Дата: Вс, 17.01.2016, 17:06 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
Хочу собрать игрушку для домашнего кота. Задумка следующая: 1. после включения игрушка помигает светиками, по вибрирует и издаст звук. Все это для привлечения кота. Затем уйдет в сон (для экономии батареи, в случае если кот не отреагирует) на заданное время с последующим повтором света, вибрации и звука. 2. Если кот заинтересуется игрушкой и начнет ее пинать, то сработает датчик вибрации. Этот датчик выводит игрушку из спящего режима по внешнему прерыванию INT. 3. Кот у меня еще тот гурман на игрушки (с простыми бантиками он не играет. Ему подавай что-то мудреное). Поэтому при выходе из сна хочу использовать команду Random для выбора одной из десяти комбинаций из светиков, вибрации и звука. Но проблема возникла на пустом месте. В железе при выходе из сна по внешнему прерыванию Random генерирует одно и то же значение. Значение Random при INT меняется только после того как игрушка выходит из сна после заданного времени и уходит в сон. '----------------------- --------------------- Declare SHOW_SYSTEM_VARIABLES = OFF ' ïåðåìåííûå Declare FSR_CONTEXT_SAVE = OFF ' Declare Reminders = OFF ' Declare Warnings = OFF ' 'Declare Optimiser_Level 0 ' Declare Watchdog = On Device = 12F675 ' Xtal = 4 '
'----------------- конфигурация --------------- Config CPD_OFF, CP_OFF, BODEN_OFF, MCLRE_OFF, PWRTE_OFF, INTRC_OSC_NOCLKOUT', WDT_OFF All_Digital = On ' цифровые входы выходы '--------------------- переменные ------------------ Dim i As Byte Dim a As Word Dim b As Byte Dim c As Byte Dim Flag As Byte Symbol INTE = INTCON.4 ' разрешение внешнего прерывания INT Symbol INTF = INTCON.1 ' влаг внешнего прерыванияÿ INT '-------------------------- ADCON0 ------------------------------------------- OPTION_REG =%01001111' ïðåðûâàíèå INT ïî ïåðåäíåìó ôðîíòó bit6, ïðåääåëèòåëü ïåðåä WDT bit3 1:128 bit0-2 INTCON = %10010000 ' ADCON0 = %00000000 'отключаем АЦП TRISIO = %00000100 'порты на выход GPIO = %00000000 ' Seed $0345 On_Interrupt GoTo PRER DelayMS 500 '----------------------- основная программа --------------------- MainProgram: Flag=0 If Flag=0 Then ' SVET: For i=0 To 5 GPIO.0=1: GPIO.1 =0 DelayMS 50 GPIO.0=0: GPIO.1 =1 DelayMS 50 Next GPIO=0 INTE=0 'выключает перывание INT, чтобы не было срабатывание при звуке и вибрации 'MOTOR: For i=0 To 1 GPIO.5=1 DelayMS 50 GPIO.5=0 DelayMS 50 Next ' ZVUK: If c>5 Then Sound GPIO.4, [40,2,0,2,80,2,0,2,100,2] INTE=1 'включаем прерывание INT Else EndIf Sleep 15 GoTo MainProgram '
'--------------------------обработка прерывания по INT -------------------------- PRER: Context Save DelayMS 100 a=Random b = Dig a, 0 c = Dig a, 1 Select b Case 0 ' Case 1 ' Case 2 '
Case 3 'свет, звук, вибрация
Case 4 'звук, свет, вибрация
Case 5 'свет
Case 6 'звук Sound GPIO.4, [70,2,0,5,80,2,0,5,90,2,0,5,100,2,0,5,110,2,0,5,120,2] Case 7 'звук Sound GPIO.4, [126,2,0,10,126,2,0,10,90,2,0,10,90,2,0,10,126,2] Case 8 'вибрация
Case 9 ' EndSelect Flag=1 INTF = 0 ' флаг INT Context Restore 'Добавлено (17.01.2016, 17:06) --------------------------------------------- Решил данную проблемку настройкой генератора Random непосредственно при обработке прерывания. Причем настройка по команде Seed идет с помощью переменной используемой для хрнения результата Random. PRER: Context Save DelayMS 100 Seed a a=Random b = Dig a, 0 c = Dig a, 1 Select b Case 0 ' Case 1 '
Case 9 ' EndSelect Flag=1 INTF = 0 ' флаг INT Context Restore '
|
|
|
|