uC chip interface arduino  0.9.0
A interface for async and neuromrphic IC testing
Loading...
Searching...
No Matches
core_instruction_exec.cpp
Go to the documentation of this file.
1/*
2 This file is part of the Firmware project to interface with small Async or Neuromorphic chips
3 Copyright (C) 2022-2023 Ole Richter - University of Groningen
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <https://www.gnu.org/licenses/>.
17*/
19#include "uc_boards.h"
20#include <Arduino.h>
21//#include <avr/wdt.h>
22
23
24
25volatile bool exec_active = false;
26volatile IntervalTimer myTimer = IntervalTimer();
27
28void(* reset_uC) (void) = 0; // restart program (config reset/not hardware reset)
29
30void exec_instruction(packet_t* instruction, bool is_ISR_call) {
31 switch(instruction->data.header){
32 case IN_READ: send_output_ring_buffer(); break;
36 case IN_SET_TIME: set_time_offset(instruction->data.value); break;
37 case IN_READ_TIME: read_time(is_ISR_call); break;
38 case IN_PIN: set_pin(instruction->pin.id,instruction->pin.value); break;
39 case IN_PIN_READ: read_pin(instruction->pin.id); break;
40 case IN_SPI0: Interface_spi::send_packet(0,instruction->data.value); break;
41 case IN_SPI1: Interface_spi::send_packet(1,instruction->data.value); break;
42 case IN_SPI2: Interface_spi::send_packet(2,instruction->data.value); break;
43 case IN_I2C0: Interface_i2c::process_packet(0,instruction->data_i2c.component_address,instruction->data_i2c.register_address,instruction->data_i2c.value_ms,instruction->data_i2c.value_ls); break;
44 case IN_I2C1: Interface_i2c::process_packet(1,instruction->data_i2c.component_address,instruction->data_i2c.register_address,instruction->data_i2c.value_ms,instruction->data_i2c.value_ls); break;
45 case IN_I2C2: Interface_i2c::process_packet(2,instruction->data_i2c.component_address,instruction->data_i2c.register_address,instruction->data_i2c.value_ms,instruction->data_i2c.value_ls); break;
46 case IN_ASYNC_TO_CHIP0: AER_to_chip::send_packet(0,instruction->data.value, instruction->data.header); break;
47 case IN_ASYNC_TO_CHIP1: AER_to_chip::send_packet(1,instruction->data.value, instruction->data.header); break;
48 case IN_ASYNC_TO_CHIP2: AER_to_chip::send_packet(2,instruction->data.value, instruction->data.header); break;
49 case IN_ASYNC_TO_CHIP3: AER_to_chip::send_packet(3,instruction->data.value, instruction->data.header); break;
50 case IN_ASYNC_TO_CHIP4: AER_to_chip::send_packet(4,instruction->data.value, instruction->data.header); break;
51 case IN_ASYNC_TO_CHIP5: AER_to_chip::send_packet(5,instruction->data.value, instruction->data.header); break;
52 case IN_ASYNC_TO_CHIP6: AER_to_chip::send_packet(6,instruction->data.value, instruction->data.header); break;
53 case IN_ASYNC_TO_CHIP7: AER_to_chip::send_packet(7,instruction->data.value, instruction->data.header); break;
54 case IN_CONF_PIN: configure_pin(instruction->config.config_header,instruction->config.value); break;
55 case IN_CONF_SPI0: Interface_spi::configure(0,instruction->config.config_header,instruction->config.value); break;
56 case IN_CONF_SPI1: Interface_spi::configure(1,instruction->config.config_header,instruction->config.value); break;
57 case IN_CONF_SPI2: Interface_spi::configure(2,instruction->config.config_header,instruction->config.value); break;
58 case IN_CONF_I2C0: Interface_i2c::configure(0,instruction->config.config_header,instruction->config.value); break;
59 case IN_CONF_I2C1: Interface_i2c::configure(1,instruction->config.config_header,instruction->config.value); break;
60 case IN_CONF_I2C2: Interface_i2c::configure(2,instruction->config.config_header,instruction->config.value); break;
61 case IN_CONF_ASYNC_TO_CHIP0: AER_to_chip::configure(0,instruction->config.config_header,instruction->config.value); break;
62 case IN_CONF_ASYNC_TO_CHIP1: AER_to_chip::configure(1,instruction->config.config_header,instruction->config.value); break;
63 case IN_CONF_ASYNC_TO_CHIP2: AER_to_chip::configure(2,instruction->config.config_header,instruction->config.value); break;
64 case IN_CONF_ASYNC_TO_CHIP3: AER_to_chip::configure(3,instruction->config.config_header,instruction->config.value); break;
65 case IN_CONF_ASYNC_TO_CHIP4: AER_to_chip::configure(4,instruction->config.config_header,instruction->config.value); break;
66 case IN_CONF_ASYNC_TO_CHIP5: AER_to_chip::configure(5,instruction->config.config_header,instruction->config.value); break;
67 case IN_CONF_ASYNC_TO_CHIP6: AER_to_chip::configure(6,instruction->config.config_header,instruction->config.value); break;
68 case IN_CONF_ASYNC_TO_CHIP7: AER_to_chip::configure(7,instruction->config.config_header,instruction->config.value); break;
69 case IN_CONF_ASYNC_FROM_CHIP0: AER_from_chip::configure(0,instruction->config.config_header,instruction->config.value); break;
70 case IN_CONF_ASYNC_FROM_CHIP1: AER_from_chip::configure(1,instruction->config.config_header,instruction->config.value); break;
71 case IN_CONF_ASYNC_FROM_CHIP2: AER_from_chip::configure(2,instruction->config.config_header,instruction->config.value); break;
72 case IN_CONF_ASYNC_FROM_CHIP3: AER_from_chip::configure(3,instruction->config.config_header,instruction->config.value); break;
73 case IN_CONF_ASYNC_FROM_CHIP4: AER_from_chip::configure(4,instruction->config.config_header,instruction->config.value); break;
74 case IN_CONF_ASYNC_FROM_CHIP5: AER_from_chip::configure(5,instruction->config.config_header,instruction->config.value); break;
75 case IN_CONF_ASYNC_FROM_CHIP6: AER_from_chip::configure(6,instruction->config.config_header,instruction->config.value); break;
76 case IN_CONF_ASYNC_FROM_CHIP7: AER_from_chip::configure(7,instruction->config.config_header,instruction->config.value); break;
78 case IN_RESET://wdt_enable(WDTO_15MS);
79 reset_uC(); break;
81 default:
82 if (is_ISR_call) error_message(OUT_ERROR_UNKNOWN_INSTRUCTION,instruction->data.header,instruction->data.value);
84 break;
85 }
86}
87
89 noInterrupts();
90 uint8_t attempt = 0;
91 if (exec_active) return;
92 exec_active = true;
93 uint32_t current_time = micros() - offset_time; // time does not move forward in interupts
94
96
97 while (
99 instruction.data.exec_time <= current_time ) {
100 interrupts();
101 exec_instruction(&instruction,true);
102 noInterrupts();
105 }
106 exec_active = false;
107 interrupts();
108}
109
110void set_time_offset(uint32_t offset){
111 if (offset){
112 offset_time = micros() + offset;
114 //send confirmation
115 send_data32(IN_SET_TIME,offset,true);
116 }
117 else{
118 myTimer.end();
120 //send confirmation
121 send_data32(IN_SET_TIME,offset,true);
122 offset_time = 0;
123 }
124
125}
126
127void read_time(bool is_ISR_call){
128 send_data32(IN_READ_TIME,micros(),true);
129}
static void configure(uint8_t id, uint8_t config, uint8_t data)
static void send_packet(uint8_t id, uint32_t data, uint8_t header)
static void configure(uint8_t id, uint8_t config, uint8_t data)
static void configure(uint8_t id, uint8_t config, uint8_t data)
static void process_packet(uint8_t id, uint8_t device_address, uint8_t register_address, uint8_t data_ms, uint8_t data_ls)
static void send_packet(uint8_t id, uint32_t data)
static void configure(uint8_t id, uint8_t config_option, uint8_t data)
void exec_instruction(packet_t *instruction, bool is_ISR_call)
void exec_timed_commands()
volatile bool exec_active
void(* reset_uC)(void)=0
void read_time(bool is_ISR_call)
void set_time_offset(uint32_t offset)
volatile IntervalTimer myTimer
#define EXEC_PRESISION
void send_output_ring_buffer()
void set_read_on_request(uint8_t state)
volatile packet_t input_ring_buffer[INPUT_BUFFER_SIZE]
volatile unsigned long offset_time
void send_input_ring_buffer()
void send_output_ring_buffer_last(bool conf)
void error_message(uint8_t error_header, uint8_t source_header, uint32_t value, uint8_t sub_source_header)
volatile uint16_t input_ring_buffer_start
void send_data32(uint8_t header, uint32_t value, bool is_confirmation)
volatile uint16_t input_ring_buffer_next_free
void send_input_ring_buffer_free_spots()
void error_message_bypass_buffer(uint8_t error_header, uint8_t source_header, uint32_t value, uint8_t sub_source_header)
packet_t copy_packet(volatile packet_t *in)
Definition: datatypes.cpp:23
@ IN_READ_INSTRUCTIONS
Definition: datatypes.h:63
@ IN_ASYNC_TO_CHIP6
Definition: datatypes.h:179
@ IN_CONF_SPI2
Definition: datatypes.h:213
@ IN_ASYNC_TO_CHIP4
Definition: datatypes.h:167
@ IN_RESET
Definition: datatypes.h:371
@ IN_CONF_ASYNC_TO_CHIP2
Definition: datatypes.h:256
@ IN_PIN_READ
Definition: datatypes.h:89
@ IN_READ
Definition: datatypes.h:37
@ IN_ASYNC_TO_CHIP1
Definition: datatypes.h:149
@ IN_CONF_ASYNC_FROM_CHIP6
Definition: datatypes.h:340
@ IN_CONF_ASYNC_TO_CHIP0
Definition: datatypes.h:242
@ IN_PIN
Definition: datatypes.h:82
@ IN_ASYNC_TO_CHIP7
Definition: datatypes.h:185
@ IN_CONF_SPI1
Definition: datatypes.h:206
@ IN_I2C0
Definition: datatypes.h:119
@ IN_CONF_ASYNC_TO_CHIP5
Definition: datatypes.h:277
@ IN_ASYNC_TO_CHIP3
Definition: datatypes.h:161
@ IN_ASYNC_TO_CHIP0
Definition: datatypes.h:143
@ IN_CONF_ASYNC_TO_CHIP3
Definition: datatypes.h:263
@ IN_CONF_ASYNC_FROM_CHIP5
Definition: datatypes.h:333
@ IN_SPI1
Definition: datatypes.h:101
@ IN_CONF_ASYNC_FROM_CHIP2
Definition: datatypes.h:312
@ IN_CONF_ASYNC_FROM_CHIP0
Definition: datatypes.h:298
@ IN_CONF_ASYNC_FROM_CHIP3
Definition: datatypes.h:319
@ IN_SPI2
Definition: datatypes.h:107
@ IN_CONF_ASYNC_FROM_CHIP7
Definition: datatypes.h:347
@ IN_CONF_SPI0
Definition: datatypes.h:199
@ IN_CONF_READ_ON_REQUEST
Definition: datatypes.h:75
@ IN_READ_TIME
Definition: datatypes.h:57
@ IN_ASYNC_TO_CHIP5
Definition: datatypes.h:173
@ IN_CONF_I2C2
Definition: datatypes.h:235
@ IN_CONF_I2C0
Definition: datatypes.h:221
@ IN_CONF_ASYNC_TO_CHIP4
Definition: datatypes.h:270
@ IN_CONF_I2C1
Definition: datatypes.h:228
@ IN_I2C1
Definition: datatypes.h:128
@ IN_READ_LAST
Definition: datatypes.h:42
@ IN_CONF_ASYNC_TO_CHIP6
Definition: datatypes.h:284
@ IN_I2C2
Definition: datatypes.h:137
@ IN_CONF_ASYNC_TO_CHIP1
Definition: datatypes.h:249
@ IN_CONF_ASYNC_TO_CHIP7
Definition: datatypes.h:291
@ IN_CONF_PIN
Definition: datatypes.h:192
@ IN_ASYNC_TO_CHIP2
Definition: datatypes.h:155
@ IN_FREE_INSTRUCTION_SPOTS
Definition: datatypes.h:67
@ IN_CONF_ASYNC_FROM_CHIP1
Definition: datatypes.h:305
@ IN_SET_TIME
Definition: datatypes.h:51
@ IN_CONF_ASYNC_FROM_CHIP4
Definition: datatypes.h:326
@ IN_SPI0
Definition: datatypes.h:95
@ OUT_ERROR_UNKNOWN_INSTRUCTION
Definition: datatypes.h:552
@ OUT_ALIGN_SUCCESS_VERSION
Definition: datatypes.h:606
void read_pin(uint8_t id)
void set_pin(uint8_t id, uint32_t data)
void configure_pin(uint8_t instruction, uint8_t data)
uint8_t value
Definition: datatypes.h:762
uint8_t config_header
Definition: datatypes.h:761
uint8_t header
Definition: datatypes.h:726
uint32_t exec_time
Definition: datatypes.h:727
uint32_t value
Definition: datatypes.h:728
uint8_t register_address
Definition: datatypes.h:749
uint8_t value_ms
Definition: datatypes.h:750
uint8_t value_ls
Definition: datatypes.h:751
uint8_t component_address
Definition: datatypes.h:748
uint8_t id
Definition: datatypes.h:772
uint8_t value
Definition: datatypes.h:773
@ VERSION_MINOR
Definition: uc_boards.h:24
@ VERSION_PATCH
Definition: uc_boards.h:25
@ VERSION_MAJOR
Definition: uc_boards.h:23
#define INPUT_BUFFER_SIZE
Definition: uc_boards.h:107
config_t config
Definition: datatypes.h:796
data_i2c_t data_i2c
Definition: datatypes.h:795
data32_t data
Definition: datatypes.h:794
pin_t pin
Definition: datatypes.h:797