Code: workieworkie.c Select all
void iram_attr scan_semaphore(){
fast_command(FAST_ADC_START);
vTaskDelay(40 / portTICK_PERIOD_MS);
for(int i=0;i<17;i++){
read_adc_wchid();
vTaskDelay(40 / portTICK_PERIOD_MS);
};
}
Code: workieworkie.c Select all
void iram_attr scan_semaphore(){
fast_command(FAST_ADC_START);
vTaskDelay(40 / portTICK_PERIOD_MS);
for(int i=0;i<17;i++){
read_adc_wchid();
vTaskDelay(40 / portTICK_PERIOD_MS);
};
}
Code: come on work.c Select all
int32_t IRAM_ATTR read_adc_wchid(){
int32_t adc_reading = 0;
char adc_sign = 0x0;
char adc_channel = 0x0;
ets_printf("Semaphore Take\n");
xSemaphoreTake(irqSem, portMAX_DELAY);
ets_printf("Semaphore Taken\n");
//ets_printf("Semaphore Give\n");
//xSemaphoreGive(irqSem);
// ets_printf("Semaphore Given\n");
ets_printf("Reading\n");
read_from_register(REG_ADCDATA,4);
ets_printf("Read\n");
adc_sign = recvbuf[1] & 0b00001111;
adc_channel = recvbuf[1] & 0b11110000;
adc_channel = adc_channel >> 4;
if (MCP_MODEL == 3461 || MCP_MODEL == 3462 || MCP_MODEL == 3464){
adc_reading = recvbuf[3];
adc_reading = adc_reading<<8;
adc_reading = adc_reading | recvbuf[4];
if(adc_sign!=0x0){//In case of a negative value, convert to negative
adc_reading = -65536 + adc_reading;
}
}
else if (MCP_MODEL == 3561 || MCP_MODEL == 3562 || MCP_MODEL == 3564){
adc_reading = recvbuf[2];
adc_reading = adc_reading << 8;
adc_reading = adc_reading | recvbuf[3];
adc_reading = adc_reading << 8;
adc_reading = adc_reading | recvbuf[4];
if(adc_sign!=0x0){//In case of a negative value, convert to negative
adc_reading = -16777216 + adc_reading;
}
// if((adc_channel = 0b00001111)){
// offsetbits[0] = recvbuf[2];
// offsetbits[1] = recvbuf[3];
// offsetbits[2] = recvbuf[4];
// if ((adc_sign!=0x0)){
// offsetbits[0] = offsetbits[0] | 0b10000000;
// }
// else {
// offsetbits[0] <<= 1;
// offsetbits[0] >>= 1;
// }
// }
}
int adc_intch = adc_channel;
adc_results[adc_intch] = adc_reading;
ets_printf("Semaphore Give\n");
xSemaphoreGive(irqSem);
ets_printf("Semaphore Given\n");
//ets_printf("Semaphore Take\n");
//xSemaphoreTake(irqSem, portMAX_DELAY);
//ets_printf("Semaphore Taken\n");
return adc_reading;
}
static void IRAM_ATTR gpio_isr_handler(void* arg)
{
ets_printf("Interrupt Start\n");
BaseType_t mustYield=false;
xSemaphoreGiveFromISR(irqSem, &mustYield);
if (mustYield) portYIELD_FROM_ISR();
ets_printf("Interrupt Stop\n");
}
void config_interrupt(){
gpio_config_t io_conf;
io_conf.intr_type = GPIO_INTR_NEGEDGE;
io_conf.pin_bit_mask = 1<<GPIO_IRQ;
io_conf.mode = GPIO_MODE_INPUT;
io_conf.pull_down_en = 0;
io_conf.pull_up_en = 1;
irqSem=xSemaphoreCreateBinary();
gpio_config(&io_conf);
gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);
gpio_isr_handler_add(GPIO_IRQ, gpio_isr_handler, (void*) GPIO_IRQ);
gpio_intr_disable(GPIO_IRQ);
}
void IRAM_ATTR scan_semaphore(){
fast_command(FAST_ADC_START);//Send the read cmd
ets_printf("Interrupt Enable\n");
gpio_intr_enable(GPIO_IRQ);
ets_printf("Interrupt Enabled\n");
for(int i=0;i<17;i++){
ets_printf("Delay Start\n");
vTaskDelay(40 / portTICK_PERIOD_MS);
ets_printf("Delay End\n");
read_adc_wchid();
ets_printf("Read Loop\n");
};
ets_printf("Interrupt Disable\n");
gpio_intr_disable(GPIO_IRQ);
ets_printf("Interrupt Disabled\n");
}
void app_main(void)
{
init_adc(EXT_CLK);
enter_scan_mode();
read_scan_reg();
config_interrupt();
vTaskDelay(1000 / portTICK_PERIOD_MS);
while(1) {
scan_semaphore();
printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",adc_results[0],adc_results[1],adc_results[2],adc_results[3],adc_results[4],adc_results[5],adc_results[6],adc_results[7],adc_results[8],adc_results[9],adc_results[10],adc_results[11],adc_results[12],adc_results[13],adc_results[14],adc_results[15]);
}
Users browsing this forum: Google [Bot] and 19 guests