From 1c50248c5821f1508aba1402d95844ed6f0464c8 Mon Sep 17 00:00:00 2001 From: Joseph Coffland Date: Tue, 28 Jun 2016 05:28:17 -0700 Subject: [PATCH] Added missing files, fixed switches interrupts --- src/pins.c | 31 +++++++++++++++++++++++++++++ src/pins.h | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/switch.c | 10 ++++++---- 3 files changed, 93 insertions(+), 4 deletions(-) create mode 100644 src/pins.c create mode 100644 src/pins.h diff --git a/src/pins.c b/src/pins.c new file mode 100644 index 0000000..99f8a55 --- /dev/null +++ b/src/pins.c @@ -0,0 +1,31 @@ +/******************************************************************************\ + + This file is part of the Buildbotics firmware. + + Copyright (c) 2015 - 2016 Buildbotics LLC + All rights reserved. + + This file ("the software") is free software: you can redistribute it + and/or modify it under the terms of the GNU General Public License, + version 2 as published by the Free Software Foundation. You should + have received a copy of the GNU General Public License, version 2 + along with the software. If not, see . + + The software is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the software. If not, see + . + + For information regarding this software email: + "Joseph Coffland" + +\******************************************************************************/ + +#include "pins.h" + + +PORT_t *pin_ports[] = {&PORTA, &PORTB, &PORTC, &PORTD, &PORTE, &PORTF}; diff --git a/src/pins.h b/src/pins.h new file mode 100644 index 0000000..14d29db --- /dev/null +++ b/src/pins.h @@ -0,0 +1,56 @@ +/******************************************************************************\ + + This file is part of the Buildbotics firmware. + + Copyright (c) 2015 - 2016 Buildbotics LLC + All rights reserved. + + This file ("the software") is free software: you can redistribute it + and/or modify it under the terms of the GNU General Public License, + version 2 as published by the Free Software Foundation. You should + have received a copy of the GNU General Public License, version 2 + along with the software. If not, see . + + The software is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the software. If not, see + . + + For information regarding this software email: + "Joseph Coffland" + +\******************************************************************************/ + +#pragma once + +#include + + +// Ports +enum { + PORT_A, + PORT_B, + PORT_C, + PORT_D, + PORT_E, + PORT_F, +}; + + +extern PORT_t *pin_ports[]; + + +#define PORT(PIN) pin_ports[PIN >> 3] +#define BM(PIN) (1 << (PIN & 7)) + +#define DIRSET_PIN(PIN) PORT(PIN)->DIRSET = BM(PIN) +#define DIRCLR_PIN(PIN) PORT(PIN)->DIRCLR = BM(PIN) +#define OUTCLR_PIN(PIN) PORT(PIN)->OUTCLR = BM(PIN) +#define OUTSET_PIN(PIN) PORT(PIN)->OUTSET = BM(PIN) +#define OUTTGL_PIN(PIN) PORT(PIN)->OUTTGL = BM(PIN) +#define IN_PIN(PIN) (!!(PORT(PIN)->IN & BM(PIN))) +#define PINCTRL_PIN(PIN) ((&PORT(PIN)->PIN0CTRL)[PIN & 7]) diff --git a/src/switch.c b/src/switch.c index ae60854..8e369b8 100644 --- a/src/switch.c +++ b/src/switch.c @@ -123,7 +123,7 @@ swSingleton_t sw = { .min = false, }, { // A min .type = SW_TYPE_NORMALLY_OPEN, - .mode = SW_MODE_HOMING, + .mode = SW_MODE_DISABLED, // SW_MODE_HOMING, .pin = MIN_A_PIN, .min = true, }, { // A max @@ -132,7 +132,7 @@ swSingleton_t sw = { .pin = MAX_A_PIN, .min = false, }, { // EStop - .type = SW_TYPE_NORMALLY_CLOSED, + .type = SW_TYPE_NORMALLY_OPEN, .mode = SW_ESTOP_BIT, .pin = ESTOP_PIN, }, { // Probe @@ -163,12 +163,15 @@ static void _switch_isr() { // reset deglitch count regardless of entry state s->count = -SW_DEGLITCH_TICKS; s->state = state; + PORT(s->pin)->INT0MASK &= ~BM(s->pin); // Disable INT0 } } // Switch interrupt handler vectors ISR(PORTA_INT0_vect) {_switch_isr();} +ISR(PORTB_INT0_vect) {_switch_isr();} +ISR(PORTC_INT0_vect) {_switch_isr();} ISR(PORTD_INT0_vect) {_switch_isr();} ISR(PORTE_INT0_vect) {_switch_isr();} ISR(PORTF_INT0_vect) {_switch_isr();} @@ -192,8 +195,6 @@ void _switch_enable(switch_t *s, bool enable) { void switch_init() { - return; // TODO - for (int i = 0; i < SWITCHES; i++) { switch_t *s = &sw.switches[i]; @@ -216,6 +217,7 @@ void switch_rtc_callback() { // state is either lockout or deglitching if (++s->count == SW_LOCKOUT_TICKS) { s->debounce = SW_IDLE; + PORT(s->pin)->INT0MASK |= BM(s->pin); // Enable INT0 // check if the state has changed while we were in lockout if (s->state != _read_state(s)) { -- 2.27.0