<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="da">
	<id>https://www.htxarduino.dk/index.php?action=history&amp;feed=atom&amp;title=PIC_Opg_4_L%C3%B8sning</id>
	<title>PIC Opg 4 Løsning - Versionshistorie</title>
	<link rel="self" type="application/atom+xml" href="https://www.htxarduino.dk/index.php?action=history&amp;feed=atom&amp;title=PIC_Opg_4_L%C3%B8sning"/>
	<link rel="alternate" type="text/html" href="https://www.htxarduino.dk/index.php?title=PIC_Opg_4_L%C3%B8sning&amp;action=history"/>
	<updated>2026-08-25T06:49:38Z</updated>
	<subtitle>Versionshistorie for denne side i HTX Arduino</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://www.htxarduino.dk/index.php?title=PIC_Opg_4_L%C3%B8sning&amp;diff=4873&amp;oldid=prev</id>
		<title>Bar: /* Løsning med reducering ved skift af bit */</title>
		<link rel="alternate" type="text/html" href="https://www.htxarduino.dk/index.php?title=PIC_Opg_4_L%C3%B8sning&amp;diff=4873&amp;oldid=prev"/>
		<updated>2022-11-15T09:44:09Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Løsning med reducering ved skift af bit&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;da&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Ældre version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Versionen fra 15. nov. 2022, 11:44&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l346&quot;&gt;Linje 346:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linje 346:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  31   portc = 0b0000_0001 &amp;lt;&amp;lt; (porta &amp;amp; 0b0000_0111)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  31   portc = 0b0000_0001 &amp;lt;&amp;lt; (porta &amp;amp; 0b0000_0111)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Det sjove er at denne løsning ikke sparer hverken hukommelse eller data-areal, selvom man skulle tro det. Grunden er at den mere komplicerede beregning kræver at den opretter midlertidig hukommelse, og at det kodemæssigt ikke gør nogen forskel, når der alligevel skal bruges midlertidig hukommelse. Denne løsning er ikke med i ZIP-filen.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Det sjove er at denne løsning ikke sparer hverken hukommelse eller data-areal, selvom man skulle tro det. Grunden er at den mere komplicerede beregning kræver at den opretter midlertidig hukommelse, og at det kodemæssigt ikke gør nogen forskel, når der alligevel skal bruges midlertidig hukommelse. Denne løsning er ikke med i ZIP-filen.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{PIC}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{Opgaver}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Kategori:PIC_Opgave_Løsninger]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Kategori:PIC_Opgave_Løsninger]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Bar</name></author>
	</entry>
	<entry>
		<id>https://www.htxarduino.dk/index.php?title=PIC_Opg_4_L%C3%B8sning&amp;diff=4772&amp;oldid=prev</id>
		<title>Bar: 1 version importeret</title>
		<link rel="alternate" type="text/html" href="https://www.htxarduino.dk/index.php?title=PIC_Opg_4_L%C3%B8sning&amp;diff=4772&amp;oldid=prev"/>
		<updated>2022-11-15T07:09:08Z</updated>

		<summary type="html">&lt;p&gt;1 version importeret&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;da&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Ældre version&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Versionen fra 15. nov. 2022, 09:09&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;da&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(Ingen forskel)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Bar</name></author>
	</entry>
	<entry>
		<id>https://www.htxarduino.dk/index.php?title=PIC_Opg_4_L%C3%B8sning&amp;diff=4771&amp;oldid=prev</id>
		<title>_htx&gt;Bar: Oprettede siden med &#039;Denne side gennemgår løsningen for PIC Opgave 4 - Kombinatorik  ==Løsningsforslag for Kombinatoriske opgaver.==  Generelt er alle løsningerne lavet med den sædvanli...&#039;</title>
		<link rel="alternate" type="text/html" href="https://www.htxarduino.dk/index.php?title=PIC_Opg_4_L%C3%B8sning&amp;diff=4771&amp;oldid=prev"/>
		<updated>2013-08-20T10:31:15Z</updated>

		<summary type="html">&lt;p&gt;Oprettede siden med &amp;#039;Denne side gennemgår løsningen for &lt;a href=&quot;/index.php/PIC_Opgave_4_-_Kombinatorik&quot; title=&quot;PIC Opgave 4 - Kombinatorik&quot;&gt;PIC Opgave 4 - Kombinatorik&lt;/a&gt;  ==Løsningsforslag for Kombinatoriske opgaver.==  Generelt er alle løsningerne lavet med den sædvanli...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Ny side&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Denne side gennemgår løsningen for [[PIC Opgave 4 - Kombinatorik]]&lt;br /&gt;
