Sida 1 av 2

Styra blinkhastigh. med analog ingång. (Sodjan fixade det.)

Postat: 20 juni 2010, 22:29:31
av jojje
Nedanstående kod, som är skriven till en PIC16F88 och i MicroBasic Pro, fungerar.
Men, jag skulle vilja att lysdioden på PORTB.7 ökar/minskar när man skruvar
på potten som sitter på AN2. Hur kan man få till det?
Trodde i min enfald att man kunde sätta in adc_rd i stället för 500Delay_ms(500)
för att få lysdioderna att blinka fortare/saktare, men det gick inte. :D

Kod: Markera allt

program Jojje2
dim adc_rd as word

main:
    ANSEL  = 0x04           ' Configure AN2 pin as analog
    TRISA  = 0xFF           ' PORTA is input
    TRISB  = 0              ' PORTB is output

  while (TRUE)
    adc_rd = ADC_Read(2)    ' get ADC value from 2nd channel
    PORTB.7 = 1
    Delay_ms(500)
    PORTB.7 = 0
    Delay_ms(500)

    PORTB = Hi(adc_rd)      ' display adc_rd[9..8] OBS: Det blir RB0 och RB1 som lyser när man ändrar AN2
  wend
end.

Re: Styra blinkhastigheten med analog ingång.

Postat: 20 juni 2010, 23:22:40
av sodjan
1. Se till att du kan läsa potten (om jag fattar rätt så är det redan OK !?)
2. Skala värdet från potten så att det matchar skalan på blinkhastighet du vill ha (eller strunta i det).
3. Fixa en loop där du snurrar ett antal varv styrt av potten och t.ex har en Delay_ms(10) eller så.

D.v.s att blinkhastigheten blir från (10*0 ms) -> (10*1024 ms) om hela ADC skalan används.

> Trodde i min enfald att man kunde sätta in adc_rd i stället för 500 på Delay_ms(500)

Det finns ingen anledning att tro eller gissa något.
Manualen är tydlig på att parametern till Delay_ms() måste vara en *konstant*.
Delay_ms() genererar en programvaru-loop som tar angiven tid vid angiven frekvens.

Om du har t.ex en Delay_ms(10) och en Delay_ms(20) i samma program så skapas
två olika rutiner som anropas var för sig. den ena tar 10ms och den andra tar 20ms.
Det är inte samma rutin som anropas med 10 resp 20 som parametrar, vilket man
i och för sig skulle kunna tro, men manualen är tydlig där.

Vdelay_ms() däremot tar en runtime variabel och kan anropas med olika värden.
Däremot har den inte samma exakthet som Delay_ms(), men det har knappast
någon betydelse i detta fall. Du skulle kunna prova och bara göra Vdelay_ms(adc_rd)
så får du/vi se vad som händer...

Re: Styra blinkhastigheten med analog ingång.

Postat: 20 juni 2010, 23:31:03
av jojje
Tack så jättemycket sodjan. Det funkade helt ypperligt med Vdelay_ms(adc_rd). :happy:

Det att jag provade byta 500 mot adc_rd var mest bara ett infall av att ha provat i alla fall. :D

Re: Styra blinkhastigh. med analog ingång. (Sodjan fixade det.)

Postat: 21 juni 2010, 00:13:43
av jojje
Har nu provat med loop också, det funkade bra det med,
men Vdelay är mycket smidigare och blir mindre kod. :D

Re: Styra blinkhastigh. med analog ingång. (Sodjan fixade det.)

Postat: 21 juni 2010, 01:08:38
av jojje
Så här blev resultatet efter lite bantning.
(Borde väl inte funka med så lite kod, men det gör det. :vissla: )

Kod: Markera allt

program Jojje2

main:
    TRISB = 0              ' PORTB is output

  while True
    PORTB.0 = 1
    Vdelay_ms(ADC_Read(2))
    PORTB.0 = 0
    Vdelay_ms(ADC_Read(2))
  wend
end.

Re: Styra blinkhastigh. med analog ingång. (Sodjan fixade det.)

Postat: 21 juni 2010, 10:21:55
av Andy
Grattis Jojje du lär dig snabbt! :)
Det blir inte så mycket kod när man använder Basic i någon av dess varianter.

Re: Styra blinkhastigh. med analog ingång. (Sodjan fixade det.)

Postat: 21 juni 2010, 13:07:29
av jojje
Just programering och syntaxen i Basic har jag flera års vana med,
men det är alla nya konstigheter som tillkommer med PIC'arna som
jag har lite svårt med, tex ANSEL, ADCON0, ADCON1, ANSELH, TRISB
och andra konstigheter. Sen fattar jag inte helt tex hur man läser i
tabellerna för dom olika registren (heter det så?)

Tex i databladet för 16F88 finns det en tabell med REGISTER 12-1: ANSEL
men det är väl bara att om man tex vill ha AN2 som analog, så kan man ange
ANSEL = 0x04 eller ANSEL = %00000010 (Tror det blev riktigt, hmm...)

Kod: Markera allt

000 = Channel 0 (RA0/AN0)
001 = Channel 1 (RA1/AN1)
010 = Channel 2 (RA2/AN2)
011 = Channel 3 (RA3/AN3)
100 = Channel 4 (RA4/AN4)
101 = Channel 5 (RB6/AN5)
110 = Channel 6 (RB7/AN6)
Jag är inte heller helt säker hur man kommer fram till att:
TRISB = 0x3F ' Pins RB7, RB6 are outputs

Finns det nån bra lathund för att komma överens med dessa saker?

Re: Styra blinkhastigh. med analog ingång. (Sodjan fixade det.)

Postat: 21 juni 2010, 13:13:03
av sodjan
> ANSEL = 0x04 eller ANSEL = %00000010 (Tror det blev riktigt, hmm...)

Du får kolla upp hex och binära talsystemk lite. Det där är väl inte samma värde.

> Jag är inte heller helt säker hur man kommer fram till att:
> TRISB = 0x3F ' Pins RB7, RB6 are outputs

3F = 00111111, 0 = output, 1 = input

Ser väl OK ut, eller hur ? Vad är fel ?

Personligen föredrar jag att man anger TRISx binärt, det
går snabbare att se hur varje bit/pinne är satt utan att först
"översätta" från hex...

Re: Styra blinkhastigh. med analog ingång. (Sodjan fixade det.)

Postat: 21 juni 2010, 13:48:57
av jojje
Så här ska det nog vara ANSEL = %00000100 (7, 6, 5, 4, 3, 2, 1 och 0)
Jag gjorde så från början, men så tittade jag i kodfönstret, så blev det fel. :D
(Hoppas det blev riktigt nu då :wink: )

Det är nog inget fel på TRISB = 0x3F ' Pins RB7, RB6 are outputs,
det kopierade jag från helpfilen, men det var hur man kom fram till det
som jag var osäker på. Som du skriver så är det mycket lättare med
binärt, men det är en salig blandning i datablad, hjälpfiler och exempelkod.

När man skriver det som 00111111 så ser man det lättast hur det är uppbyggt.
(7 till vänster och 0 till höger.)

Tack för hjälpen igen. Jag lär nog till slut. :lol:

Re: Styra blinkhastigh. med analog ingång. (Sodjan fixade det.)

Postat: 21 juni 2010, 14:24:42
av sodjan
Ja, så här brukar jag se på det...

För register där varje "bit" har en (så att säga) egen "funktion", så
föredrar jag att alltid ange värdet/bitarna binärt. Det blir enklare att
se hur varje enskild bit är satt. Detta gäller de flesta konfigurerings
register som TRISx, ANSEL o.s.v.

För register där hela registret används som en enhet (som ett värde)
så är det normalt enklast att ange värde i hex (eller eventuellt
decimalt om det är enklare). Vi (människor) har ju lättare att se att
60 är dubbelt så mycket som 30 (uttryckt decimalt), jämfört med
att 3C är dubbelt så mycket som 1E (uttryckt i hex)...
Detta kan gälla vissa register för timers och baudrate registret t.ex.

Ett annat sätt att ange TRISx bitarna som kanske gör det hela
ennu tydligare (övertydligt och lite onödigt sannolikt) skulle kunna vara :

Kod: Markera allt

    TRISB.0 = 1   
    TRISB.1 = 1   
    TRISB.2 = 1   
    TRISB.3 = 1   
    TRISB.4 = 1   
    TRISB.5 = 1   
    TRISB.6 = 0   
    TRISB.7 = 0   

Re: Styra blinkhastigh. med analog ingång. (Sodjan fixade det.)

Postat: 21 juni 2010, 14:33:52
av Nerre
HEX tycker jag är bra också för att vara säker på att man inte går utanför ordlängden. Visserligen är det inte SÅ svårt att komma ihåg 255 för 8 bitar och 65535 för 16, men på nåt sätt känns 0x00-0xFF eller 0x0000-0xFFFF mycket mer logiskt.

Re: Styra blinkhastigh. med analog ingång. (Sodjan fixade det.)

Postat: 21 juni 2010, 14:44:19
av sodjan
Jo, och det är ju *mycket* lättare att se vad som hamnar i vilken byte
om man anger "23FA" i hex istället för 9210 decimalt... :-)

Re: Styra blinkhastigh. med analog ingång. (Sodjan fixade det.)

Postat: 21 juni 2010, 15:29:48
av jojje
Tack så mycket för förklaringen. Det är nog lättare än jag trodde
bara man kommer igång med det, å ser vad som händer när man
ändrar i värdena. Det är nog ett bra sätt att lära sig på tror jag.
Lära av sina fel och inte bara kopiera/klistra in färdiglagad kod.

Appropå kod. Känner nån till ett bra ställe med microBasic-kod
man kan titta på och lära sig av? Har hittat till PicBasicPro, men
det är inte alls samma kommandon som i microBasic Pro.

MikroElektronika har sitt forum, men jag har inte direkta frågor,
så ett bibliotek vore nog mera naturligt att strosa runt i.

Re: Styra blinkhastigh. med analog ingång. (Sodjan fixade det.)

Postat: 21 juni 2010, 17:45:16
av ToPNoTCH
"Det är nog ett bra sätt att lära sig på tror jag.
Lära av sina fel och inte bara kopiera/klistra in färdiglagad kod.

Appropå kod. Känner nån till ett bra ställe med microBasic-kod
man kan titta på och lära sig av?"

:roll:

Hur blev det där nu då Jojje :razz:

Re: Styra blinkhastigh. med analog ingång. (Sodjan fixade det.)

Postat: 21 juni 2010, 18:58:09
av jojje
Man måste ju ha lite ny kod att peta å ändra i.

Jag kan ju inte hitta på nåt nytt helt själv,
det förstår du nog själv om du bara vill. :roll:

Hur skulle en kock kunna göra nya matrecept utan
att ha tillgång till råvarorna, hmm...

Men vill man vrida på allt som skrivs, då vill man... :badgrin: