Bruke PIC10F220 ADC

M

max0412

Guest
Jeg vil bruke ADC av 10F220 å angi lengden av en forsinkelse.Kan jeg bruke equate å definere bestemte områder av ADC inngangen til et tall som vil bli satt inn forsinkelsen subroutine.Eller bør jeg bruke konstant eller er dette feil, og bør jeg gjøre det på en annen måte.

Pseudo-koden
Code:Sense ADC

OM ADC <= 1 OG K = 10

OM ADC> 1 <= 2 OG K = 20

 
Jeg vil ikke bruke ADC å skape forsinkelser.Forsinkelser kan lett bli opprettet i SW, uten behov for og eksterne timing nettverk og ADC.

Du kan bruke TMR0 eller bare programvare looper å skape noen forsinkelse du ønsker.

 
VVV wrote:

Forsinkelser kan lett bli opprettet i SW, uten behov for og eksterne timing nettverk og ADC.
 
Hvis du trenger å bruke en pott å angi tidspunktet da ADC er en god måte for.Du kan bruke en forenklet form, for eksempel en cap betale en variabel motstand, så når cap kostnadene nok,
og det utløser inntastingsfeltet port.Hvis du har noen reservedeler skriving porter, kan du bruke en dil bryteren, en 4 måten man kunne gi deg 1-15 sekunder
osv. for eksempel.

 
Det jeg hadde i tankene er (se tekstutdraget nedenfor) er bruk brukeren valgte verdien av ADC, konvertere dette til nummeret og sette det inn i forsinkelsen rutine nedenfor.Brukeren kan justere POT fra utsiden av vedlegg til POT vil bli markert på intervall s tilsvarende forsinkelse lengder, trykt på kabinett.Verdien skal være bestått med antall ganger gjennom delay2 øyeblikket den er satt til 4.

Biten

Code:utsettelse

movlw ,4; Antall ganger gjennom delay2 (Loop Counter)

movwf dc4delay2

movlw ,180; Offtime

movwf dc3

dly3

decfsz dc3, f

goto dly3dly4

decfsz dc4, f

goto delay2

goto con

 
OK, nå forstår jeg hva du må gjøre.
Jeg tror den enkleste måten er dette: at ADC vil gi et tall fra 0 til 255, avhengig av plasseringen av potten.Det er 256 skritt.
Du trenger et visst antall skritt, sier 8 eller 16.Det
er hyggelig å holde dem krefter to.La oss anta at du trenger 16 trinn.
Så du opprette en forsinkelse rutine som gir deg trinn forsinkelsen, sier 5ms.Kall det Dly_5ms.Alt du trenger nå er en teller som teller hvor mange 5ms forsinkelser for å sette inn, og du laster som teller med et tall basert på potten posisjon.

Så ta ADC lese, dele det med 16 og du får et tall fra 0 til 15.Med andre ord, hvis ADC lesing er mellom 0 og 15 resultatet er 0 hvis det
er mellom 16 og 31 er resultatet 1 og så videre.

Legg til dette nummeret er konstant, avhengig wha minimum forsinkelse skal være.For eksempel, hvis du trenger en min forsinkelse på 5ms, legg 1, om minimum forsinkelser må 25ms, deretter legge til 5.Sjekk resultatet i tillegg til å sørge for maksimal ikke overskrides.For eksempel, hvis det maksimale forsinkelsen er ment å være 50ms, så sørg for at nummeret ikke er større enn 10.

Hvis du trenger en rekke tiltak,
kan du dele ADC lesning av noe annet.Hvis du beholder antall skritt krefter to så kan du dele av rrf instruksjoner (Ikke glem å tømme C flagg før hver rrf).I denne koden Jeg brukte et triks for å dele med 16 raskere, men det er en annen historie.

Hvis du angir MAX å være mindre enn maks antall skritt vil tillate,
kan du redusere antall skritt, men den siste delen av potten skal ikke brukes.Se i koden nedenfor som MAX er satt til 10.Som gir deg bare 10 skritt, men de vil fortsatt være klemt i nedre del av potten,
og ikke spredt jevnt.
Økende MIN vil også redusere antall skritt,
og legge mer av den øvre delen av potten ubrukelig.

Fra min erfaring med 10F220 jeg kan si at du trygt kan ha 64 trinn med denne tilnærmingen.Noe mer vil bli utsatt for feil som skyldes ADC støy.
Jeg anbefaler at du bruker en 10K pott koblet direkte fra Vdd til GND og 0.1uF hetten på ADC-inngang.
Code:MIN EQU 1

MAX EQU 10swapf adresse, W; få ADC lesing, med nibbles swappet;

andlw 0x0F; klart øverst 4 biter; disse 2 instruksjoner effektivt dividere med 16

movwf Counter; lagre verdien i forsinkelse counter

movlw min;

addwf Counter, F; sikre Counter har en minimum verdi større enn 0

movlw MAX; nå kontrollmetoden

subwf Counter, W; kontrollere om Counter er større enn MAX

btfsc STATUS, C; hvis ikke, vi er OK

goto Del; og gå gjøre forsinkelsenmovlw MAX; annet styrke Counter til MAX

movwf CounterDel: Ring Dly_5ms; forsinkelse 5ms

decfsz Counter, F; gjort?

goto Del; Hvis ikke, fortsetterFerdig: .........; her gjøre det du trenger etter programmerbar forsinkelse
 
Takk for detaljert instruksjon.Det er akkurat det jeg var ute etter.

Jeg fant noen eksempler (Google) i likhet med hva jeg ville gjøre med slå opp tabeller, men jeg tror måten du
har vist er mye mer effektivt.

Disse lille PIC blir stor!En liten 6-søt-23 PIC eliminerer mye ekstra komponenter.

 
Sitat:Jeg trodde da du brukte koden koder formatering beholdes.
Beklager det er litt rotete
 
Jeg har problemer med å prøve å hente den verdien som er lagret i "Counter" å bruke i min forsinkelse rutine.Jeg kjørte noen simuleringer i PIC10F SIM og den henter inn adressen ikke den verdien som er lagret på adressen?Det legger inn adressen i W register ikke den verdien som er lagret der.Se HER !!!!!! Nedenfor.

Hva gjør jeg galt.Rediger - Glem det jeg skjønte det.VVV the code you gave me for the ADC part works perfectly .Thank You

Jeg brukte movfw comand.
VVV koden du gav meg for ADC delen fungerer perfekt. Thank YouCode:listen p = 10F220; listen direktivet definerer prosessor

# include <p10F220.inc>; prosessor bestemt variabel definisjoner__CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _MCPU_OFF & _IOFSCS_4MHZ;***** VARIABLE DEFINISJONER

TEMP_VAR UDATA

count1 res 1

count2 res 1

count3 res 1

count4 res 1

count5 res 1

count6 res 1

count7 res 1

count8 res 1

count9 res 1

Counter res 1

cont1 res 1

cont2 res 1

MIN EQU 01h

MAX EQU 0Ah;************************************************* *********************

RESET_VECTOR KODE 0xFF; prosessor tilbakestille vector; Intern RC kalibrering er plassert geografisk 0xFF av Microchip

; Som movlw k, hvor k er et ordrett verdi.MAIN KODE 0x000

movwf OSCCAL; oppdatere register med fabrikken cal verdi;******* Jumpgoto MAIN

;********* Forsinkelse 20msdelay20

movwf cont1; verdien som er lagret på disken er brukt her

movlw ,65

movwf count5

movlw ,237

movwf count6dloop1

btfss GPIO, 0; Test for høy GP0?

goto forstand; Nei holde testing

btfss GPIO, 3; Test for høyt på GP3?

goto forstand; Nei holde testing

decfsz count6, f; fortsatt høy fortsette med forsinkelse

goto dloop1

decfsz count5, f

goto dloop1

decfsz cont1, f; antall ganger gjennom 20ms forsinkelse

goto dloop1

retlw 0x00;------ 500 ms forsinkelse ved 4 MHz"

'

'

;****************** Forsinkelse 10us

'

'

;***** Start her

; Denne delen konfigurerer AN1 for analog.
Pakk en verdi basert på anolog lesing og setter denne verdien i "Teller".
Verdien som er lagret i "Counter skal brukes i 20mS forsinkelse senere.MAINmovlw b'10000101 '; CONFIG ADC: AN1 Analog inngang

movwf ADCON0

movlw ,20

samtale Delay10uS

BSF ADCON0, 1; starte konverteringloop0

Nov

BTFSC ADCON0, 1; vente gjort

GOTO loop0swapf adresse, W; få ADC lesing, med nibbles swappet;

andlw 0x0F; klart øverst 4 biter; effektivt dividere med 16

movwf Counter; lagre verdien i forsinkelse counter

movlw min;

addwf Counter, F; sikre Counter har en minimum verdi større enn 0

movlw Counter; nå kontrollmetoden

subwf MAX, W; kontrollere om Counter er større enn MAX

btfss STATUS, C; hvis ikke, vi er OK

goto start og gå gjøre forsinkelsenmovlw MAX; annet styrke Counter til MAX

movwf Counter;**** Slå av ADC Config GP2 for I / 0 output

start

CLRF ADCON0; ADC OFF

movlw b'11011111 '; klart tocs

OPTION

BCF OSCCAL, FOSC4; GP2 som I / O!movlw b'1011 '; gp2 som output

tris GPIO

CLRF GPIO; starte GP2 LOW

movlw b'0000 ';*********** Denne delen sansene GP0 og GP3 for høy, hvis de er både høy den passerer verdien lagret på "Counter" til 20mS delay.The verdi lagret på "Counter skal angi beløp ganger 20ms forsinkelse er gjort.Sense

btfss GPIO, 0; Test for høy GP0?

goto forstand; Nei holde testing

goto $ 1

goto $ 1

btfss GPIO, 3; Test for høyt på GP3?

goto forstand; Nei holde testing

movlw Counter; HER !!!!!!!!!!!

samtale delay20; Signal høy på begge inngangene goto forsinkelse

movlw ,10; Antall pulser counter

movwf count8;***** GP0 og GP3 Både høy for dealy tid starte outputing 10 pulser på 1Hz.ON

bsf GPIO, 2; GP2 HIGH starte outputing pulser 1Hz 10

movlw ,1; W x 500ms forsinkelse

samtale Delay500mS;********** Av puls tid

Av

BCF GPIO, 2; Gp2 lav

movlw ,1

samtale Delay500mSdecfsz count8, f; pulser counter

goto ON; ikke gjort holde pulserende

movlw ,1

samtale Delay500mS; gir forsinkelse for stabilisering.

goto forstand; ferdig gå tilbake og starte på nyttEND; direktivet 'slutten av programmet "

 

Welcome to EDABoard.com

Sponsor

Back
Top