&lt;br /&gt;
==Løsningsforslag for Kombinatoriske opgaver.==&lt;br /&gt;
&lt;br /&gt;
Generelt er alle løsningerne lavet med den sædvanlig opstartskode til en [[PIC16F684]], og selve funktionen realiseret i et forever loop.&lt;br /&gt;
&lt;br /&gt;
Opstartskoden kan ses generelt gennemgået i [[Kategori:PIC_Opgave_Løsninger|PIC Opgave Løsninger]]&lt;br /&gt;
&lt;br /&gt;
===Koden som jal-filer===&lt;br /&gt;
&lt;br /&gt;
Alle eksemplerne kan hentes [[Media:PIC-opg-4.zip|i denne ZIP-fil]].&lt;br /&gt;
&lt;br /&gt;
==Den binære Adder==&lt;br /&gt;
Addition af tal sker mange steder, men specielt inde i en mikroprocessor.&lt;br /&gt;
&lt;br /&gt;
Denne opgave præsenterer princippet i det.&lt;br /&gt;
&lt;br /&gt;
==Den 1 bits binære full-adder==&lt;br /&gt;
Til den simple adder anvendes to bit-indgange (de to bits der skal adderes) og en udgang med resultatet og en udgang med carry. Til en full adderskal der også en carry-indgang til.&lt;br /&gt;
&lt;br /&gt;
Indgange og udgange til programmet defineres som følger:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
porta_direction = all_input&lt;br /&gt;
alias bit0 is pin_a0         -- De 2 bit der skal adderes&lt;br /&gt;
alias bit1 is pin_a1&lt;br /&gt;
alias carry_in  is pin_a2    -- Carry ind fra inputtet&lt;br /&gt;
&lt;br /&gt;
portc_direction = all_output&lt;br /&gt;
alias res0 is pin_c0         -- Resultatet på den bit der kommer ud&lt;br /&gt;
alias carry_out is pin_c3    -- Carry ud på resultatet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I programmet udregnes resultatet af half-adderen som et mellemresultat. Dette resultat placeres i en bit, der defineres som følger:&lt;br /&gt;
 var bit res_ha    -- mellemresultat, der er half adder-sum&lt;br /&gt;
