Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: demanik, ivan_fd  
использование Random
доцент2 Дата: Вс, 17.01.2016, 17:06  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 291
Репутация: 10   ±
Замечания:   ±
На сайте с 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  '

ЯНДЕКС Дата: 17.01.2016
  • Страница 1 из 1
  • 1
Поиск: