
A/D-fråga om PIC18F1320
> 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...
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...
- JimmyAndersson
- Inlägg: 26586
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
Jag läste slarvigt, trodde att det var 500 programord.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.
>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.
- JimmyAndersson
- Inlägg: 26586
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
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..)
*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..)

- JimmyAndersson
- Inlägg: 26586
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
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:
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
Well, du kan ju ha flera case som ger samma resultat?
typ
... eller hur det nu ser ut i riktig kod... du anar nog principen 
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'
...

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:
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.
Jag kan inte PICBASIC, men det borde bli ungefär såhär:
ADresultat = ADresultat - 42
ADresultat = ADresultat >> 4
knapp= 'F' - ADresultat
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
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.
- JimmyAndersson
- Inlägg: 26586
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
- JimmyAndersson
- Inlägg: 26586
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
Det var värst så smidigt det blev!
"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:

5st sladdar tiill 6st knappar och en encoder. Smidigare blir det inte.

"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:

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