From 27cbb939b2ad23b79d4d5ec3689807e166bbe592 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 31 Aug 2017 17:30:43 -0500 Subject: [PATCH] Clean up some HAL code --- Marlin/src/HAL/HAL_AVR/watchdog_AVR.cpp | 4 +- Marlin/src/HAL/HAL_AVR/watchdog_AVR.h | 4 +- Marlin/src/HAL/HAL_DUE/HAL_Due.cpp | 4 +- Marlin/src/HAL/HAL_DUE/HAL_timers_Due.cpp | 1 - Marlin/src/HAL/HAL_DUE/fastio_Due.h | 1 - Marlin/src/HAL/HAL_LPC1768/LPC1768_PWM.h | 4 +- Marlin/src/HAL/HAL_LPC1768/LPC1768_Servo.cpp | 130 +++++++++---------- Marlin/src/HAL/HAL_LPC1768/LPC1768_Servo.h | 57 ++++---- Marlin/src/HAL/HAL_pinsDebug.h | 27 ++-- Marlin/src/HAL/HAL_spi_pins.h | 2 +- Marlin/src/HAL/servo.h | 63 +++++---- Marlin/stepper.cpp | 7 +- 12 files changed, 140 insertions(+), 164 deletions(-) diff --git a/Marlin/src/HAL/HAL_AVR/watchdog_AVR.cpp b/Marlin/src/HAL/HAL_AVR/watchdog_AVR.cpp index 40d7bdf724..eb412ed252 100644 --- a/Marlin/src/HAL/HAL_AVR/watchdog_AVR.cpp +++ b/Marlin/src/HAL/HAL_AVR/watchdog_AVR.cpp @@ -22,12 +22,14 @@ #ifdef ARDUINO_ARCH_AVR -#include "../../../Marlin.h" +#include "../../../MarlinConfig.h" #if ENABLED(USE_WATCHDOG) #include "watchdog_AVR.h" +#include "../../../Marlin.h" + // Initialize watchdog with a 4 sec interrupt time void watchdog_init() { #if ENABLED(WATCHDOG_RESET_MANUAL) diff --git a/Marlin/src/HAL/HAL_AVR/watchdog_AVR.h b/Marlin/src/HAL/HAL_AVR/watchdog_AVR.h index e3572fe749..a66feebeca 100644 --- a/Marlin/src/HAL/HAL_AVR/watchdog_AVR.h +++ b/Marlin/src/HAL/HAL_AVR/watchdog_AVR.h @@ -23,8 +23,6 @@ #ifndef WATCHDOG_AVR_H #define WATCHDOG_AVR_H -//#include "../../../Marlin.h" - #include // Initialize watchdog with a 4 second interrupt time @@ -34,4 +32,4 @@ void watchdog_init(); // first watchdog_init or AVR will go into emergency procedures. inline void watchdog_reset() { wdt_reset(); } -#endif +#endif // WATCHDOG_AVR_H diff --git a/Marlin/src/HAL/HAL_DUE/HAL_Due.cpp b/Marlin/src/HAL/HAL_DUE/HAL_Due.cpp index 81a279b6db..078857ec0a 100644 --- a/Marlin/src/HAL/HAL_DUE/HAL_Due.cpp +++ b/Marlin/src/HAL/HAL_DUE/HAL_Due.cpp @@ -94,8 +94,8 @@ uint8_t HAL_get_reset_source (void) { } void _delay_ms(int delay_ms) { - //todo: port for Due? - delay (delay_ms); + // todo: port for Due? + delay(delay_ms); } extern "C" { diff --git a/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.cpp b/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.cpp index 0802624dec..dbeb285417 100644 --- a/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.cpp +++ b/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.cpp @@ -91,7 +91,6 @@ const tTimerConfig TimerConfig [NUM_HARDWARE_TIMERS] = { Timer_clock4: Prescaler 128 -> 656.25kHz */ - void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { Tc *tc = TimerConfig[timer_num].pTimerRegs; IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; diff --git a/Marlin/src/HAL/HAL_DUE/fastio_Due.h b/Marlin/src/HAL/HAL_DUE/fastio_Due.h index bc8c14880e..3d61da815c 100644 --- a/Marlin/src/HAL/HAL_DUE/fastio_Due.h +++ b/Marlin/src/HAL/HAL_DUE/fastio_Due.h @@ -431,5 +431,4 @@ pins #define DIO100_PIN 11 #define DIO100_WPORT PIOC - #endif // _FASTIO_DUE_H diff --git a/Marlin/src/HAL/HAL_LPC1768/LPC1768_PWM.h b/Marlin/src/HAL/HAL_LPC1768/LPC1768_PWM.h index d91b0710a9..ed02b9d330 100644 --- a/Marlin/src/HAL/HAL_LPC1768/LPC1768_PWM.h +++ b/Marlin/src/HAL/HAL_LPC1768/LPC1768_PWM.h @@ -21,7 +21,7 @@ */ /** - * The class Servo uses the PWM class to implement it's functions + * The class Servo uses the PWM class to implement its functions * * All PWMs use the same repetition rate - 20mS because that's the normal servo rate */ @@ -489,7 +489,7 @@ return; * writes to the LER register * sets the PWM_table_swap flag active * re-enables the ISR - * 7) On the next interrupt the ISR changes it's pointer to the work table which is now the old, + * 7) On the next interrupt the ISR changes its pointer to the work table which is now the old, * unmodified, active table. * 8) On the next MR0 interrupt the ISR: * switches over to the active table diff --git a/Marlin/src/HAL/HAL_LPC1768/LPC1768_Servo.cpp b/Marlin/src/HAL/HAL_LPC1768/LPC1768_Servo.cpp index a7765d24e4..f2a311e5a8 100644 --- a/Marlin/src/HAL/HAL_LPC1768/LPC1768_Servo.cpp +++ b/Marlin/src/HAL/HAL_LPC1768/LPC1768_Servo.cpp @@ -1,85 +1,79 @@ /** - * Marlin 3D Printer Firmware - * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * -*/ - -/** - * Based on servo.cpp - Interrupt driven Servo library for Arduino using 16 bit - * timers- Version 2 Copyright (c) 2009 Michael Margolis. All right reserved. -*/ - -/** - * A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. - * The servos are pulsed in the background using the value most recently written using the write() method - * - * Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached. - * Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four. - * - * The methods are: - * - * Servo - Class for manipulating servo motors connected to Arduino pins. - * - * attach(pin) - Attach a servo motor to an i/o pin. - * attach(pin, min, max) - Attach to a pin, setting min and max values in microseconds - * Default min is 544, max is 2400 - * - * write() - Set the servo angle in degrees. (Invalid angles —over MIN_PULSE_WIDTH— are treated as µs.) - * writeMicroseconds() - Set the servo pulse width in microseconds. - * move(pin, angle) - Sequence of attach(pin), write(angle), delay(SERVO_DELAY). - * With DEACTIVATE_SERVOS_AFTER_MOVE it detaches after SERVO_DELAY. - * read() - Get the last-written servo pulse width as an angle between 0 and 180. - * readMicroseconds() - Get the last-written servo pulse width in microseconds. - * attached() - Return true if a servo is attached. - * detach() - Stop an attached servo from pulsing its i/o pin. - * -*/ - -/** - * The only time that this library wants physical movement is when a WRITE - * command is issued. Before that all the attach & detach activity is solely - * within the data base. + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * - * The PWM output is inactive until the first WRITE. After that it stays active - * unless DEACTIVATE_SERVOS_AFTER_MOVE is enabled and a MOVE command was issued. + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * */ -#ifdef TARGET_LPC1768 +/** + * Based on servo.cpp - Interrupt driven Servo library for Arduino using 16 bit + * timers- Version 2 Copyright (c) 2009 Michael Margolis. All right reserved. + */ -#if HAS_SERVOS +/** + * A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. + * The servos are pulsed in the background using the value most recently written using the write() method + * + * Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached. + * Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four. + * + * The methods are: + * + * Servo - Class for manipulating servo motors connected to Arduino pins. + * + * attach(pin) - Attach a servo motor to an i/o pin. + * attach(pin, min, max) - Attach to a pin, setting min and max values in microseconds + * Default min is 544, max is 2400 + * + * write() - Set the servo angle in degrees. (Invalid angles —over MIN_PULSE_WIDTH— are treated as µs.) + * writeMicroseconds() - Set the servo pulse width in microseconds. + * move(pin, angle) - Sequence of attach(pin), write(angle), delay(SERVO_DELAY). + * With DEACTIVATE_SERVOS_AFTER_MOVE it detaches after SERVO_DELAY. + * read() - Get the last-written servo pulse width as an angle between 0 and 180. + * readMicroseconds() - Get the last-written servo pulse width in microseconds. + * attached() - Return true if a servo is attached. + * detach() - Stop an attached servo from pulsing its i/o pin. + * + */ +/** + * The only time that this library wants physical movement is when a WRITE + * command is issued. Before that all the attach & detach activity is solely + * within the data base. + * + * The PWM output is inactive until the first WRITE. After that it stays active + * unless DEACTIVATE_SERVOS_AFTER_MOVE is enabled and a MOVE command was issued. + */ -#include "LPC1768_Servo.h" -#include "servo_private.h" +#include "../../../MarlinConfig.h" +#if HAS_SERVOS && defined(TARGET_LPC1768) + + #include "LPC1768_Servo.h" + #include "servo_private.h" extern bool LPC1768_PWM_attach_pin(uint8_t, uint32_t, uint32_t, uint8_t); extern bool LPC1768_PWM_write(uint8_t, uint32_t); extern bool LPC1768_PWM_detach_pin(uint8_t); - - ServoInfo_t servo_info[MAX_SERVOS]; // static array of servo info structures uint8_t ServoCount = 0; // the total number of attached servos - #define US_TO_PULSE_WIDTH(p) p #define PULSE_WIDTH_TO_US(p) p #define TRIM_DURATION 0 @@ -107,7 +101,6 @@ // greater than zero. This way the init routine can // assign the pin and the MOVE command only needs the value. - this->min = MIN_PULSE_WIDTH; //resolution of min/max is 1 uS this->max = MAX_PULSE_WIDTH; @@ -165,7 +158,4 @@ } } -#endif // HAS_SERVOS - -#endif // TARGET_LPC1768 - +#endif // HAS_SERVOS && TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/LPC1768_Servo.h b/Marlin/src/HAL/HAL_LPC1768/LPC1768_Servo.h index 8162e75bc5..7cbd97826c 100644 --- a/Marlin/src/HAL/HAL_LPC1768/LPC1768_Servo.h +++ b/Marlin/src/HAL/HAL_LPC1768/LPC1768_Servo.h @@ -21,7 +21,7 @@ */ /** - * The class Servo uses the PWM class to implement it's functions + * The class Servo uses the PWM class to implement its functions * * The PWM1 module is only used to generate interrups at specified times. It * is NOT used to directly toggle pins. The ISR writes to the pin assigned to @@ -31,39 +31,32 @@ * */ -#ifndef LPC1768_SERVO_h - #define LPC1768_SERVO_h +#ifndef LPC1768_SERVO_H +#define LPC1768_SERVO_H - #ifdef TARGET_LPC1768 - #include +#include +class Servo { + public: + Servo(); + int8_t attach(int pin); // attach the given pin to the next free channel, set pinMode, return channel number (-1 on fail) + int8_t attach(int pin, int min, int max); // as above but also sets min and max values for writes. + void detach(); + void write(int value); // if value is < 200 it is treated as an angle, otherwise as pulse width in microseconds + void writeMicroseconds(int value); // write pulse width in microseconds + void move(int value); // attach the servo, then move to value + // if value is < 200 it is treated as an angle, otherwise as pulse width in microseconds + // if DEACTIVATE_SERVOS_AFTER_MOVE wait SERVO_DELAY, then detach + int read(); // returns current pulse width as an angle between 0 and 180 degrees + int readMicroseconds(); // returns current pulse width in microseconds for this servo (was read_us() in first release) + bool attached(); // return true if this servo is attached, otherwise false - class Servo { - public: - Servo(); - int8_t attach(int pin); // attach the given pin to the next free channel, set pinMode, return channel number (-1 on fail) - int8_t attach(int pin, int min, int max); // as above but also sets min and max values for writes. - void detach(); - void write(int value); // if value is < 200 it is treated as an angle, otherwise as pulse width in microseconds - void writeMicroseconds(int value); // write pulse width in microseconds - void move(int value); // attach the servo, then move to value - // if value is < 200 it is treated as an angle, otherwise as pulse width in microseconds - // if DEACTIVATE_SERVOS_AFTER_MOVE wait SERVO_DELAY, then detach - int read(); // returns current pulse width as an angle between 0 and 180 degrees - int readMicroseconds(); // returns current pulse width in microseconds for this servo (was read_us() in first release) - bool attached(); // return true if this servo is attached, otherwise false - - private: - uint8_t servoIndex; // index into the channel data for this servo - int min; - int max; - }; - - - #define HAL_SERVO_LIB Servo - - #endif -#endif - + private: + uint8_t servoIndex; // index into the channel data for this servo + int min; + int max; +}; +#define HAL_SERVO_LIB Servo +#endif // LPC1768_SERVO_H diff --git a/Marlin/src/HAL/HAL_pinsDebug.h b/Marlin/src/HAL/HAL_pinsDebug.h index de802d48ce..0f28b34d5f 100644 --- a/Marlin/src/HAL/HAL_pinsDebug.h +++ b/Marlin/src/HAL/HAL_pinsDebug.h @@ -21,19 +21,18 @@ */ #ifndef HAL_PINSDEBUG_H +#define HAL_PINSDEBUG_H -#if defined(PINS_DEBUGGING) - #ifdef ARDUINO_ARCH_AVR - #include "HAL_AVR/pinsDebug_AVR_8_bit.h" - #elif defined(ARDUINO_ARCH_SAM) - #include "HAL_DUE/HAL_pinsDebug_Due.h" - #elif IS_32BIT_TEENSY - #include "HAL_TEENSY35_36/HAL_pinsDebug_Teensy.h" - #elif defined(TARGET_LPC1768) - #include "HAL_LPC1768/pinsDebug_Re_ARM.h" - #else - #error Unsupported Platform! - #endif -#endif - +#ifdef ARDUINO_ARCH_AVR + #include "HAL_AVR/pinsDebug_AVR_8_bit.h" +#elif defined(ARDUINO_ARCH_SAM) + #include "HAL_DUE/HAL_pinsDebug_Due.h" +#elif IS_32BIT_TEENSY + #include "HAL_TEENSY35_36/HAL_pinsDebug_Teensy.h" +#elif defined(TARGET_LPC1768) + #include "HAL_LPC1768/pinsDebug_Re_ARM.h" +#else + #error Unsupported Platform! #endif + +#endif // HAL_PINSDEBUG_H diff --git a/Marlin/src/HAL/HAL_spi_pins.h b/Marlin/src/HAL/HAL_spi_pins.h index 05915d839a..4d4c27d070 100644 --- a/Marlin/src/HAL/HAL_spi_pins.h +++ b/Marlin/src/HAL/HAL_spi_pins.h @@ -41,4 +41,4 @@ #error "Unsupported Platform!" #endif -#endif /* HAL_SPI_PINS_H_ */ +#endif // HAL_SPI_PINS_H_ diff --git a/Marlin/src/HAL/servo.h b/Marlin/src/HAL/servo.h index d189aaa096..efbe90071a 100644 --- a/Marlin/src/HAL/servo.h +++ b/Marlin/src/HAL/servo.h @@ -66,48 +66,47 @@ With DEACTIVATE_SERVOS_AFTER_MOVE wait SERVO_DELAY and detach. */ -#ifndef servo_h -#define servo_h +#ifndef SERVO_H +#define SERVO_H #if IS_32BIT_TEENSY #include "HAL_TEENSY35_36/HAL_Servo_Teensy.h" // Teensy HAL uses an inherited library #elif defined(TARGET_LPC1768) - #include "HAL_LPC1768/LPC1768_Servo.cpp" + #include "HAL_LPC1768/LPC1768_Servo.h" #else + #include -#include + #if defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_SAM) + // we're good to go + #else + #error "This library only supports boards with an AVR or SAM3X processor." + #endif -#if defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_SAM) - // we're good to go -#else - #error "This library only supports boards with an AVR or SAM3X processor." -#endif + #define Servo_VERSION 2 // software version of this library -#define Servo_VERSION 2 // software version of this library + class Servo { + public: + Servo(); + int8_t attach(int pin); // attach the given pin to the next free channel, set pinMode, return channel number (-1 on fail) + int8_t attach(int pin, int min, int max); // as above but also sets min and max values for writes. + void detach(); + void write(int value); // if value is < 200 it is treated as an angle, otherwise as pulse width in microseconds + void writeMicroseconds(int value); // write pulse width in microseconds + void move(int value); // attach the servo, then move to value + // if value is < 200 it is treated as an angle, otherwise as pulse width in microseconds + // if DEACTIVATE_SERVOS_AFTER_MOVE wait SERVO_DELAY, then detach + int read(); // returns current pulse width as an angle between 0 and 180 degrees + int readMicroseconds(); // returns current pulse width in microseconds for this servo (was read_us() in first release) + bool attached(); // return true if this servo is attached, otherwise false -class Servo { - public: - Servo(); - int8_t attach(int pin); // attach the given pin to the next free channel, set pinMode, return channel number (-1 on fail) - int8_t attach(int pin, int min, int max); // as above but also sets min and max values for writes. - void detach(); - void write(int value); // if value is < 200 it is treated as an angle, otherwise as pulse width in microseconds - void writeMicroseconds(int value); // write pulse width in microseconds - void move(int value); // attach the servo, then move to value - // if value is < 200 it is treated as an angle, otherwise as pulse width in microseconds - // if DEACTIVATE_SERVOS_AFTER_MOVE wait SERVO_DELAY, then detach - int read(); // returns current pulse width as an angle between 0 and 180 degrees - int readMicroseconds(); // returns current pulse width in microseconds for this servo (was read_us() in first release) - bool attached(); // return true if this servo is attached, otherwise false - - private: - uint8_t servoIndex; // index into the channel data for this servo - int8_t min; // minimum is this value times 4 added to MIN_PULSE_WIDTH - int8_t max; // maximum is this value times 4 added to MAX_PULSE_WIDTH -}; - -#endif // !TEENSY + private: + uint8_t servoIndex; // index into the channel data for this servo + int8_t min; // minimum is this value times 4 added to MIN_PULSE_WIDTH + int8_t max; // maximum is this value times 4 added to MAX_PULSE_WIDTH + }; #endif + +#endif // SERVO_H diff --git a/Marlin/stepper.cpp b/Marlin/stepper.cpp index 8b12dbc842..f982db4a32 100644 --- a/Marlin/stepper.cpp +++ b/Marlin/stepper.cpp @@ -355,11 +355,8 @@ void Stepper::isr() { } _NEXT_ISR(ocr_val); - #ifdef CPU_32_BIT - //todo: HAL? - #else - NOLESS(OCR1A, TCNT1 + 16); - #endif + + NOLESS(OCR1A, TCNT1 + 16); HAL_ENABLE_ISRs(); // re-enable ISRs return;