A/D-fråga om PIC18F1320

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
RasmusB
Inlägg: 1006
Blev medlem: 24 augusti 2006, 23:32:13
Ort: Södertälje

Inlägg av RasmusB »

Så går det när man skriver basic på pic ;)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> uj uj, ingen bra kompilator.

Exakt *vad* är det som inte är bra ?
Och som du kan bedöma utifrån (minskningen av) storleken på HEX filen ??
Exakt hur många "programord" mindre motsvarar 0.5 kB i en HEX fil ?
(Svar : det beror på....)

0.5kB HEX = ca 250 bytes binärt = ca 125 programord.
I detta ingår HEX filens overhead (adresser, checksummor o.s.v.) på
ca 20%, så det kanske är under 100 programord/instruktioner.

Låter väl inte *helt* orimligt...

Jag säger inte att kompilatorn är bra, utan bara att man inte kan
avgöra det utifrån *den* enda uppgiften...
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

"uj uj, ingen bra kompilator."

Jag tyckte den var jättebra som kunde minska så mycket... :lol:
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

sodjan skrev:0.5kB HEX = ca 250 bytes binärt = ca 125 programord.
I detta ingår HEX filens overhead (adresser, checksummor o.s.v.) på
ca 20%, så det kanske är under 100 programord/instruktioner.
Jag läste slarvigt, trodde att det var 500 programord.

>Låter väl inte *helt* orimligt...

Nej, det har du rätt i. Om det är många ifsatser i koden kanske det är rimligt.

Om värdena är jämnt fördelade borde det gå att med några skiftningar av och en addition på ad-resultatet byta ut if-satserna mot en case-sats, då kanske man kan spara ännu mer utrymme.
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

IF-satserna är lika många som innan: 6st. Det jag gjorde var:

*Plockade bort den delen som slår ihop två bytes till ett word.
*Bytte variabeln "knapp" mot "knapp_lo" och ändrade siffrorna i IF-raderna.

Kan ha varit någon liten detalj till. Defragmenterar den hårddisken nu så jag kan inte kolla. (Eller.. jag kan, men då startar defragmenteringen om..) :)
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Att byta IF-raderna mot en case vore mycket smidigt. Men hur blir det med "fladdret", dvs att en knapp kan ge ett tal som kan variera +/- 3 jämfört med det som står i tabellen nedan?

Såhär ser det ut från ADC'n:

Kod: Markera allt

KNAPP    ADRESL       ADRESH        WORD (decimalt)
  A     11111111     00000001       511
  B     11010100     00000001       468
  C     10011110     00000001       414
  D     01010100     00000001       340
  E     00001110     00000001       270
  F     10101110     00000000       174
Användarvisningsbild
RasmusB
Inlägg: 1006
Blev medlem: 24 augusti 2006, 23:32:13
Ort: Södertälje

Inlägg av RasmusB »

Well, du kan ju ha flera case som ger samma resultat?

typ

Kod: Markera allt

case   511   d'1'
case   510   d'1'
case   509   d'1'
case   508   d'1'
case   469   d'2'
case   467   d'2'
case   466   d'2'
...
... eller hur det nu ser ut i riktig kod... du anar nog principen :)
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Men det måste ju ge större kod?

Värden ligger kanske lite för olinjärt för att funka bra. Men såhär går det att få till:

Kod: Markera allt

knapp	min	varde	max	casevärde
A		504	511		519	24
B		456	468		471	21
C		408	414		423	18
D		328	340		343	13
E		264	270		279	9
F		168	174		183	3
Då får du skapa 8-bitars AD-resultat. Sen drar du bort 30 från resultatet. Sedan skiftar du höger 2 steg. Siffran du fått fram då kan du använda i case-satsen.

Med reservation för felräkning.

EDIT: Nu vet jag inte riktigt vad du ska göra med värden. Men om du vill att AD-värdet ska bli en variabel som innehåller bokstäverna A - F kan du klara dig helt utan case-sats. Bara räkna ut värdena.

Kod: Markera allt