&lt;br /&gt;
Hele koden inde i forever-loopet ser ud som følgende:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
37   res_ha = bit0 ^ bit1    -- Først regnes en half-adder&lt;br /&gt;
38   carry_out = (bit0 &amp;amp; bit1) | (res_ha &amp;amp; carry_in)   -- så beregnes carry_out&lt;br /&gt;
39   res0 = res_ha ^ carry_in    -- og derefter selve resultatet på full-adderen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Linje 37 beregner summen af de to indgangsbit, og gemmer det i den interne variabel.&lt;br /&gt;
&lt;br /&gt;
Linje 38 beregner carry out ud fra begge indgangsbit, mellemresultatet og den carry der kommer ind - resultatet placeres direkte på udgangen.&lt;br /&gt;
&lt;br /&gt;
Linje 38 beregner summen af både de to indgangsbit og carry in - igen lægges det direkte ud på resultat-udgangen.&lt;br /&gt;
&lt;br /&gt;
Koden ligger som opg-4a-full-add.jal [[Media:PIC-opg-4.zip|i denne ZIP-fil]].&lt;br /&gt;
&lt;br /&gt;
===2x3 bits full adder===&lt;br /&gt;
Ideen med full-adders er at de kan lægge større tal sammen, og for at illustrere det, så er der her realiseret en full-adder der tager en carry id og 2 stk. 3 bits tal ind, og lægger dem sammen til et 3 bits tal samt en carry ud.&lt;br /&gt;
&lt;br /&gt;
Indgange og udgange til programmet defineres som følger:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
porta_direction = all_input&lt;br /&gt;
alias tal1_bit0 is pin_a0    -- De 3 bit der bliver til tal1&lt;br /&gt;
alias tal1_bit1 is pin_a1&lt;br /&gt;
alias tal1_bit2 is pin_a2&lt;br /&gt;
&lt;br /&gt;
alias tal2_bit0 is pin_a3    -- De 3 bit der bliver til tal2&lt;br /&gt;
alias tal2_bit1 is pin_a4&lt;br /&gt;
alias tal2_bit2 is pin_a5&lt;br /&gt;
&lt;br /&gt;
portc_direction = all_output&lt;br /&gt;
alias res_bit0 is pin_c0     -- Resultatet på de 3 bit der kommer ud&lt;br /&gt;
alias res_bit1 is pin_c1&lt;br /&gt;
alias res_bit2 is pin_c2&lt;br /&gt;
alias carry_out is pin_c3    -- Carry ud på resultatet&lt;br /&gt;
--&lt;br /&gt;
alias carry_in  is pin_c5    -- Carry ind fra inputtet&lt;br /&gt;
&lt;br /&gt;
pin_c5_direction = input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hen gennem de 2 x 3 bit der skal adderes anvendes igen et mellemresultat som er en halfadder. Mellem 1. og 2. fulladder kommer der en carry ud af den første fulladder, som, skal virke som carry ind på den 2. fulladder. Til dette anvendes en intern variabel som mellemresultat. Den samme variabel kan anvendes mellem 2. og 3. fulladder.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var bit res_ha    -- mellemresultat, der er half adder-sum&lt;br /&gt;
var bit carry_mel -- Mellemresultat på carry&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hele koden inde i forever-loopet ser ud som følgende:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
48   -- Først beregnes full-adder på de to lave bit, der giver et output og en intern carry&lt;br /&gt;
49   res_ha = tal1_bit0 ^ tal2_bit0    -- Først regnes en half-adder&lt;br /&gt;
50   carry_mel = (tal1_bit0 &amp;amp; tal2_bit0) | (res_ha &amp;amp; carry_in)   -- så beregnes carry mellemresultat&lt;br /&gt;
51   res_bit0 = res_ha ^ carry_in    -- og derefter selve resultatet på full-adderen&lt;br /&gt;
52   -- Dernæst regnes på de to næste bit, der igen giver et output og en intern carry&lt;br /&gt;
53   res_ha = tal1_bit1 ^ tal2_bit1    -- Først regnes en half-adder&lt;br /&gt;
54   res_bit1 = res_ha ^ carry_mel    --  så selve resultatet på full-adderen&lt;br /&gt;
55   carry_mel = (tal1_bit1 &amp;amp; tal2_bit1) | (res_ha &amp;amp; carry_mel)   -- og derefter beregnes carry mellemretultat&lt;br /&gt;
56   -- Dernæst regnes på de to sidste bit, der igen giver et output og den endelige carry out&lt;br /&gt;
57   res_ha = tal1_bit2 ^ tal2_bit2    -- Først regnes en half-adder&lt;br /&gt;
58   carry_out = (tal1_bit2 &amp;amp; tal2_bit2) | (res_ha &amp;amp; carry_mel)   -- så beregnes carry_out&lt;br /&gt;
59   res_bit2 = res_ha ^ carry_mel    -- og derefter selve resultatet på full-adderen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Linje 49-51 regner de første to bit sammen med carry ind, og lægger summen direkte på udgangen, mens den carry der kommer ud af det gemmes, så den kan bruges ved beregning af de næste to bit.&lt;br /&gt;
&lt;br /&gt;
Linje 53-55 regner de næste to bit sammen med carryen der ligger som mellemresultat, og lægger summen direkte på udgangen, mens den carry der kommer ud af det gemmes, så den kan bruges ved beregning af de sidste to bit.&lt;br /&gt;
&lt;br /&gt;
Linje 57-59 regner de sidste to bit sammen med carryen der ligger som mellemresultat, og lægger summen direkte på udgangen. Den carry der kommer ud af det placeres direkte ud på carry out.&lt;br /&gt;
&lt;br /&gt;
Koden ligger som opg-4a-bit.jal [[Media:PIC-opg-4.zip|i denne ZIP-fil]].&lt;br /&gt;
&lt;br /&gt;
===Binær addition som tal===&lt;br /&gt;
Ved at betragte indgangene som binære tal, så kan det laves noget enklere. Til dette formål defineres to variabler:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var byte tal1&lt;br /&gt;
var byte tal2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Disse to variabler læses ind fra indgangene&lt;br /&gt;
&lt;br /&gt;
Hele koden inde i forever-loopet ser ud som følgende:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
46   tal1 =  porta &amp;amp; 0b0000_0111        -- Hent det ene 3 bits tal over i tal1&lt;br /&gt;
47   tal2 = (porta &amp;amp; 0b0011_1000) &amp;gt;&amp;gt; 3  -- Hent det andet 3 bits tal over i tal2&lt;br /&gt;
48   tal1 = tal1 + tal2                 -- Læg tallene sammen (det sker som bit i variablerne)&lt;br /&gt;
49   if carry_in then&lt;br /&gt;
50      tal1 = tal1 + 1                 -- Læg carry til, hvis den er der&lt;br /&gt;
51   end if&lt;br /&gt;
52   portc = tal1                       -- output resultatet, hvor carry ligger i det 4. bit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Linje 46 læser det ene 3 bits tal ind, og sikrer ved en AND-maske, at det kun er fra de 3 bit der kommer noget.&lt;br /&gt;
&lt;br /&gt;
Linje 47 gør det tilsvarende, bare med 3 bit der ligger et andet sted i porta. Der anvendes igen en AND-maske, og derefter skiftes de 3 bit ned på position 2, 1 og 0, så det er et tal fra 0 til 7.&lt;br /&gt;
&lt;br /&gt;
Linje 48 lægger de to tal sammen (det kan give 0-14, så carry er nu placeret i bit position 3 inde i tal1&lt;br /&gt;
&lt;br /&gt;
Linje 49-51 lægger en carry-bit til fra carry in, hvis den er der, så tallet nu kan være 0-15.&lt;br /&gt;
&lt;br /&gt;
Linje 52 lægger resultatet ud på portc. De 3 bit i tallet kommer ud på pin_c0 - pin_c2 og carryen kommer ud på pin_c3.&lt;br /&gt;
&lt;br /&gt;
Koden ligger som opg-4a.jal [[Media:PIC-opg-4.zip|i denne ZIP-fil]].&lt;br /&gt;
==Binær comperator==&lt;br /&gt;
Denne opgave handler om at sammenligne to tal&lt;br /&gt;
===Kun sammenligning af tal===&lt;br /&gt;
I disse to løsninger sammenlignes 2 sæt 3 bit tal, og der sættes 3 udgange ud fra det.&lt;br /&gt;
&lt;br /&gt;
Indgange og udgange til programmet defineres som følger:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
porta_direction = all_input&lt;br /&gt;
-- De to tal der læses ind ligger på hhv. A0-A2 og A3-A5&lt;br /&gt;
portc_direction = all_output&lt;br /&gt;
-- Definition af de 3 udgange&lt;br /&gt;
alias   greater is pin_c0&lt;br /&gt;
alias   equal   is pin_c1&lt;br /&gt;
alias   smaller is pin_c2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De to binære tal læses ind i 2 variabler:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var byte tal1&lt;br /&gt;
var byte tal2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hele koden inde i forever-loopet ser ud som følgende:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
38   tal1 = porta &amp;amp; 0b0000_0111        -- Læs det første 3 bit tal fra A0-A2&lt;br /&gt;
39   tal2 = (porta &amp;amp; 0b0011_1000) &amp;gt;&amp;gt; 3 -- Læs det andet 3 bit tal fra A3-A5&lt;br /&gt;
40   if tal1 &amp;gt; tal2 then     -- Sammenlign de to tal, og sæt&lt;br /&gt;
41      greater = high       -- de relevante udgange&lt;br /&gt;
42      equal   = low&lt;br /&gt;
43      smaller = low&lt;br /&gt;
44   elsif tal1 &amp;lt; tal2 then&lt;br /&gt;
45      greater = low&lt;br /&gt;
46      equal   = low&lt;br /&gt;
47      smaller = high&lt;br /&gt;
48   else&lt;br /&gt;
49      greater = low&lt;br /&gt;
50      equal   = high&lt;br /&gt;
51      smaller = low&lt;br /&gt;
52   end if&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Linje 38-39 læser de 2 x 3 bit ind i variablerne tal1 og tal2&lt;br /&gt;
&lt;br /&gt;
Linje 40-43 sætter udgange op, hvis tal1 er større end tal2 - de resterende linjer håndterer mindre end og lig med.&lt;br /&gt;
&lt;br /&gt;
Koden ligger som opg-4b.jal [[Media:PIC-opg-4.zip|i denne ZIP-fil]].&lt;br /&gt;
&lt;br /&gt;
Et program der løser det samme kan skrives som:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
38   tal1 = porta &amp;amp; 0b0000_0111        -- Læs det første 3 bit tal fra A0-A2&lt;br /&gt;
39   tal2 = (porta &amp;amp; 0b0011_1000) &amp;gt;&amp;gt; 3 -- Læs det andet 3 bit tal fra A3-A5&lt;br /&gt;
40   greater = tal1 &amp;gt; tal2&lt;br /&gt;
41   equal   = tal1 == tal2&lt;br /&gt;
42   smaller = tal1 &amp;lt; tal2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Her løser linje 40-42 det der blev lavet i en elsif struktur.&lt;br /&gt;
&lt;br /&gt;
Koden ligger som opg-4b1.jal [[Media:PIC-opg-4.zip|i denne ZIP-fil]].&lt;br /&gt;
&lt;br /&gt;
===Sammenligning med cascading input===&lt;br /&gt;
Kigger man på databladet for en binær comperator som digital kreds, så vil den have 3 input mere, der kan påvirke resultatet.&lt;br /&gt;
Ideen i det er at man kan sammenligne 2 x 8 med to kredse der hver kan håndtere 2 x 4 bit, og man kan ekspandere til det antal bit man ønsker, ved at lægge flere kredse til.&lt;br /&gt;
&lt;br /&gt;
Der skal defineres nogle indgange der tager imod inputtene:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
alias   in_greater is pin_c3&lt;br /&gt;
alias   in_equal   is pin_c4&lt;br /&gt;
alias   in_smaller is pin_c5&lt;br /&gt;
pin_c3_direction = input&lt;br /&gt;
pin_c4_direction = input&lt;br /&gt;
pin_c5_direction = input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ekspanderingen kan ske to veje - enten at outputtet går til en kreds med mindre betydende bit, eller at de går til en kreds med mere betydende bit.&lt;br /&gt;
====Ekspandering mod mindre betydende cifre====&lt;br /&gt;
Hvis outputtet går til en kreds med mindre betydende cifre, så kan koden skrives på følgende måde:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
47   tal1 = porta &amp;amp; 0b0000_0111        -- Læs det første 3 bit tal fra A0-A2&lt;br /&gt;
48   tal2 = (porta &amp;amp; 0b0011_1000) &amp;gt;&amp;gt; 3 -- Læs det andet 3 bit tal fra A3-A5&lt;br /&gt;
49   if in_greater then          -- Sæt Greater, hvis det højere ciffer siger Greater&lt;br /&gt;
50      greater = high&lt;br /&gt;
51      equal   = low&lt;br /&gt;
52      smaller = low&lt;br /&gt;
53   elsif in_smaller then       -- Sæt Smaller, hvis det højere ciffer siger Smaller&lt;br /&gt;
54      greater = low&lt;br /&gt;
55      equal   = low&lt;br /&gt;
56      smaller = high&lt;br /&gt;
57   elsif in_equal then         -- Hvis det højere tal siger Equal&lt;br /&gt;
58      portc = tal1 &amp;gt; tal2      -- Sammenlign de to tal, og sæt&lt;br /&gt;
59      portc = tal1 &amp;lt; tal2      -- udgangene derefter&lt;br /&gt;
60      portc = tal1 == tal2&lt;br /&gt;
61   else                        -- Sæt ikke noget hvis det højere ciffer ikke siger noget&lt;br /&gt;
62      greater = low&lt;br /&gt;
63      equal   = low&lt;br /&gt;
64      smaller = low&lt;br /&gt;
65   end if&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Linje 47-48 læser de to tal ind.&lt;br /&gt;
&lt;br /&gt;
Linje 49-56 håndterer hvis det større tal siger større eller mindre.&lt;br /&gt;
&lt;br /&gt;
Linje 57-60 håndterer hvis det større tal siger lig med - her anvendes løsningen fra før.&lt;br /&gt;
&lt;br /&gt;
Linje 61-65 håndterer hvis det større tal ikke indikerer noget fornuftigt, så sættes alle udgange lave, som en fejltilstand.&lt;br /&gt;
&lt;br /&gt;
Koden ligger som opg-4b2.jal [[Media:PIC-opg-4.zip|i denne ZIP-fil]].&lt;br /&gt;
&lt;br /&gt;
====Ekspandering mod mere betydende cifre====&lt;br /&gt;
Hvis outputtet går til en kreds med mere betydende cifre, så kan koden skrives på følgende måde:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
47   tal1 = porta &amp;amp; 0b0000_0111        -- Læs det første 3 bit tal fra A0-A2&lt;br /&gt;
48   tal2 = (porta &amp;amp; 0b0011_1000) &amp;gt;&amp;gt; 3 -- Læs det andet 3 bit tal fra A3-A5&lt;br /&gt;
49   greater = tal1 &amp;gt; tal2             -- Sammenlign de to tal, og sæt&lt;br /&gt;
50   smaller = tal1 &amp;lt; tal2             -- de relevante udgange&lt;br /&gt;
51   if tal1 == tal2 then              -- tag fra cascading input, hvis tallene er ens&lt;br /&gt;
52      greater = in_greater&lt;br /&gt;
53      equal   = in_equal&lt;br /&gt;
54      smaller = in_smaller&lt;br /&gt;
55   end if&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Linje 47-48 læser de to tal ind.&lt;br /&gt;
&lt;br /&gt;
Linje 49-50 laver sammenligningen på større end eller mindre end.&lt;br /&gt;
&lt;br /&gt;
Linje 51-55 håndterer hvis de to tal er ens, så sendes cascading input videre til næste ciffer, eller ud som resultat.&lt;br /&gt;
&lt;br /&gt;
Koden ligger som opg-4b3.jal [[Media:PIC-opg-4.zip|i denne ZIP-fil]].&lt;br /&gt;
&lt;br /&gt;
==Dekoder 3 bit binær til 8==&lt;br /&gt;
&lt;br /&gt;
Dekoderen tager 3 bit ind, og fra det tal de danner sættes en udgang, så kombinationerne 0-7 kommer ud på 8 udgangen, hvor den første bliver høj, når der kommer 0 ind, den næste bliver høj når der kommer 1 ind osv.&lt;br /&gt;
&lt;br /&gt;
Indgange og udgange til programmet defineres som følger&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
porta_direction = all_input&lt;br /&gt;
portc_direction = all_output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Her anvendes de 3 lave bit i porta til tallet ind, og hele portc er udgangene&lt;br /&gt;
&lt;br /&gt;
Der anvendes 2 variabler. tal1 indeholder det tal der læses ind, og tal2 anvendes til at behandle det der skal ud på udgangen.&lt;br /&gt;
 var byte tal1&lt;br /&gt;
 var byte tal2&lt;br /&gt;
&lt;br /&gt;
===Løsning med for-løkke===&lt;br /&gt;
&lt;br /&gt;
I den første løsning, der anvendes en for-løkke til at finde den rigtige udgang.&lt;br /&gt;
&lt;br /&gt;
Hele koden inde i forever-loopet ser ud som følgende:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
32   tal1 = porta &amp;amp; 0b0000_0111&lt;br /&gt;
33   tal2 = 0b0000_0001&lt;br /&gt;
34   for tal1 loop&lt;br /&gt;
35      tal2 = tal2 * 2&lt;br /&gt;
36   end loop&lt;br /&gt;
37   portc = tal2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Linje 32 læser tallet ind fra porta ind i tal1 - tallet begrænses til 3 bit, så det kun kan være 0-7.&lt;br /&gt;
&lt;br /&gt;
Linje 32 sætter det tal op der skal ende med at komme ud på udgangen - det starter med at ligge med en høj i bit 0, så hvis der ikke ændres på det, så er det pin_c0 der går høj.&lt;br /&gt;
&lt;br /&gt;
Linje 34-36 er det for-loop der sætter bittet hen på den ønskede udgang. Loopet gennemløbes det antal gange der er i tal1, og i linje 35 rykkes bittet en tak ad gangen, det kan gøres ved at gange tallet med 2, eller man kunne også have anvendt en skifte-operator &amp;lt;&amp;lt; 1 til det.&lt;br /&gt;
&lt;br /&gt;
I linje 37 lægges resultatet ud på porten.&lt;br /&gt;
&lt;br /&gt;
Koden ligger som opg-4c.jal [[Media:PIC-opg-4.zip|i denne ZIP-fil]].&lt;br /&gt;
&lt;br /&gt;
===Løsning med skift af bit===&lt;br /&gt;
&lt;br /&gt;
I stedet for at anvende et for-loop, så kan man bruge skiftefunktionen direkte.&lt;br /&gt;
&lt;br /&gt;
Hele koden inde i forever-loopet ser ud som følgende:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
32   tal1 = porta &amp;amp; 0b0000_0111&lt;br /&gt;
33   tal2 = 0b0000_0001&lt;br /&gt;
34   tal2 = tal2 &amp;lt;&amp;lt; tal1&lt;br /&gt;
35   portc = tal2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Linje 32 læser tallet som før.&lt;br /&gt;
&lt;br /&gt;
Linje 33 sætter tallet der skal skiftes op.&lt;br /&gt;
&lt;br /&gt;
Linje 34 laver selve skifteoperationen, hvor tal2 skiftes fra 0 til 7 gange. Hvis det skiftes 0 gange, så bliver det som det oprindelige, og pic_c0 sættes høj. Hvis der skiftes 7 gange, så skulle det være pin_c7 der bliver sat høj, men da en [[PIC16F684]] ikke har dette ben, så er alle 6 bit der er i porten bare lave. Hvis man vil teste de to sidste bit i portc, så skal man vælge en anden PIC, som f.x. en [[PIC16F690]] der har 8 bit i portc.&lt;br /&gt;
&lt;br /&gt;
Linje 35 er der hvor tallet faktisk lægges ud på porten.&lt;br /&gt;
&lt;br /&gt;
Koden ligger som opg-4c2.jal [[Media:PIC-opg-4.zip|i denne ZIP-fil]].&lt;br /&gt;
&lt;br /&gt;
===Løsning med reducering ved skift af bit===&lt;br /&gt;
&lt;br /&gt;
Dette er blot en reduktion af det ovenstående eksempel, hvor der er sparet en variabel (tal2) væk, og tingene bliver gjort mere direkte.&lt;br /&gt;
&lt;br /&gt;
Hele koden inde i forever-loopet ser ud som følgende:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31   tal1 = porta &amp;amp; 0b0000_0111&lt;br /&gt;
32   portc = 0b0000_0001 &amp;lt;&amp;lt; tal1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Linje 31 læser tallet som før.&lt;br /&gt;
&lt;br /&gt;
Linje 32 udfører skifteoperationen, og lægger resultatet ud på portc.&lt;br /&gt;
&lt;br /&gt;
Koden ligger som opg-4c3.jal [[Media:PIC-opg-4.zip|i denne ZIP-fil]].&lt;br /&gt;
&lt;br /&gt;
Koden kan også skrives sammen på en linje, hvor man slet ikke bruger en variabel som vist her:&lt;br /&gt;
 31   portc = 0b0000_0001 &amp;lt;&amp;lt; (porta &amp;amp; 0b0000_0111)&lt;br /&gt;
Det sjove er at denne løsning ikke sparer hverken hukommelse eller data-areal, selvom man skulle tro det. Grunden er at den mere komplicerede beregning kræver at den opretter midlertidig hukommelse, og at det kodemæssigt ikke gør nogen forskel, når der alligevel skal bruges midlertidig hukommelse. Denne løsning er ikke med i ZIP-filen.&lt;br /&gt;
&lt;br /&gt;
[[Kategori:PIC_Opgave_Løsninger]]&lt;/div&gt;</summary>
		<author><name>_htx&gt;Bar</name></author>
	</entry>
</feed>