201305081946


По CLEDам лабораторных работ часть II.

  Работа 01.  Коридорный выключатель. Звездообразный коридор оборудован восьмью переключателями в виде кнопок с фиксацией. Требуется иметь возможность при нажатии на любую из кнопок (нажатие на замкнутый переключатель приведет к его размыканию) зажечь свет в темном коридоре, либо выключить в освещенном.
           
           
             S0    S1    S2
             \ \  | |  / /
              \ \ | | / /
               \ \| |/ /
          S7 ---   L   --- 
             ---  0..7 --- s3
               / /| |\ \
              / / | | \ \
             / /  | |  \ \
            S6    S5    S4
            
Решение: изменение байта состояния переключателей должно перебрасывать состояние выхода (лампа) на противоположное.

Сименс Лого Комфорт (версия 7)
                                           -------------------------
                                          |                         |
            ==========                    | +-----+   выходы   +-+  |
           I          I +-----+   +-----+  -+ DD  +---[O1..9]--+ o--
  входы    I  +-----+  =+ 8XOR|   | OR8 |   |     |            +-+
  [I1..7]==+==+ 8DD |   |     +===+     +---+     o
  ген.        |     +===+     |   |     |   +-----+
  [0.01s]-----+     |   +-----+   +-----+
              +-----+

----------

Версия для AQA. На двух концах коридора стоят переключатели (switches: S0, S1). Освещение иммитируется светодиодом L0 (LEDS). Дополнительно: Подсоединить светодиоды L7, .. ,L1.

       o-------+-(x)-+  Коридорный выключатель (N = 2).
  s0  /        |     |
     o    o    |     |
     |    |    |     |
     |    |    |     |
     o    o    |     |
  s1     /     |     |
        o      +-(x)-+
        |            |
        o--o ~220 o--+

  ; Подсоединить SWITCHES к порту А.
  ; Подсоединить LEDS к порту B.

         jmp setup
         
      a: db 0x00
      b: db 0x00
      s: db 0x00
      x: db 0x00
      
  setup: movw  0xff
         movwr TRISA
         movwr PORTA
         movw  0x00
         movwr TRISB
         movwr PORTB
  loop:
         movrw PORTA
         andw  0x01
         movwr a
         movrw PORTA
         andw  0x02
         movwr b
         call  xors0s1
         movrw s
         movwr PORTB
         jmp   loop
  
  ; s0 XOR s1. Прошита таблица истинности. 
  ; Тривиально конвертируется в AND, NAND, OR, NOR, EQ, 
  ; импликацию.
  
  xors0s1: 
         movrw a
         andw  0x01
         jpz   s0was0
  s0was1:
         movrw b
         jpz   s0w1s1w0
  s0w1s1w1:
         movw  0x00
         movwr s
         ret
  s0w1s1w0:
         movw  0x01
         movwr s
         ret
  s0was0:
         movrw b
         jpz   s0w0s1w0
  s0w0s1w1:
         movw  0x01
         movwr s
         ret
  s0w0s1w0:
         movw  0x00
         movwr s
         ret


Версия коридорный переключатель на языке Basic (picsimulatoride)

Крестоообразный коридор оборудован четыремя переключателями в виде кнопок с фиксацией. Требуется иметь возможность при нажатии на любую из кнопок (нажатие на замкнутый переключатель приведет к его размыканию) зажечь свет в темном коридоре, либо выключить в освещенном.

           s0          ' KeyPad Matrix: (out) PORTB.0 = 1
          | |          ' switches (in) s3 PORTB.3, .. s0 PORTB.0 
          | |          ' 8xLEDS on PORTA
                       ' Chip P16F877A
         /   \         
  s3 ---  L0   ---            Dim oldb As Byte  
     ---  ..5  --- s1         Dim newb As Byte
         \   /                Dim lamp As Byte
                       setup:
          | |                 TRISB = 0xf0
          | |                 PORTB = 0x01
          s2                  TRISA = 0x0
                              PORTA = 0x0
                              oldb = 0
                              lamp = 0
                       loop:
                              newb = PORTB
                              If oldb <> newb Then
                                PORTA = lamp And 0x1f
                                lamp = Not lamp
                              Endif
                              oldb = newb
                              Goto loop
                              End                                

Можно почувствовать большое отличие данной версии PICBASIC от более распространенных диалектов бейсика.

----------

Версия коридорный переключатель на языке С. (picsimulatoride, периферия и чип, как в задаче на бейсике, MikroC v.6)

  void main() {
    char oldb = 0;
    TRISB = 0xf0; PORTB = 1;
    TRISA = PORTA = 0;
    while (1) {
      PORTA = oldb != PORTB ? PORTA & 0x1f : ~PORTA;
      oldb = PORTB;
    }
  }


  

