PIC Opg 2 Løsning

Fra HTX Arduino
Spring til navigation Spring til søgning

Denne side gennemgår løsningen for PIC Opgave 2 - Gates

Løsningsforslag for Gates.

Generelt er alle løsningerne lavet med den sædvanlig opstartskode til en PIC16F684, og selve funktionen realiseret i et forever loop.

Opstartskoden kan ses generelt gennemgået i

Generelt så sættes der indgange og udgange op til de forskellige gates som vist her:

pin_A3_direction =  input
pin_A4_direction =  input
alias   InA is pin_A3
alias   InB is pin_A4
alias   AND_out is pin_A0

De to indgange InA og InB genbruges til alle gates, mens der laves specielle udgange for hver gate.

Koden som jal-filer

Alle eksemplerne kan hentes i denne ZIP-fil.

Forskellige løsninger på AND-gate

Opgaven kan løses på mange måder, så i første omgang skitseres en løsning af en AND gate på 3 forskellige måder i koden

AND gate som kombination if-sætninger

Hele koden inde i forever-loopet ser ud som følgende:

35  -- Denne løsning bygger på kombination if-sætninger
36  if InA then
37     if InB then
38        AND_out = high
39     else
40        AND_out = low
41     end if
42  else
43     AND_out = low
44  end if

Linje 36 tester den ene indgang og linje 37 tester den anden indgang. Hvis begge indgange er sat, så skal AND gaten gå høj, som linje 38 sørger for.

Hvis InB ikke er høj, så vil linje 39-41 sørge for at udgangen sættes til lav (det skal gøres aktivt, ellers vil udgangen forblive høj, så længe den ikke sættes lav).

Hvis InA ikke er høj, så vil linje 42-44 sørge for at udgangen sættes til lav.

Koden ligger som opg2-and1.jal i denne ZIP-fil.

AND gate som logisk kombination inde i if-udtrykket

Man kan opstille mere komplekse udtryk i IF-betingelsen, så man faktisk AND'er de to indgange sammen, og laver IF-betingelsen på det.

Hele koden inde i forever-loopet ser ud som følgende:

35  -- Denne løsning bygger på logisk kombination inde i if-udtrykket
36  if InA & InB then
37     AND_out = high
38  else
39     AND_out = low
40  end if

Linje 36 er denne AND-kombination af InA og InB, og linje 37 sætter udgangen høj, hvis det er sandt, og linje 38-40 sørger for at sætte lavt, hvis det ikke er sandt.

Koden ligger som opg2-and2.jal i denne ZIP-fil.

AND gate som logiske bits

I JAL kan man regne med bits som et udtryk, og sætte et bit-resultat direkte på udgangen. Det gør at hele gaten kan realiseres med en linje kode.

Hele koden inde i forever-loopet ser ud som følgende:

35  -- Denne løsning bygger på at man kan arbejde logisk med bits
36  AND_out = InA & InB

Linje 36 er den linje hvor InA og InB bliver AND'et sammen, og resultatet lægges ud på AND_out

Koden ligger som opg2-and3.jal i denne ZIP-fil.

Forskellige løsninger på OR-gate

Opgaven kan løses på mange måder, men lige som ved AND gaten er OR gaten her løst på 3 forskellige måder i koden.

OR gate som kombination if-sætninger

Hele koden inde i forever-loopet ser ud som følgende:

36  -- Denne løsning bygger på kombination if-sætninger
37  if InA then
38     OR_out = high
39  else
40     if InB then
41        OR_out = high
42     else
43        OR_out = low
44     end if
45  end if

Koden ligger som opg2-or1.jal i denne ZIP-fil.

OR gate som logisk kombination inde i if-udtrykket

Man kan opstille mere komplekse udtryk i IF-betingelsen, så man faktisk OR'er de to indgange sammen, og laver IF-betingelsen på det.

Hele koden inde i forever-loopet ser ud som følgende:

36  -- Denne løsning bygger på logisk kombination inde i if-udtrykket
37  if InA | InB then
38     OR_out = high
39  else
40     OR_out = low
41  end if

Koden ligger som opg2-or2.jal i denne ZIP-fil.

OR gate som logiske bits

I JAL kan man regne med bits som et udtryk, og sætte et bit-resultat direkte på udgangen. Det gør at hele gaten kan realiseres med en linje kode.

Hele koden inde i forever-loopet ser ud som følgende:

36  -- Denne løsning bygger på at man kan arbejde logisk med bits
37  OR_out = InA | InB

Koden ligger som opg2-or3.jal i denne ZIP-fil.

Alle gates løst i samme program

Ved at udvide den første løsning med AND-gates så kan man med 3 if-else sætninger få løst alle gates, ved at man placerer udgangene de korrekte steder, som det kan ses i følgende kode for forever-loopet:

   if InA then
      INV_out = low      -- inverter
      OR_out = high     -- OR
      NOR_out = low      -- NOR
      if InB then
         AND_out = high  -- AND
         NAND_out = low   -- NAND
         XOR_out = low   -- XOR
         XNOR_out = high  -- XNOR
      else
         AND_out = low   -- AND
         NAND_out = high  -- NAND
         XOR_out = high  -- XOR
         XNOR_out = low   -- XNOR
      end if
   else
      INV_out = high -- inverter
      AND_out = low  -- AND
      NAND_out = high -- NAND
      if InB then
         OR_out = high  -- OR
         NOR_out = low   -- NOR
         XOR_out = high  -- XOR
         XNOR_out = low   -- XNOR
      else
         OR_out = low   -- OR
         NOR_out = high  -- NOR
         XOR_out = low   -- XOR
         XNOR_out = high  -- XNOR
      end if
   end if

