Talande Breathalyzer Mark II (6 / 7 steg)
Steg 6: Programmet: PIC MCU ASM koden (montering)
http://www.electroniclessons.com/talkingbreath.txt
Jag är att placera den i dokumentet också, men kommentarerna se rörigt. Ledsen att det = ()
Om någon av er vill ha den. ASM fil kan du inte be! Jag använde en ISD2 programmerare pucken och MPLAB IDE programvara för att programmera min bild. Om någon av er har några frågor, är jag alltid glad att svara på om du vill veta mer om detta programmerare, titta här:
http://www.microchip.com/Stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en010046&part=DV164005
HÄR ÄR KODEN:
; huvudkoden går här ***
MOVLW 0X40; STÄLL IN INTERN OSCILLATOR FREKVENS
MOVWF OSCCON; INITIERA
MOVLW 0X00; STÄLL IN PORTB FÖR ATT VARA ALLA UTGÅNGAR
MOVWF TRISB; INITIERA
CLRF PORTB; TYDLIG PORTB UTGÅNGAR
MOVLW 0XFE; 00001110
MOVWF TRISA; STÄLL IN PORTA VARA ALLA UTGÅNGAR UTOM FÖR RA1/2/3
CLRF PORTA; TYDLIG PORTA
MOVLW 0X05; STÄLL IN ADC
MOVWF ADCON0; AKTIVERAR ADC, MEN STARTA INTE KONVERTERING
MOVLW 0X7D; STÄLL IN ADC
MOVWF ADCON1; AN0/RA0 = ANALOG INGÅNG
MOVLW 0X0F; STÄLL IN ADC
MOVWF ADCON2; STÄLL IN TIDPUNKTEN FÖR ADC KONVERTERING (SE DATABLAD FÖR; ADCON0/1/2 REGISTER BILDANDET ALTERNATIV
; RA0 = PLAYBACKOUT
; RA1 = ADC-IN
; RA3 = PROV
START:
BTFSC PORTA, RA3; Dra upp motståndet håller RA3 hög tills knappen trycks. Denna anvisning, kontrollerar status på RA3. Hoppar över nästa instruktion om låg (knappen intryckt).
Gå till Start, om knappen inte har tryckts, gå tillbaka till start och kolla igen. ; LOOPAR TILLS KNAPPEN TRYCKS.
MQ3CHECK:; Denna rutin fungerar för att kontrollera produktionen av MQ3 att bestämma när den har, blir stabil nog för en annan mätning.
KALLA RUNADC; Genom att ringa RUNADC subrutinen, vi ska ta en 8-bitars; representation av MQ3 utgång, och lagra det i minnet
KALLA LEDSIGNIFY; Ring subrutin som anger en vänta-stat till användare med hjälp av lysdioder på PORTB
MOVLW 0X1E; Flytta predermined referensvärdet W (arbets) register.
CPFSLT GEN5; Jämför värdet i WREG till ADC värde i GEN5. Hoppa över om WREG innehåll, är större än värdet för ADC.
Gå till MQ3CHECK, om MQ3 är inte redo att ta en tillförlitlig avläsning, ta ett nytt prov
RING RÖST. Röst inspelning rutinen
KALLA LOOP1
KALLA WAITSTATE; Samtal rutin som anger att enheten läser sensor, och att den, användaren bör blåsa tills lamporna slutar blinka.
KALLA RUNADC; Kör ADC igen för en ny behandling
SAMTAL AVGÖRA; Kör en avgörande subrutin som gör matten
RUNADC:
BSF ADCON0, GÅ/GJORT; Starta konverteringen - Set GO/klar bit i registret ADCON0
STEG 2:
BTFSC ADCON0, GÅ/GJORT; GÅ/klar lite i ADCON0 kommer att stanna hög fram till konvertering, är klar. Kontrollera om biten är hög, gå tillbaka till steg 2. Om inte, Fortsätt.
GÅ TILL STEG 2
MOVFF ADRESH, GEN5; Ett säkert sätt flytta 8-bitars innehållet i ADC register till GEN5 registren för senare.
HEMKOMST. Slutet subrutin
LEDSIGNIFY:
SETF PORTB; Slå på alla PORTB utgångar (alla lysdioder på)
KALLA LOOP1; Samtal fördröjning Loop subrutin att löpa en tid
CLRF PORTB; Stäng av alla PORTB utgångar (alla lysdioder off)
KALLA LOOP1; En annan fördröjning
HEMKOMST. Returnera från sub rutin
RÖST:
BSF PORTA, RA0; Signal till ISD1218 enhet - Aktivera inspelning (redo för alkohol behandlingen)
Ring LOOP1, dröjsmål används för att kontrollera att ISD1218 chip är ordentligt aktiverad
BCF PORTA, RA0; Aktivera inaktivera signal till ISD1218
HEMKOMST. Returnera från subrutin
WAITSTATE:; erbjuda användaren gången att blåsa i sensorn
KALLA WAITSTATE2
KALLA WAITSTATE2
KALLA WAITSTATE2
KALLA WAITSTATE2
KALLA WAITSTATE2
KALLA WAITSTATE2
KALLA WAITSTATE2
KALLA WAITSTATE2
KALLA WAITSTATE2
KALLA WAITSTATE2
KALLA WAITSTATE2
KALLA WAITSTATE2
KALLA LOOP1
RETURNERA
WAITSTATE2:; Blinkar LED i ordning från 1-6
MOVLW 0X01
MOVWF PORTB
KALLA LOOP3
MOVLW 0X02
MOVWF PORTB
KALLA LOOP3
MOVLW 0X04
MOVWF PORTB
KALLA LOOP3
MOVLW 0X08
MOVWF PORTB
KALLA LOOP3
MOVLW 0X010
MOVWF PORTB
KALLA LOOP3
MOVLW 0X20
MOVWF PORTB
KALLA LOOP3
CLRF PORTB
RETURNERA
BESTÄMMA:
MOVLW 0X24; Flytta värdet i WREG för referens
CPFSGT GEN5; om ADC värdet är större än WREG, hoppa över nästa instruktion, om inte, du har; hittat din alkohol nivå!
Ring LED1; annars tänds LED #1 (ingen alkohol nivå upptäckt).
MOVLW 0X3B; Flytta värdet i WREG för referens
CPFSGT GEN5; om ADC värdet är större än WREG, hoppa över nästa instruktion, om inte, du har hittat din alkohol nivå!
Ring LED2; annars tänds LED #2 (en öl eller två).
MOVLW 0X52; Flytta värdet i WREG för referens
CPFSGT GEN5; om ADC värdet är större än WREG, hoppa över nästa instruktion, om inte, du har; hittat din alkohol nivå!
Ring LED3, om inte, tänds lysdiod #3 (två eller tre under den senaste timmen - ungefär. Sannolikt, bör inte köra).
MOVLW 0X69; Flytta värdet i WREG för referens
CPFSGT GEN5; om ADC värdet är större än WREG, hoppa över nästa instruktion, om inte, du har; hittat din alkohol nivå!
KALLA LED4; Flytta värdet i WREG för referens
CPFSGT GEN5; om ADC värdet är större än WREG, hoppa över nästa instruktion, om inte, du har f; ound din alkohol nivå!
Ring LED5, om inte, tänds LED #5 (berusad. Inte driva, eller slå på människor du känner att du inte borde!).
MOVLW 0X95; Flytta värdet i WREG för referens
CPFSGT GEN5; om ADC värdet är större än WREG, hoppa över nästa instruktion, om inte, du har hittat; din alkohol nivå!
KALLA LED5
KALLA LED6
RETURNERA
LED1:
BSF PORTB, RB0; SLÅ PÅ LED1
KALLA LONGDELAY; Ring en lång fördröjning
NOLLSTÄLL; Resultatet visas - Återställ program
LED2:
BSF PORTB, RB1; SLÅ PÅ LED2
KALLA LONGDELAY; Ring en lång fördröjning
NOLLSTÄLL; Resultatet visas - Återställ program
LED3:
BSF PORTB, RB2; AKTIVERA LED3
KALLA LONGDELAY; Ring en lång fördröjning
NOLLSTÄLL; Resultatet visas - Återställ program
LED4:
BSF PORTB, RB3; AKTIVERA LED4
KALLA LONGDELAY; Ring en lång fördröjning
NOLLSTÄLL; Resultatet visas - Återställ program
LED5:
BSF PORTB, RB4; AKTIVERA LED5
KALLA LONGDELAY; Ring en lång fördröjning
NOLLSTÄLL; Resultatet visas - Återställ program
LED6:
BSF PORTB, RB5; AKTIVERA LED6
KALLA LONGDELAY; Ring en lång fördröjning
NOLLSTÄLL; Resultatet visas - Återställ program
LONGDELAY:
MOVLW 0X05; Flytta ett decimalvärde 10 in i WREG för referens
MOVWF GEN6; Lagra WREG värde i GEN6
LONGDELAY2:
KALLA LOOP1; Samtal fördröjning
DECFSZ GEN6; dekrement värde i GEN6, hoppa över om GEN6 = 0
GÅ TILL LONGDELAY2; Fördröjning tills värdet i GEN6 är noll
HEMKOMST. Returnera från subrutin
LOOP1:; fördröja loop sub rutin som fungerar med LOOP2 rutin. Ange värden, till 3 registrerar i loop1 (se Loop2)
MOVLW 0X00
MOVWF GEN1
MOVLW 0XFF
MOVWF GEN2
LOOP2:; Countdown värden från LOOP1 till 0
DECFSZ GEN1, 1
GÅ TILL LOOP2
DECFSZ GEN2, 1
GÅ TILL LOOP2
RETURNERA
LOOP3:; Alternativa dröjsmål timing subrutin
MOVLW 0X19
MOVWF GEN2
KALLA LOOP2
RETURNERA
RETURNERA
;******************************************************************************
; Slutet av program