Vibratie Sensor
Hier nog wat code voor de vibratie sensor.
Daar het contact moment van deze sensor wat kort is, kan het in een programma loop die ook nog wat andere dingen doet, makkelijk gemist worden.
Dit is opgelost door de sensor op een interrupt gevoelige poort aan te sluiten (PORTB.1 in dit geval).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | '**************************************************************** '* Name : Vibratie Sensor Test * '* Author : Knutselaar.eu * '* Notice : Copyright (c) 2014 Knutselaar.eu * '* : All Rights Reserved * '* * '* Versie : 1.0 02-Jan-2014 * '**************************************************************** Device 18F25K22 CONFIG_START FOSC = INTIO67 ;interne oscillator A6, A7 poortfuntie FCMEN = OFF ;Fail-Safe Clock Monitor disabled IESO = OFF ;internal external switchover mode PWRTEN = On ;power-up timer (18F25K22) BOREN = On ;brown-out reset BORV = 285 ;brown-out reset value (2,85V) (18F25K22) WDTEN = OFF ;watchdog timer WDTPS = 128 ;1:128 WDT prescalar PBADEN = OFF ;analog port B<4:0> STVREN = On ;;stack overflow reset LVP = OFF ;low voltage programming XINST = OFF ;Instruction set extension and Indexed Addressing mode disabled (Legacy mode) Debug = OFF ;no debug CONFIG_END XTAL = 16 '76543210 OSCCON = %01111100 ' 16 mhz,int osc ANSELA = 0 'all digital A true ANSELB = 0 'all digital B true TRISB = %00000011 'PORTB.0 en PORTB.1 als input ANSELC = 0 'all digital C true Dim test As Byte Dim sensorHit As Byte Symbol LED = LATA.5 Declare LCD_DATAUS 75 ;LCD timing voor wat oudere 16x2 44780 compatible displays (default = 50) Symbol IPEN = RCON.7 ' IPEN : Disable Interrupt PRIORITY HANDLING Symbol GIE = INTCON.7 ' GIE : enable interrupts Symbol INT1IE = INTCON3.3 ' PORTB.1 (INT1) interrupt enable bit Symbol INTEDG1 = INTCON2.5 ' Op (1) of neergaande (0) flank PORTB.1 interrupt select Symbol INT1IF = INTCON3.0 ' PORTB.1 (INT1) interrupt flag INTEDG1 = 0 ' INT1 interrupt op neergaande flank IPEN = 0 ' Interrupt priority uitzetten (PIC16F compatability mode) INT1IE = 1 ' PORTB.1 interrupts aanzetten INT1IF = 0 ' PORTB.1 Interrupt FLAG naar 0 GIE = 1 ' Interrupts activeren ON_HARDWARE_INTERRUPT GoTo INTERRUPT_HANDLER ' Waar heen te gaan bij interrupt. Clear Cls Print At 1,1, "knutselaar.eu" ' Standaard 2x16 44780 compatible display (zie schema) GoTo main_loop INTERRUPT_HANDLER: 'Verandering van PORTB.1 gedetecteerd Context SAVE ' Start interrupt (opslaan van het punt waar interrupt plaatsvond) If INT1IF = 1 Then 'Dit if statment kan weggelaten worden als PORTB.1 het enige interrupt punt is. Print At 2,1, "Sensor hit" sensorHit = 1 End If INT1IF = 0 'Clear the PORTB.1 Interrupt FLAG Context Restore ' Eind interrupt (teruggaan naar het punt waar Interrupt plaatsvond) main_loop: Toggle LED DelayMS 1000 If sensorHit = 1 Then DelayMS 500 sensorHit = 0 End If Print At 2,1, " " GoTo main_loop End |