Koden ligger som PIC-gate.jal i denne ZIP-fil.

Den næste løsning gennemgået med AND gates giver ikke den samme besparelse på IF-sætningerne - der skal stadig en sætning til AND og NAND som det kan ses i følgende kode for forever-loopet:

   if InA then
      INV_out = low      -- inverter
   else
      INV_out = high     -- inverter
   end if

   if InA & InB then
      AND_out = high     -- AND
      NAND_out = low     -- NAND
   else
      AND_out = low      -- AND
      NAND_out = high    -- NAND
   end if

   if InA | InB then
      OR_out = high      -- OR
      NOR_out = low      -- NOR
   else
      OR_out = low       -- OR
      NOR_out = high     -- NOR
   end if

   if InA ^ InB then
      XOR_out = high     -- XOR
      XNOR_out = low     -- XNOR
   else
      XOR_out = low      -- XOR
      XNOR_out = high    -- XNOR
   end if

Koden ligger som PIC-gate3.jal i denne ZIP-fil.

Den sidste løsning med bit-beregning kan ses i følgende kode for forever-loopet:

   INV_out  = ! InA         -- inverter
   AND_out  = InA & InB     -- AND
   OR_out   = InA | InB     -- OR
   NAND_out = ! AND_out     -- NAND
   NOR_out  = ! OR_out      -- NOR
   XOR_out  = InA ^ InB     -- XOR
   XNOR_out = ! XOR_out     -- XNOR

Koden ligger som PIC-gate2.jal i denne ZIP-fil.

Udvidelse af opgaven til 3 indgange

Ved at udvide den første løsning med AND-gates så kan man få 3 indgange på, som det kan ses i følgende kode for forever-loopet:

  if InA then
     if InB then
        if InC then
           AND_out = high
        else
           AND_out = low
        end if
     else
        AND_out = low
     end if
  else
     AND_out = low
  end if

Koden ligger som opg2-3and1.jal i denne ZIP-fil.

Den næste løsning gennemgået med AND gates giver en noget enklere løsning, da der blot skal AND'es en ekstra indgang på i IF-betingelsen som det kan ses i følgende kode for forever-loopet:

  if InA & InB & InC then
     AND_out = high
  else
     AND_out = low
  end if

Koden ligger som opg2-3and2.jal i denne ZIP-fil.

Den sidste løsning med bit-beregning giver blot en minimal udvidelse som det kan ses i følgende kode for forever-loopet:

  AND_out = InA & InB &InC

Koden ligger som opg2-3and3.jal i denne ZIP-fil.

PIC
PIC-Typer PIC16F84 - PIC12F675 - PIC16F628 - PIC16F684 - PIC16F690 - PIC16F877 - PIC18F2550
Programmeringsbegreber Maskinkode - Mikrocontroller
Programmeringsmiljø PIC-brænder - UsbPicProg - Analog indgang - ICSP


Digitale Opgaver
Kombinatorisk Logik Opgave 1a - Opgave 1b - Opgave 2 - Opgave 3 - Opgave 4 - Opgave 5 - Opgave 6 - Opgave 7 - Opgave 8 - Opgave 9 - Opgave 10
Sekvensiel Logik Opgave 11 - Opgave 12 - Opgave 13 - Opgave 14
Analoge Opgaver
Modstande og Ohms lov Modstands Opgave 1 - Modstands Opgave 2 - Modstands Opgave 3 - Modstands Opgave 4 - Modstands Opgave 5 - Modstands Opgave 6 - Modstands Opgave 7 - Modstands Opgave 8 - Modstands Opgave 9 - Modstands Opgave 10
Kondensator og Spole Kondensator opgaver 1 - Kondensator DC opgave 1 - Kondensator AC opgave 1 - Spolen 1 - Seriekobling og parallelkobling - Spolen 2 - Beregning af spoleværdier (selvinduktionen) - Spolen 3 - Tidskonstant for RL-led - Spolen 4 - Beregning af induktiv-reaktansen
Operationsforstærker Opamp Opgave 1 - Opamp Opgave 2 - Opamp Opgave 3
Diverse Opgaver Opgaver Diagram - Opgaver Transformator - Transistor opgave - Zenerdiode Opgave 1
Programmerings Opgaver
Arduino Arduino Blink - Arduino Opgave 01 - Blink - Arduino Button - Analog Out - Arduino StateChangeDetection - Arduino termometer - Arduino termostat - Arduino udgangsforstærkning
PIC PIC Opgave 1 - Blink - PIC Opgave 2 - Gates - PIC Opgave 3 - Udvidet blink - PIC Opgave 4 - Kombinatorik - PIC Opgave 5 - Flip-flops - PIC Opgave 6 - Løbelys - PIC Opgave 6a - kontakt - PIC Opgave 7 - Udvidet løbelys - PIC Opgave 8 - Sekventielle kredsløb - PIC Opgave 9 - Multivibratorer - PIC Opgave 10 - Samtidighed - PIC Opgave 11 - Tastatur - PIC Opgave 12 - Display - PIC Opgave 13 - A-D converter - PIC Opgave 14 - Interrupt - PIC Opgave 15 - Seriel komm - PIC Opgave 16 - Lyskryds - PIC Opgave 17 - Tyverialarm
PIC Opgave Løsninger PIC Opg 1 Løsning - PIC Opg 2 Løsning - PIC Opg 3 Løsning - PIC Opg 4 Løsning - PIC Opg 5 Løsning