Knapp	min	varde	max	resultat
A		488	511		551	5
B		424	468		487	4
C		360	414		423	3
D		296	340		359	2
E		232	270		295	1
F		168	174		231	0

Jag kan inte PICBASIC, men det borde bli ungefär såhär:
ADresultat = ADresultat - 42
ADresultat = ADresultat >> 4
knapp= 'F' - ADresultat
Senast redigerad av bearing 6 december 2006, 16:37:27, redigerad totalt 2 gånger.
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Intressant lösning! Ska testa.
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Se edit. Det visade sig att "the answer to the Ultimate Question of Life, the Universe, and Everything" är en del av lösningen. =)
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Det var värst så smidigt det blev! :D


"Nu vet jag inte riktigt vad du ska göra med värden."

Jag behöver bara få någon enkel identifiering av vilken knapp som trycktes så de kan utföra vissa grejjer. Om det blir bokstäver eller siffror kvittar.


Såhär har jag planerat knapparna:
Knapp A = Startar nedräkning (och belysning.)
Knapp B = Stoppar och återställer tiden.
Knapp C = Väljer olika ljuskällor.
Knapp D = Hemlig funktion.
Knapp E = Samma här.
Knapp F = Går in/ur tid-inställningen. (Den knappen sitter på encodern.)
(Encoder-ratt = Ställer in tiden.)

Det finns egentligen en knapp till. En mikrobrytare som sitter i locket, men den har fått en egen pinne.


Har pratat så mycket om knapparna nu så det är lika bra att ni får se hur de ser ut:
Bild

5st sladdar tiill 6st knappar och en encoder. Smidigare blir det inte. :)
Senast redigerad av JimmyAndersson 6 december 2006, 17:05:13, redigerad totalt 1 gång.
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Då förstår jag. Med den andra lösningen blir ju områdena bredare. Kanske är bra om temperaturer på olika komponenter ändras så att värdena sprids mer.

resultat = ADresultat - 42
resultat = resultat >> 4

select case (resultat)
case '5'
case '4'
...

Det kanske blir olika effektiva lösningar av case-satsen beroende på om du vänder så att 0 kommer först, så det kan du också testa om det behöver optimeras mer.
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

Ett alternativ till komparatorn är att an vända sej av en extra pina på picen, som du använder för att växla "de nerdersta" motsåndet (exempel 100k kopplat till jord och 1k till en pinne på picen, genom att antingen pinnen vara utång 0 eller ingång så kan du välja mellan 100k och 1k) för delen med den här kopplingen är att du får en "hög" späning ut när pinnen är satt till ingång vilket gör att man enkel kan koppla den till ett intrupt och samtidigt få ett bra avläsning när pinnen är satt till utgång 0:a...

Nu har du i och försej redan löst problemet men det kan var roligt att veta till nästa gång... ^^
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Det här blev en kul och givande tråd.

Jag har tänkt labba med olika meny-system senare, så jag kommer få stor nytta av alla lösningar.


Skrev nyss ut koden. 7st A4-sidor, men det saknas fortfarande en del grejjer. De kommer i morgon. Nu: Zzzzz... :)
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Bearing:
Jag har räknat lite nu, men jag lyckas inte få de resultat du fick. Hur gjorde du?

Om vi tar det första exemplet:
"Då får du skapa 8-bitars AD-resultat. Sen drar du bort 30 från resultatet. Sedan skiftar du höger 2 steg. Siffran du fått fram då kan du använda i case-satsen."

Alltså:
255 - 30 = 225. Dvs 11100001 binärt. Skiftar man två steg åt höger så blir det 00111000 , dvs 56 decimalt. Det är en bra bit ifrån 24.

Fick inget bra resultat på den andra lösningen där du fick 5 till 0.
Förresten så behöver jag högre tal än 0.


Kan du visa hur du gjorde? :)


Förresten: Excel klarar väl inte att räkna med binära tal? Det går iofs att göra en formel som visar resultatet binärt, men det skulle underlätta om det fanns färdigt.
Skriv svar