Sunday, April 2, 2017

Drum Multi Trigger

This program was written for a pic 12f683.  It attempts to read a voltage from input GPIO 4 and then repeats on GPIO 0-2.  The intention is for a drum trigger repeater.  One output could be used to trigger an analog drum shell sound, another could trigger a noise for a snare, etc.  This code is still buggy so use it with caution.  I am just putting it here so I can access it remotely.

 /*
 * File:   Drum Trigger Repeater
 * Author: Hans Mikelson
 *
 * Created on April 2, 2017, 1 PM
 * This program will read an input trigger voltage from for example
 * a piezo device and repeat it onto the outputs 0-2
 */

#if defined(__XC)
    #include <xc.h>         /* XC8 General Include File */
#elif defined(HI_TECH_C)
    #include <htc.h>        /* HiTech General Include File */
#endif

#include <stdint.h>        /* For uint8_t definition */
#include <stdbool.h>       /* For true/false definition */
#include <stdlib.h>     /*rand()*/

#pragma config MCLRE=OFF,CP=OFF,WDTE=OFF,FOSC=INTOSCIO
#define _XTAL_FREQ 4000000
uint8_t sGPIO;
int gi,gi1,gr1,gr2,gr3,gi3,gr0,gr4;

void init()
{
    //Configure GPIO Port
    //ANSEL =  0b00000000;  //Configure all GPIO pins as digital
    //TRISIO = 0b11001100;  //Set GP# 1=inputs and 0=outputs
    ANSEL =  0b00010000;  //Configure GPIO pins as digital, GP4 Analog
    TRISIO = 0b11011000;  //Set GP0,GP1,GP2,GP5 as outputs
    //Configuer AD Convertor
    ADCON0 = 0b10001101;  //AD Set up
    ADRESH = 0x00;        //Init the AD Register
    ADRESL = 0x00;
    OPTION_REGbits.nGPPU = 0;

    WPU = 0b00001000;     //Enable weak pullups=1
    //Configure Comparator
    CMCON0 = 0xFF;   // Comparator is turned off
    CMCON1 = 0x00;   // Comparator is turned off
    //Interrupt configuration
    INTCON = 0x00;   //Disable all interrupts
    //INTCONbits.INTF = 0;       // External interrupt on GP2 only
    //OPTION_REGbits.INTEDG = 0; // 1=rising edge, 0=falling
    //INTCONbits.INTE = 1;       // Enable external interrupt
    //INTCONbits.GIE = 1;        // Global interrupt enable
}

void vdelay(int n)
{
    int i;
    for (i=0;i<=n;i++)
    {
     __delay_us(100);
    }
}

int read_v()
// Read voltage from input
 {
    int val,v1,v2;
    ADCON0bits.GO=1;
    while(ADCON0bits.nDONE);
    v1 = ADRESH;
    v2 = ADRESL;
    val = (v1<<8) + v2;
    return val;
 }

uint8_t gtrig;

void main()
{
    //uint8_t i;
    int v1,v2,v3,v4,v5,va,i;

    init();
    while(1)
    {
        v1=read_v();
        v2=read_v();
        v3=read_v();
        v4=read_v();
        v5=read_v();
        va = (v1+v2+v3+v4+v5)/5;
        if (va>10)
        {
          GPIO = 0b00000111;
          for (i=0; i<va; i++);
        }
        GPIO = 0b00000000;
    }
}

No comments:

Post a Comment