Merge branch 'MK3' into MK3_3.9.3
This commit is contained in:
commit
0ed6b537a8
@ -62,6 +62,11 @@
|
|||||||
// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu)
|
// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu)
|
||||||
#define FAN_KICKSTART_TIME 800
|
#define FAN_KICKSTART_TIME 800
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Auto-report temperatures with M155 S<seconds>
|
||||||
|
*/
|
||||||
|
#define AUTO_REPORT_TEMPERATURES
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -376,6 +381,11 @@ const unsigned int dropsegments=5; //everything with less than this number of st
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Include capabilities in M115 output
|
||||||
|
*/
|
||||||
|
#define EXTENDED_CAPABILITIES_REPORT
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//============================= Define Defines ============================
|
//============================= Define Defines ============================
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#ifndef MARLIN_H
|
#ifndef MARLIN_H
|
||||||
#define MARLIN_H
|
#define MARLIN_H
|
||||||
|
|
||||||
#define FORCE_INLINE __attribute__((always_inline)) inline
|
#include "macros.h"
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -116,7 +116,6 @@ void serial_echopair_P(const char *s_P, unsigned long v);
|
|||||||
void serialprintPGM(const char *str);
|
void serialprintPGM(const char *str);
|
||||||
|
|
||||||
bool is_buffer_empty();
|
bool is_buffer_empty();
|
||||||
void get_command();
|
|
||||||
void process_commands();
|
void process_commands();
|
||||||
void ramming();
|
void ramming();
|
||||||
|
|
||||||
@ -241,23 +240,12 @@ void Stop();
|
|||||||
bool IsStopped();
|
bool IsStopped();
|
||||||
void finishAndDisableSteppers();
|
void finishAndDisableSteppers();
|
||||||
|
|
||||||
//put an ASCII command at the end of the current buffer.
|
|
||||||
void enquecommand(const char *cmd, bool from_progmem = false);
|
|
||||||
|
|
||||||
//put an ASCII command at the end of the current buffer, read from flash
|
//put an ASCII command at the end of the current buffer, read from flash
|
||||||
#define enquecommand_P(cmd) enquecommand(cmd, true)
|
#define enquecommand_P(cmd) enquecommand(cmd, true)
|
||||||
|
|
||||||
//put an ASCII command at the begin of the current buffer
|
|
||||||
void enquecommand_front(const char *cmd, bool from_progmem = false);
|
|
||||||
|
|
||||||
//put an ASCII command at the begin of the current buffer, read from flash
|
//put an ASCII command at the begin of the current buffer, read from flash
|
||||||
#define enquecommand_front_P(cmd) enquecommand_front(cmd, true)
|
#define enquecommand_front_P(cmd) enquecommand_front(cmd, true)
|
||||||
|
|
||||||
void repeatcommand_front();
|
|
||||||
|
|
||||||
// Remove all lines from the command queue.
|
|
||||||
void cmdqueue_reset();
|
|
||||||
|
|
||||||
void prepare_arc_move(char isclockwise);
|
void prepare_arc_move(char isclockwise);
|
||||||
void clamp_to_software_endstops(float target[3]);
|
void clamp_to_software_endstops(float target[3]);
|
||||||
void refresh_cmd_timeout(void);
|
void refresh_cmd_timeout(void);
|
||||||
@ -287,11 +275,6 @@ FORCE_INLINE unsigned long millis_nc() {
|
|||||||
void setPwmFrequency(uint8_t pin, int val);
|
void setPwmFrequency(uint8_t pin, int val);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef CRITICAL_SECTION_START
|
|
||||||
#define CRITICAL_SECTION_START unsigned char _sreg = SREG; cli();
|
|
||||||
#define CRITICAL_SECTION_END SREG = _sreg;
|
|
||||||
#endif //CRITICAL_SECTION_START
|
|
||||||
|
|
||||||
extern bool fans_check_enabled;
|
extern bool fans_check_enabled;
|
||||||
extern float homing_feedrate[];
|
extern float homing_feedrate[];
|
||||||
extern uint8_t axis_relative_modes;
|
extern uint8_t axis_relative_modes;
|
||||||
|
@ -48,6 +48,8 @@
|
|||||||
#include "Marlin.h"
|
#include "Marlin.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "macros.h"
|
||||||
|
|
||||||
#ifdef ENABLE_AUTO_BED_LEVELING
|
#ifdef ENABLE_AUTO_BED_LEVELING
|
||||||
#include "vector_3.h"
|
#include "vector_3.h"
|
||||||
#ifdef AUTO_BED_LEVELING_GRID
|
#ifdef AUTO_BED_LEVELING_GRID
|
||||||
@ -137,12 +139,6 @@
|
|||||||
#include "sound.h"
|
#include "sound.h"
|
||||||
|
|
||||||
#include "cmdqueue.h"
|
#include "cmdqueue.h"
|
||||||
#include "io_atmega2560.h"
|
|
||||||
|
|
||||||
// Macros for bit masks
|
|
||||||
#define BIT(b) (1<<(b))
|
|
||||||
#define TEST(n,b) (((n)&BIT(b))!=0)
|
|
||||||
#define SET_BIT(n,b,value) (n) ^= ((-value)^(n)) & (BIT(b))
|
|
||||||
|
|
||||||
//Macro for print fan speed
|
//Macro for print fan speed
|
||||||
#define FAN_PULSE_WIDTH_LIMIT ((fanSpeed > 100) ? 3 : 4) //time in ms
|
#define FAN_PULSE_WIDTH_LIMIT ((fanSpeed > 100) ? 3 : 4) //time in ms
|
||||||
@ -393,6 +389,11 @@ static int saved_fanSpeed = 0; //!< Print fan speed
|
|||||||
|
|
||||||
static int saved_feedmultiply_mm = 100;
|
static int saved_feedmultiply_mm = 100;
|
||||||
|
|
||||||
|
#ifdef AUTO_REPORT_TEMPERATURES
|
||||||
|
static LongTimer auto_report_temp_timer;
|
||||||
|
static uint8_t auto_report_temp_period = 0;
|
||||||
|
#endif //AUTO_REPORT_TEMPERATURES
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//=============================Routines======================================
|
//=============================Routines======================================
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
@ -402,6 +403,7 @@ static bool setTargetedHotend(int code, uint8_t &extruder);
|
|||||||
static void print_time_remaining_init();
|
static void print_time_remaining_init();
|
||||||
static void wait_for_heater(long codenum, uint8_t extruder);
|
static void wait_for_heater(long codenum, uint8_t extruder);
|
||||||
static void gcode_G28(bool home_x_axis, bool home_y_axis, bool home_z_axis);
|
static void gcode_G28(bool home_x_axis, bool home_y_axis, bool home_z_axis);
|
||||||
|
static void gcode_M105(uint8_t extruder);
|
||||||
static void temp_compensation_start();
|
static void temp_compensation_start();
|
||||||
static void temp_compensation_apply();
|
static void temp_compensation_apply();
|
||||||
|
|
||||||
@ -629,7 +631,7 @@ void crashdet_cancel()
|
|||||||
lcd_print_stop();
|
lcd_print_stop();
|
||||||
}else if(saved_printing_type == PRINTING_TYPE_USB){
|
}else if(saved_printing_type == PRINTING_TYPE_USB){
|
||||||
SERIAL_ECHOLNRPGM(MSG_OCTOPRINT_CANCEL); //for Octoprint: works the same as clicking "Abort" button in Octoprint GUI
|
SERIAL_ECHOLNRPGM(MSG_OCTOPRINT_CANCEL); //for Octoprint: works the same as clicking "Abort" button in Octoprint GUI
|
||||||
SERIAL_PROTOCOLLNRPGM(MSG_OK);
|
cmdqueue_reset();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -879,7 +881,7 @@ static void check_if_fw_is_on_right_printer(){
|
|||||||
|
|
||||||
#ifdef PAT9125
|
#ifdef PAT9125
|
||||||
//will return 1 only if IR can detect filament in bondtech extruder so this may fail even when we have IR sensor
|
//will return 1 only if IR can detect filament in bondtech extruder so this may fail even when we have IR sensor
|
||||||
const uint8_t ir_detected = !(PIN_GET(IR_SENSOR_PIN));
|
const uint8_t ir_detected = !READ(IR_SENSOR_PIN);
|
||||||
if (ir_detected){
|
if (ir_detected){
|
||||||
lcd_show_fullscreen_message_and_wait_P(_i("MK3 firmware detected on MK3S printer"));}////c=20 r=3
|
lcd_show_fullscreen_message_and_wait_P(_i("MK3 firmware detected on MK3S printer"));}////c=20 r=3
|
||||||
#endif //PAT9125
|
#endif //PAT9125
|
||||||
@ -1727,6 +1729,18 @@ void host_keepalive() {
|
|||||||
#endif //HOST_KEEPALIVE_FEATURE
|
#endif //HOST_KEEPALIVE_FEATURE
|
||||||
if (farm_mode) return;
|
if (farm_mode) return;
|
||||||
long ms = _millis();
|
long ms = _millis();
|
||||||
|
|
||||||
|
#ifdef AUTO_REPORT_TEMPERATURES
|
||||||
|
if (auto_report_temp_timer.running())
|
||||||
|
{
|
||||||
|
if (auto_report_temp_timer.expired(auto_report_temp_period * 1000ul))
|
||||||
|
{
|
||||||
|
gcode_M105(active_extruder);
|
||||||
|
auto_report_temp_timer.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif //AUTO_REPORT_TEMPERATURES
|
||||||
|
|
||||||
if (host_keepalive_interval && busy_state != NOT_BUSY) {
|
if (host_keepalive_interval && busy_state != NOT_BUSY) {
|
||||||
if ((ms - prev_busy_signal_ms) < (long)(1000L * host_keepalive_interval)) return;
|
if ((ms - prev_busy_signal_ms) < (long)(1000L * host_keepalive_interval)) return;
|
||||||
switch (busy_state) {
|
switch (busy_state) {
|
||||||
@ -2530,6 +2544,95 @@ void force_high_power_mode(bool start_high_power_section) {
|
|||||||
}
|
}
|
||||||
#endif //TMC2130
|
#endif //TMC2130
|
||||||
|
|
||||||
|
void gcode_M105(uint8_t extruder)
|
||||||
|
{
|
||||||
|
#if defined(TEMP_0_PIN) && TEMP_0_PIN > -1
|
||||||
|
SERIAL_PROTOCOLPGM("T:");
|
||||||
|
SERIAL_PROTOCOL_F(degHotend(extruder),1);
|
||||||
|
SERIAL_PROTOCOLPGM(" /");
|
||||||
|
SERIAL_PROTOCOL_F(degTargetHotend(extruder),1);
|
||||||
|
#if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1
|
||||||
|
SERIAL_PROTOCOLPGM(" B:");
|
||||||
|
SERIAL_PROTOCOL_F(degBed(),1);
|
||||||
|
SERIAL_PROTOCOLPGM(" /");
|
||||||
|
SERIAL_PROTOCOL_F(degTargetBed(),1);
|
||||||
|
#endif //TEMP_BED_PIN
|
||||||
|
for (int8_t cur_extruder = 0; cur_extruder < EXTRUDERS; ++cur_extruder) {
|
||||||
|
SERIAL_PROTOCOLPGM(" T");
|
||||||
|
SERIAL_PROTOCOL(cur_extruder);
|
||||||
|
SERIAL_PROTOCOL(':');
|
||||||
|
SERIAL_PROTOCOL_F(degHotend(cur_extruder),1);
|
||||||
|
SERIAL_PROTOCOLPGM(" /");
|
||||||
|
SERIAL_PROTOCOL_F(degTargetHotend(cur_extruder),1);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
SERIAL_ERROR_START;
|
||||||
|
SERIAL_ERRORLNRPGM(_i("No thermistors - no temperature"));////MSG_ERR_NO_THERMISTORS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
SERIAL_PROTOCOLPGM(" @:");
|
||||||
|
#ifdef EXTRUDER_WATTS
|
||||||
|
SERIAL_PROTOCOL((EXTRUDER_WATTS * getHeaterPower(tmp_extruder))/127);
|
||||||
|
SERIAL_PROTOCOLPGM("W");
|
||||||
|
#else
|
||||||
|
SERIAL_PROTOCOL(getHeaterPower(extruder));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
SERIAL_PROTOCOLPGM(" B@:");
|
||||||
|
#ifdef BED_WATTS
|
||||||
|
SERIAL_PROTOCOL((BED_WATTS * getHeaterPower(-1))/127);
|
||||||
|
SERIAL_PROTOCOLPGM("W");
|
||||||
|
#else
|
||||||
|
SERIAL_PROTOCOL(getHeaterPower(-1));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef PINDA_THERMISTOR
|
||||||
|
SERIAL_PROTOCOLPGM(" P:");
|
||||||
|
SERIAL_PROTOCOL_F(current_temperature_pinda,1);
|
||||||
|
#endif //PINDA_THERMISTOR
|
||||||
|
|
||||||
|
#ifdef AMBIENT_THERMISTOR
|
||||||
|
SERIAL_PROTOCOLPGM(" A:");
|
||||||
|
SERIAL_PROTOCOL_F(current_temperature_ambient,1);
|
||||||
|
#endif //AMBIENT_THERMISTOR
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef SHOW_TEMP_ADC_VALUES
|
||||||
|
{
|
||||||
|
float raw = 0.0;
|
||||||
|
#if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1
|
||||||
|
SERIAL_PROTOCOLPGM(" ADC B:");
|
||||||
|
SERIAL_PROTOCOL_F(degBed(),1);
|
||||||
|
SERIAL_PROTOCOLPGM("C->");
|
||||||
|
raw = rawBedTemp();
|
||||||
|
SERIAL_PROTOCOL_F(raw/OVERSAMPLENR,5);
|
||||||
|
SERIAL_PROTOCOLPGM(" Rb->");
|
||||||
|
SERIAL_PROTOCOL_F(100 * (1 + (PtA * (raw/OVERSAMPLENR)) + (PtB * sq((raw/OVERSAMPLENR)))), 5);
|
||||||
|
SERIAL_PROTOCOLPGM(" Rxb->");
|
||||||
|
SERIAL_PROTOCOL_F(raw, 5);
|
||||||
|
#endif
|
||||||
|
for (int8_t cur_extruder = 0; cur_extruder < EXTRUDERS; ++cur_extruder) {
|
||||||
|
SERIAL_PROTOCOLPGM(" T");
|
||||||
|
SERIAL_PROTOCOL(cur_extruder);
|
||||||
|
SERIAL_PROTOCOLPGM(":");
|
||||||
|
SERIAL_PROTOCOL_F(degHotend(cur_extruder),1);
|
||||||
|
SERIAL_PROTOCOLPGM("C->");
|
||||||
|
raw = rawHotendTemp(cur_extruder);
|
||||||
|
SERIAL_PROTOCOL_F(raw/OVERSAMPLENR,5);
|
||||||
|
SERIAL_PROTOCOLPGM(" Rt");
|
||||||
|
SERIAL_PROTOCOL(cur_extruder);
|
||||||
|
SERIAL_PROTOCOLPGM("->");
|
||||||
|
SERIAL_PROTOCOL_F(100 * (1 + (PtA * (raw/OVERSAMPLENR)) + (PtB * sq((raw/OVERSAMPLENR)))), 5);
|
||||||
|
SERIAL_PROTOCOLPGM(" Rx");
|
||||||
|
SERIAL_PROTOCOL(cur_extruder);
|
||||||
|
SERIAL_PROTOCOLPGM("->");
|
||||||
|
SERIAL_PROTOCOL_F(raw, 5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
SERIAL_PROTOCOLLN("");
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef TMC2130
|
#ifdef TMC2130
|
||||||
static void gcode_G28(bool home_x_axis, long home_x_value, bool home_y_axis, long home_y_value, bool home_z_axis, long home_z_value, bool calib, bool without_mbl)
|
static void gcode_G28(bool home_x_axis, long home_x_value, bool home_y_axis, long home_y_value, bool home_z_axis, long home_z_value, bool calib, bool without_mbl)
|
||||||
#else
|
#else
|
||||||
@ -3293,37 +3396,24 @@ void gcode_M701()
|
|||||||
*/
|
*/
|
||||||
static void gcode_PRUSA_SN()
|
static void gcode_PRUSA_SN()
|
||||||
{
|
{
|
||||||
if (farm_mode) {
|
uint8_t selectedSerialPort_bak = selectedSerialPort;
|
||||||
|
char SN[20];
|
||||||
selectedSerialPort = 0;
|
selectedSerialPort = 0;
|
||||||
putchar(';');
|
SERIAL_ECHOLNRPGM(PSTR(";S"));
|
||||||
putchar('S');
|
uint8_t numbersRead = 0;
|
||||||
int numbersRead = 0;
|
|
||||||
ShortTimer timeout;
|
ShortTimer timeout;
|
||||||
timeout.start();
|
timeout.start();
|
||||||
|
|
||||||
while (numbersRead < 19) {
|
while (numbersRead < (sizeof(SN) - 1)) {
|
||||||
while (MSerial.available() > 0) {
|
if (MSerial.available() > 0) {
|
||||||
uint8_t serial_char = MSerial.read();
|
SN[numbersRead] = MSerial.read();
|
||||||
selectedSerialPort = 1;
|
|
||||||
putchar(serial_char);
|
|
||||||
numbersRead++;
|
numbersRead++;
|
||||||
selectedSerialPort = 0;
|
|
||||||
}
|
}
|
||||||
if (timeout.expired(100u)) break;
|
if (timeout.expired(100u)) break;
|
||||||
}
|
}
|
||||||
selectedSerialPort = 1;
|
SN[numbersRead] = 0;
|
||||||
putchar('\n');
|
selectedSerialPort = selectedSerialPort_bak;
|
||||||
#if 0
|
SERIAL_ECHOLN(SN);
|
||||||
for (int b = 0; b < 3; b++) {
|
|
||||||
_tone(BEEPER, 110);
|
|
||||||
_delay(50);
|
|
||||||
_noTone(BEEPER);
|
|
||||||
_delay(50);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
puts_P(_N("Not in farm mode."));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
//! Detection of faulty RAMBo 1.1b boards equipped with bigger capacitors
|
//! Detection of faulty RAMBo 1.1b boards equipped with bigger capacitors
|
||||||
//! at the TACH_1 pin, which causes bad detection of print fan speed.
|
//! at the TACH_1 pin, which causes bad detection of print fan speed.
|
||||||
@ -3417,6 +3507,18 @@ static void gcode_G92()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef EXTENDED_CAPABILITIES_REPORT
|
||||||
|
|
||||||
|
static void cap_line(const char* name, bool ena = false) {
|
||||||
|
printf_P(PSTR("Cap:%S:%c\n"), name, (char)ena + '0');
|
||||||
|
}
|
||||||
|
|
||||||
|
static void extended_capabilities_report()
|
||||||
|
{
|
||||||
|
cap_line(PSTR("AUTOREPORT_TEMP"), ENABLED(AUTO_REPORT_TEMPERATURES));
|
||||||
|
//@todo
|
||||||
|
}
|
||||||
|
#endif //EXTENDED_CAPABILITIES_REPORT
|
||||||
|
|
||||||
#ifdef BACKLASH_X
|
#ifdef BACKLASH_X
|
||||||
extern uint8_t st_backlash_x;
|
extern uint8_t st_backlash_x;
|
||||||
@ -3510,6 +3612,7 @@ extern uint8_t st_backlash_y;
|
|||||||
//!@n M129 - EtoP Closed (BariCUDA EtoP = electricity to air pressure transducer by jmil)
|
//!@n M129 - EtoP Closed (BariCUDA EtoP = electricity to air pressure transducer by jmil)
|
||||||
//!@n M140 - Set bed target temp
|
//!@n M140 - Set bed target temp
|
||||||
//!@n M150 - Set BlinkM Color Output R: Red<0-255> U(!): Green<0-255> B: Blue<0-255> over i2c, G for green does not work.
|
//!@n M150 - Set BlinkM Color Output R: Red<0-255> U(!): Green<0-255> B: Blue<0-255> over i2c, G for green does not work.
|
||||||
|
//!@n M155 - Automatically send temperatures
|
||||||
//!@n M190 - Sxxx Wait for bed current temp to reach target temp. Waits only when heating
|
//!@n M190 - Sxxx Wait for bed current temp to reach target temp. Waits only when heating
|
||||||
//! Rxxx Wait for bed current temp to reach target temp. Waits when heating and cooling
|
//! Rxxx Wait for bed current temp to reach target temp. Waits when heating and cooling
|
||||||
//!@n M200 D<millimeters>- set filament diameter and set E axis units to cubic millimeters (use S0 to set back to millimeters).
|
//!@n M200 D<millimeters>- set filament diameter and set E axis units to cubic millimeters (use S0 to set back to millimeters).
|
||||||
@ -3575,13 +3678,11 @@ There are reasons why some G Codes aren't in numerical order.
|
|||||||
void process_commands()
|
void process_commands()
|
||||||
{
|
{
|
||||||
#ifdef FANCHECK
|
#ifdef FANCHECK
|
||||||
if(fan_check_error){
|
|
||||||
if(fan_check_error == EFCE_DETECTED){
|
if(fan_check_error == EFCE_DETECTED){
|
||||||
fan_check_error = EFCE_REPORTED;
|
fan_check_error = EFCE_REPORTED;
|
||||||
// SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED);
|
// SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED);
|
||||||
lcd_pause_print();
|
lcd_pause_print();
|
||||||
} // otherwise it has already been reported, so just ignore further processing
|
cmdqueue_serial_disabled = true;
|
||||||
return; //ignore usb stream. It is reenabled by selecting resume from the lcd.
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -4288,6 +4389,14 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
|
|||||||
#endif //FWRETRACT
|
#endif //FWRETRACT
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
### G21 - Sets Units to Millimters <a href="https://reprap.org/wiki/G-code#G21:_Set_Units_to_Millimeters">G21: Set Units to Millimeters</a>
|
||||||
|
Units are in millimeters. Prusa doesn't support inches.
|
||||||
|
*/
|
||||||
|
case 21:
|
||||||
|
break; //Doing nothing. This is just to prevent serial UNKOWN warnings.
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
### G28 - Home all Axes one at a time <a href="https://reprap.org/wiki/G-code#G28:_Move_to_Origin_.28Home.29">G28: Move to Origin (Home)</a>
|
### G28 - Home all Axes one at a time <a href="https://reprap.org/wiki/G-code#G28:_Move_to_Origin_.28Home.29">G28: Move to Origin (Home)</a>
|
||||||
Using `G28` without any parameters will perfom homing of all axes AND mesh bed leveling, while `G28 W` will just home all axes (no mesh bed leveling).
|
Using `G28` without any parameters will perfom homing of all axes AND mesh bed leveling, while `G28 W` will just home all axes (no mesh bed leveling).
|
||||||
@ -6286,95 +6395,41 @@ Sigma_Exit:
|
|||||||
if(setTargetedHotend(105, extruder)){
|
if(setTargetedHotend(105, extruder)){
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#if defined(TEMP_0_PIN) && TEMP_0_PIN > -1
|
|
||||||
SERIAL_PROTOCOLPGM("ok T:");
|
|
||||||
SERIAL_PROTOCOL_F(degHotend(extruder),1);
|
|
||||||
SERIAL_PROTOCOLPGM(" /");
|
|
||||||
SERIAL_PROTOCOL_F(degTargetHotend(extruder),1);
|
|
||||||
#if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1
|
|
||||||
SERIAL_PROTOCOLPGM(" B:");
|
|
||||||
SERIAL_PROTOCOL_F(degBed(),1);
|
|
||||||
SERIAL_PROTOCOLPGM(" /");
|
|
||||||
SERIAL_PROTOCOL_F(degTargetBed(),1);
|
|
||||||
#endif //TEMP_BED_PIN
|
|
||||||
for (int8_t cur_extruder = 0; cur_extruder < EXTRUDERS; ++cur_extruder) {
|
|
||||||
SERIAL_PROTOCOLPGM(" T");
|
|
||||||
SERIAL_PROTOCOL(cur_extruder);
|
|
||||||
SERIAL_PROTOCOL(':');
|
|
||||||
SERIAL_PROTOCOL_F(degHotend(cur_extruder),1);
|
|
||||||
SERIAL_PROTOCOLPGM(" /");
|
|
||||||
SERIAL_PROTOCOL_F(degTargetHotend(cur_extruder),1);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
SERIAL_ERROR_START;
|
|
||||||
SERIAL_ERRORLNRPGM(_i("No thermistors - no temperature"));////MSG_ERR_NO_THERMISTORS
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SERIAL_PROTOCOLPGM(" @:");
|
SERIAL_PROTOCOLPGM("ok ");
|
||||||
#ifdef EXTRUDER_WATTS
|
gcode_M105(extruder);
|
||||||
SERIAL_PROTOCOL((EXTRUDER_WATTS * getHeaterPower(tmp_extruder))/127);
|
|
||||||
SERIAL_PROTOCOLPGM("W");
|
|
||||||
#else
|
|
||||||
SERIAL_PROTOCOL(getHeaterPower(extruder));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SERIAL_PROTOCOLPGM(" B@:");
|
cmdqueue_pop_front(); //prevent an ok after the command since this command uses an ok at the beginning.
|
||||||
#ifdef BED_WATTS
|
|
||||||
SERIAL_PROTOCOL((BED_WATTS * getHeaterPower(-1))/127);
|
|
||||||
SERIAL_PROTOCOLPGM("W");
|
|
||||||
#else
|
|
||||||
SERIAL_PROTOCOL(getHeaterPower(-1));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef PINDA_THERMISTOR
|
|
||||||
SERIAL_PROTOCOLPGM(" P:");
|
|
||||||
SERIAL_PROTOCOL_F(current_temperature_pinda,1);
|
|
||||||
#endif //PINDA_THERMISTOR
|
|
||||||
|
|
||||||
#ifdef AMBIENT_THERMISTOR
|
|
||||||
SERIAL_PROTOCOLPGM(" A:");
|
|
||||||
SERIAL_PROTOCOL_F(current_temperature_ambient,1);
|
|
||||||
#endif //AMBIENT_THERMISTOR
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef SHOW_TEMP_ADC_VALUES
|
|
||||||
{float raw = 0.0;
|
|
||||||
|
|
||||||
#if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1
|
|
||||||
SERIAL_PROTOCOLPGM(" ADC B:");
|
|
||||||
SERIAL_PROTOCOL_F(degBed(),1);
|
|
||||||
SERIAL_PROTOCOLPGM("C->");
|
|
||||||
raw = rawBedTemp();
|
|
||||||
SERIAL_PROTOCOL_F(raw/OVERSAMPLENR,5);
|
|
||||||
SERIAL_PROTOCOLPGM(" Rb->");
|
|
||||||
SERIAL_PROTOCOL_F(100 * (1 + (PtA * (raw/OVERSAMPLENR)) + (PtB * sq((raw/OVERSAMPLENR)))), 5);
|
|
||||||
SERIAL_PROTOCOLPGM(" Rxb->");
|
|
||||||
SERIAL_PROTOCOL_F(raw, 5);
|
|
||||||
#endif
|
|
||||||
for (int8_t cur_extruder = 0; cur_extruder < EXTRUDERS; ++cur_extruder) {
|
|
||||||
SERIAL_PROTOCOLPGM(" T");
|
|
||||||
SERIAL_PROTOCOL(cur_extruder);
|
|
||||||
SERIAL_PROTOCOLPGM(":");
|
|
||||||
SERIAL_PROTOCOL_F(degHotend(cur_extruder),1);
|
|
||||||
SERIAL_PROTOCOLPGM("C->");
|
|
||||||
raw = rawHotendTemp(cur_extruder);
|
|
||||||
SERIAL_PROTOCOL_F(raw/OVERSAMPLENR,5);
|
|
||||||
SERIAL_PROTOCOLPGM(" Rt");
|
|
||||||
SERIAL_PROTOCOL(cur_extruder);
|
|
||||||
SERIAL_PROTOCOLPGM("->");
|
|
||||||
SERIAL_PROTOCOL_F(100 * (1 + (PtA * (raw/OVERSAMPLENR)) + (PtB * sq((raw/OVERSAMPLENR)))), 5);
|
|
||||||
SERIAL_PROTOCOLPGM(" Rx");
|
|
||||||
SERIAL_PROTOCOL(cur_extruder);
|
|
||||||
SERIAL_PROTOCOLPGM("->");
|
|
||||||
SERIAL_PROTOCOL_F(raw, 5);
|
|
||||||
}}
|
|
||||||
#endif
|
|
||||||
SERIAL_PROTOCOLLN("");
|
|
||||||
KEEPALIVE_STATE(NOT_BUSY);
|
|
||||||
return;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef AUTO_REPORT_TEMPERATURES
|
||||||
|
/*!
|
||||||
|
### M155 - Automatically send temperatures <a href="https://reprap.org/wiki/G-code#M155:_Automatically_send_temperatures">M155: Automatically send temperatures</a>
|
||||||
|
#### Usage
|
||||||
|
|
||||||
|
M155 [ S ]
|
||||||
|
|
||||||
|
#### Parameters
|
||||||
|
|
||||||
|
- `S` - Set temperature autoreporting interval in seconds. 0 to disable. Maximum: 255
|
||||||
|
|
||||||
|
*/
|
||||||
|
case 155:
|
||||||
|
{
|
||||||
|
if (code_seen('S'))
|
||||||
|
{
|
||||||
|
auto_report_temp_period = code_value_uint8();
|
||||||
|
if (auto_report_temp_period != 0)
|
||||||
|
auto_report_temp_timer.start();
|
||||||
|
else
|
||||||
|
auto_report_temp_timer.stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif //AUTO_REPORT_TEMPERATURES
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
### M109 - Wait for extruder temperature <a href="https://reprap.org/wiki/G-code#M109:_Set_Extruder_Temperature_and_Wait">M109: Set Extruder Temperature and Wait</a>
|
### M109 - Wait for extruder temperature <a href="https://reprap.org/wiki/G-code#M109:_Set_Extruder_Temperature_and_Wait">M109: Set Extruder Temperature and Wait</a>
|
||||||
#### Usage
|
#### Usage
|
||||||
@ -6807,6 +6862,9 @@ Sigma_Exit:
|
|||||||
SERIAL_ECHOPGM(STRINGIFY(EXTRUDERS));
|
SERIAL_ECHOPGM(STRINGIFY(EXTRUDERS));
|
||||||
SERIAL_ECHOPGM(" UUID:");
|
SERIAL_ECHOPGM(" UUID:");
|
||||||
SERIAL_ECHOLNPGM(MACHINE_UUID);
|
SERIAL_ECHOLNPGM(MACHINE_UUID);
|
||||||
|
#ifdef EXTENDED_CAPABILITIES_REPORT
|
||||||
|
extended_capabilities_report();
|
||||||
|
#endif //EXTENDED_CAPABILITIES_REPORT
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -7305,16 +7363,25 @@ Sigma_Exit:
|
|||||||
*/
|
*/
|
||||||
case 220: // M220 S<factor in percent>- set speed factor override percentage
|
case 220: // M220 S<factor in percent>- set speed factor override percentage
|
||||||
{
|
{
|
||||||
|
bool codesWereSeen = false;
|
||||||
if (code_seen('B')) //backup current speed factor
|
if (code_seen('B')) //backup current speed factor
|
||||||
{
|
{
|
||||||
saved_feedmultiply_mm = feedmultiply;
|
saved_feedmultiply_mm = feedmultiply;
|
||||||
|
codesWereSeen = true;
|
||||||
}
|
}
|
||||||
if (code_seen('S'))
|
if (code_seen('S'))
|
||||||
{
|
{
|
||||||
feedmultiply = code_value();
|
feedmultiply = code_value();
|
||||||
|
codesWereSeen = true;
|
||||||
}
|
}
|
||||||
if (code_seen('R')) { //restore previous feedmultiply
|
if (code_seen('R')) //restore previous feedmultiply
|
||||||
|
{
|
||||||
feedmultiply = saved_feedmultiply_mm;
|
feedmultiply = saved_feedmultiply_mm;
|
||||||
|
codesWereSeen = true;
|
||||||
|
}
|
||||||
|
if (!codesWereSeen)
|
||||||
|
{
|
||||||
|
printf_P(PSTR("%i%%\n"), feedmultiply);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -7337,9 +7404,8 @@ Sigma_Exit:
|
|||||||
if (code_seen('T'))
|
if (code_seen('T'))
|
||||||
{
|
{
|
||||||
uint8_t extruder;
|
uint8_t extruder;
|
||||||
if(setTargetedHotend(221, extruder)){
|
if (setTargetedHotend(221, extruder))
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
extruder_multiply[extruder] = tmp_code;
|
extruder_multiply[extruder] = tmp_code;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -7347,6 +7413,10 @@ Sigma_Exit:
|
|||||||
extrudemultiply = tmp_code ;
|
extrudemultiply = tmp_code ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf_P(PSTR("%i%%\n"), extrudemultiply);
|
||||||
|
}
|
||||||
calculate_extruder_multipliers();
|
calculate_extruder_multipliers();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -7921,6 +7991,7 @@ Sigma_Exit:
|
|||||||
if (!isPrintPaused)
|
if (!isPrintPaused)
|
||||||
{
|
{
|
||||||
st_synchronize();
|
st_synchronize();
|
||||||
|
ClearToSend(); //send OK even before the command finishes executing because we want to make sure it is not skipped because of cmdqueue_pop_front();
|
||||||
cmdqueue_pop_front(); //trick because we want skip this command (M601) after restore
|
cmdqueue_pop_front(); //trick because we want skip this command (M601) after restore
|
||||||
lcd_pause_print();
|
lcd_pause_print();
|
||||||
}
|
}
|
||||||
@ -9136,7 +9207,7 @@ void FlushSerialRequestResend()
|
|||||||
void ClearToSend()
|
void ClearToSend()
|
||||||
{
|
{
|
||||||
previous_millis_cmd = _millis();
|
previous_millis_cmd = _millis();
|
||||||
if ((CMDBUFFER_CURRENT_TYPE == CMDBUFFER_CURRENT_TYPE_USB) || (CMDBUFFER_CURRENT_TYPE == CMDBUFFER_CURRENT_TYPE_USB_WITH_LINENR))
|
if (buflen && ((CMDBUFFER_CURRENT_TYPE == CMDBUFFER_CURRENT_TYPE_USB) || (CMDBUFFER_CURRENT_TYPE == CMDBUFFER_CURRENT_TYPE_USB_WITH_LINENR)))
|
||||||
SERIAL_PROTOCOLLNRPGM(MSG_OK);
|
SERIAL_PROTOCOLLNRPGM(MSG_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -11387,7 +11458,6 @@ void restore_print_from_ram_and_continue(float e_move)
|
|||||||
//not sd printing nor usb printing
|
//not sd printing nor usb printing
|
||||||
}
|
}
|
||||||
|
|
||||||
SERIAL_PROTOCOLLNRPGM(MSG_OK); //dummy response because of octoprint is waiting for this
|
|
||||||
lcd_setstatuspgm(_T(WELCOME_MSG));
|
lcd_setstatuspgm(_T(WELCOME_MSG));
|
||||||
saved_printing_type = PRINTING_TYPE_NONE;
|
saved_printing_type = PRINTING_TYPE_NONE;
|
||||||
saved_printing = false;
|
saved_printing = false;
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
//backlight.cpp
|
//backlight.cpp
|
||||||
|
|
||||||
#include "backlight.h"
|
#include "backlight.h"
|
||||||
|
#include "macros.h"
|
||||||
#include <avr/eeprom.h>
|
#include <avr/eeprom.h>
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "eeprom.h"
|
#include "eeprom.h"
|
||||||
#include "Marlin.h"
|
|
||||||
#include "pins.h"
|
#include "pins.h"
|
||||||
#include "fastio.h"
|
#include "fastio.h"
|
||||||
#include "Timer.h"
|
#include "Timer.h"
|
||||||
@ -111,10 +111,10 @@ void backlight_init()
|
|||||||
|
|
||||||
#else //LCD_BL_PIN
|
#else //LCD_BL_PIN
|
||||||
|
|
||||||
void force_bl_on(__attribute__((unused)) bool section_start) {}
|
void force_bl_on(bool) {}
|
||||||
void backlight_update() {}
|
void backlight_update() {}
|
||||||
void backlight_init() {}
|
void backlight_init() {}
|
||||||
void backlight_save() {}
|
void backlight_save() {}
|
||||||
void backlight_wake(__attribute__((unused)) const uint8_t flashNo) {}
|
void backlight_wake(const uint8_t) {}
|
||||||
|
|
||||||
#endif //LCD_BL_PIN
|
#endif //LCD_BL_PIN
|
@ -1,4 +1,5 @@
|
|||||||
#include "Marlin.h"
|
#include "Marlin.h"
|
||||||
|
#include "cmdqueue.h"
|
||||||
#include "cardreader.h"
|
#include "cardreader.h"
|
||||||
#include "ultralcd.h"
|
#include "ultralcd.h"
|
||||||
#include "stepper.h"
|
#include "stepper.h"
|
||||||
@ -243,6 +244,8 @@ void CardReader::release()
|
|||||||
{
|
{
|
||||||
sdprinting = false;
|
sdprinting = false;
|
||||||
cardOK = false;
|
cardOK = false;
|
||||||
|
SERIAL_ECHO_START;
|
||||||
|
SERIAL_ECHOLNRPGM(_n("SD card released"));////MSG_SD_CARD_RELEASED
|
||||||
}
|
}
|
||||||
|
|
||||||
void CardReader::startFileprint()
|
void CardReader::startFileprint()
|
||||||
@ -496,7 +499,7 @@ void CardReader::getStatus()
|
|||||||
SERIAL_PROTOCOLLNPGM("Print saved");
|
SERIAL_PROTOCOLLNPGM("Print saved");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
SERIAL_PROTOCOLLN(longFilename);
|
SERIAL_PROTOCOLLN(LONGEST_FILENAME);
|
||||||
SERIAL_PROTOCOLRPGM(_N("SD printing byte "));////MSG_SD_PRINTING_BYTE
|
SERIAL_PROTOCOLRPGM(_N("SD printing byte "));////MSG_SD_PRINTING_BYTE
|
||||||
SERIAL_PROTOCOL(sdpos);
|
SERIAL_PROTOCOL(sdpos);
|
||||||
SERIAL_PROTOCOL('/');
|
SERIAL_PROTOCOL('/');
|
||||||
|
@ -18,6 +18,10 @@ int buflen = 0;
|
|||||||
// Therefore don't remove the command from the queue in the loop() function.
|
// Therefore don't remove the command from the queue in the loop() function.
|
||||||
bool cmdbuffer_front_already_processed = false;
|
bool cmdbuffer_front_already_processed = false;
|
||||||
|
|
||||||
|
// Used for temporarely preventing accidental adding of Serial commands to the queue.
|
||||||
|
// For now only check_file and the fancheck pause use this.
|
||||||
|
bool cmdqueue_serial_disabled = false;
|
||||||
|
|
||||||
int serial_count = 0; //index of character read from serial line
|
int serial_count = 0; //index of character read from serial line
|
||||||
boolean comment_mode = false;
|
boolean comment_mode = false;
|
||||||
char *strchr_pointer; // just a pointer to find chars in the command string like X, Y, Z, E, etc
|
char *strchr_pointer; // just a pointer to find chars in the command string like X, Y, Z, E, etc
|
||||||
@ -91,9 +95,14 @@ bool cmdqueue_pop_front()
|
|||||||
|
|
||||||
void cmdqueue_reset()
|
void cmdqueue_reset()
|
||||||
{
|
{
|
||||||
|
while (buflen)
|
||||||
|
{
|
||||||
|
// printf_P(PSTR("dumping: \"%s\" of type %hu\n"), cmdbuffer+bufindr+CMDHDRSIZE, CMDBUFFER_CURRENT_TYPE);
|
||||||
|
ClearToSend();
|
||||||
|
cmdqueue_pop_front();
|
||||||
|
}
|
||||||
bufindr = 0;
|
bufindr = 0;
|
||||||
bufindw = 0;
|
bufindw = 0;
|
||||||
buflen = 0;
|
|
||||||
|
|
||||||
//commands are removed from command queue after process_command() function is finished
|
//commands are removed from command queue after process_command() function is finished
|
||||||
//reseting command queue and enqueing new commands during some (usually long running) command processing would cause that new commands are immediately removed from queue (or damaged)
|
//reseting command queue and enqueing new commands during some (usually long running) command processing would cause that new commands are immediately removed from queue (or damaged)
|
||||||
@ -390,7 +399,7 @@ void get_command()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// start of serial line processing loop
|
// start of serial line processing loop
|
||||||
while ((MYSERIAL.available() > 0 && !saved_printing) || (MYSERIAL.available() > 0 && isPrintPaused)) { //is print is saved (crash detection or filament detection), dont process data from serial line
|
while (((MYSERIAL.available() > 0 && !saved_printing) || (MYSERIAL.available() > 0 && isPrintPaused)) && !cmdqueue_serial_disabled) { //is print is saved (crash detection or filament detection), dont process data from serial line
|
||||||
|
|
||||||
char serial_char = MYSERIAL.read();
|
char serial_char = MYSERIAL.read();
|
||||||
/* if (selectedSerialPort == 1)
|
/* if (selectedSerialPort == 1)
|
||||||
@ -582,8 +591,6 @@ void get_command()
|
|||||||
((serial_char == '#' || serial_char == ':') && comment_mode == false) ||
|
((serial_char == '#' || serial_char == ':') && comment_mode == false) ||
|
||||||
serial_count >= (MAX_CMD_SIZE - 1) || n==-1)
|
serial_count >= (MAX_CMD_SIZE - 1) || n==-1)
|
||||||
{
|
{
|
||||||
if(card.eof()) break;
|
|
||||||
|
|
||||||
if(serial_char=='#')
|
if(serial_char=='#')
|
||||||
stop_buffering=true;
|
stop_buffering=true;
|
||||||
|
|
||||||
@ -631,6 +638,9 @@ void get_command()
|
|||||||
|
|
||||||
comment_mode = false; //for new command
|
comment_mode = false; //for new command
|
||||||
serial_count = 0; //clear buffer
|
serial_count = 0; //clear buffer
|
||||||
|
|
||||||
|
if(card.eof()) break;
|
||||||
|
|
||||||
// The following line will reserve buffer space if available.
|
// The following line will reserve buffer space if available.
|
||||||
if (! cmdqueue_could_enqueue_back(MAX_CMD_SIZE-1, true))
|
if (! cmdqueue_could_enqueue_back(MAX_CMD_SIZE-1, true))
|
||||||
return;
|
return;
|
||||||
|
@ -35,6 +35,7 @@ extern char cmdbuffer[BUFSIZE * (MAX_CMD_SIZE + 1) + CMDBUFFER_RESERVE_FRONT];
|
|||||||
extern size_t bufindr;
|
extern size_t bufindr;
|
||||||
extern int buflen;
|
extern int buflen;
|
||||||
extern bool cmdbuffer_front_already_processed;
|
extern bool cmdbuffer_front_already_processed;
|
||||||
|
extern bool cmdqueue_serial_disabled;
|
||||||
|
|
||||||
// Type of a command, which is to be executed right now.
|
// Type of a command, which is to be executed right now.
|
||||||
#define CMDBUFFER_CURRENT_TYPE (cmdbuffer[bufindr])
|
#define CMDBUFFER_CURRENT_TYPE (cmdbuffer[bufindr])
|
||||||
@ -65,8 +66,8 @@ extern void cmdqueue_dump_to_serial_single_line(int nr, const char *p);
|
|||||||
extern void cmdqueue_dump_to_serial();
|
extern void cmdqueue_dump_to_serial();
|
||||||
#endif /* CMDBUFFER_DEBUG */
|
#endif /* CMDBUFFER_DEBUG */
|
||||||
extern bool cmd_buffer_empty();
|
extern bool cmd_buffer_empty();
|
||||||
extern void enquecommand(const char *cmd, bool from_progmem);
|
extern void enquecommand(const char *cmd, bool from_progmem = false);
|
||||||
extern void enquecommand_front(const char *cmd, bool from_progmem);
|
extern void enquecommand_front(const char *cmd, bool from_progmem = false);
|
||||||
extern void repeatcommand_front();
|
extern void repeatcommand_front();
|
||||||
extern bool is_buffer_empty();
|
extern bool is_buffer_empty();
|
||||||
extern void get_command();
|
extern void get_command();
|
||||||
|
@ -7,15 +7,7 @@
|
|||||||
#define _FASTIO_ARDUINO_H
|
#define _FASTIO_ARDUINO_H
|
||||||
|
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
|
#include "macros.h"
|
||||||
/*
|
|
||||||
utility functions
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef MASK
|
|
||||||
/// MASKING- returns \f$2^PIN\f$
|
|
||||||
#define MASK(PIN) (1 << PIN)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
magic I/O routines
|
magic I/O routines
|
||||||
@ -23,20 +15,20 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/// Read a pin
|
/// Read a pin
|
||||||
#define _READ(IO) ((bool)(DIO ## IO ## _RPORT & MASK(DIO ## IO ## _PIN)))
|
#define _READ(IO) ((bool)(DIO ## IO ## _RPORT & _BV(DIO ## IO ## _PIN)))
|
||||||
/// write to a pin
|
/// write to a pin
|
||||||
// On some boards pins > 0x100 are used. These are not converted to atomic actions. An critical section is needed.
|
// On some boards pins > 0x100 are used. These are not converted to atomic actions. An critical section is needed.
|
||||||
|
|
||||||
#define _WRITE_NC(IO, v) do { if (v) {DIO ## IO ## _WPORT |= MASK(DIO ## IO ## _PIN); } else {DIO ## IO ## _WPORT &= ~MASK(DIO ## IO ## _PIN); }; } while (0)
|
#define _WRITE_NC(IO, v) do { if (v) {DIO ## IO ## _WPORT |= _BV(DIO ## IO ## _PIN); } else {DIO ## IO ## _WPORT &= ~_BV(DIO ## IO ## _PIN); }; } while (0)
|
||||||
|
|
||||||
#define _WRITE_C(IO, v) do { if (v) { \
|
#define _WRITE_C(IO, v) do { if (v) { \
|
||||||
CRITICAL_SECTION_START; \
|
CRITICAL_SECTION_START; \
|
||||||
{DIO ## IO ## _WPORT |= MASK(DIO ## IO ## _PIN); }\
|
{DIO ## IO ## _WPORT |= _BV(DIO ## IO ## _PIN); }\
|
||||||
CRITICAL_SECTION_END; \
|
CRITICAL_SECTION_END; \
|
||||||
}\
|
}\
|
||||||
else {\
|
else {\
|
||||||
CRITICAL_SECTION_START; \
|
CRITICAL_SECTION_START; \
|
||||||
{DIO ## IO ## _WPORT &= ~MASK(DIO ## IO ## _PIN); }\
|
{DIO ## IO ## _WPORT &= ~_BV(DIO ## IO ## _PIN); }\
|
||||||
CRITICAL_SECTION_END; \
|
CRITICAL_SECTION_END; \
|
||||||
}\
|
}\
|
||||||
}\
|
}\
|
||||||
@ -45,20 +37,20 @@
|
|||||||
#define _WRITE(IO, v) do { if (&(DIO ## IO ## _RPORT) >= (uint8_t *)0x100) {_WRITE_C(IO, v); } else {_WRITE_NC(IO, v); }; } while (0)
|
#define _WRITE(IO, v) do { if (&(DIO ## IO ## _RPORT) >= (uint8_t *)0x100) {_WRITE_C(IO, v); } else {_WRITE_NC(IO, v); }; } while (0)
|
||||||
|
|
||||||
/// toggle a pin
|
/// toggle a pin
|
||||||
#define _TOGGLE(IO) do {DIO ## IO ## _RPORT = MASK(DIO ## IO ## _PIN); } while (0)
|
#define _TOGGLE(IO) do {DIO ## IO ## _RPORT = _BV(DIO ## IO ## _PIN); } while (0)
|
||||||
|
|
||||||
/// set pin as input
|
/// set pin as input
|
||||||
#define _SET_INPUT(IO) do {DIO ## IO ## _DDR &= ~MASK(DIO ## IO ## _PIN); } while (0)
|
#define _SET_INPUT(IO) do {DIO ## IO ## _DDR &= ~_BV(DIO ## IO ## _PIN); } while (0)
|
||||||
/// set pin as output
|
/// set pin as output
|
||||||
#define _SET_OUTPUT(IO) do {DIO ## IO ## _DDR |= MASK(DIO ## IO ## _PIN); } while (0)
|
#define _SET_OUTPUT(IO) do {DIO ## IO ## _DDR |= _BV(DIO ## IO ## _PIN); } while (0)
|
||||||
|
|
||||||
/// check if pin is an input
|
/// check if pin is an input
|
||||||
#define _GET_INPUT(IO) ((DIO ## IO ## _DDR & MASK(DIO ## IO ## _PIN)) == 0)
|
#define _GET_INPUT(IO) ((DIO ## IO ## _DDR & _BV(DIO ## IO ## _PIN)) == 0)
|
||||||
/// check if pin is an output
|
/// check if pin is an output
|
||||||
#define _GET_OUTPUT(IO) ((DIO ## IO ## _DDR & MASK(DIO ## IO ## _PIN)) != 0)
|
#define _GET_OUTPUT(IO) ((DIO ## IO ## _DDR & _BV(DIO ## IO ## _PIN)) != 0)
|
||||||
|
|
||||||
/// check if pin is an timer
|
/// check if pin is an timer
|
||||||
#define _GET_TIMER(IO) ((DIO ## IO ## _PWM)
|
#define _GET_TIMER(IO) (DIO ## IO ## _PWM)
|
||||||
|
|
||||||
// why double up on these macros? see http://gcc.gnu.org/onlinedocs/cpp/Stringification.html
|
// why double up on these macros? see http://gcc.gnu.org/onlinedocs/cpp/Stringification.html
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include "Configuration_prusa.h"
|
#include "Configuration_prusa.h"
|
||||||
#include "language.h"
|
#include "language.h"
|
||||||
#include "Marlin.h"
|
#include "Marlin.h"
|
||||||
|
#include "cmdqueue.h"
|
||||||
#include "mmu.h"
|
#include "mmu.h"
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
|
@ -6,7 +6,6 @@
|
|||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
#include "pat9125.h"
|
#include "pat9125.h"
|
||||||
#include "stepper.h"
|
#include "stepper.h"
|
||||||
#include "io_atmega2560.h"
|
|
||||||
#include "cmdqueue.h"
|
#include "cmdqueue.h"
|
||||||
#include "ultralcd.h"
|
#include "ultralcd.h"
|
||||||
#include "mmu.h"
|
#include "mmu.h"
|
||||||
@ -609,8 +608,7 @@ void fsensor_st_block_chunk(int cnt)
|
|||||||
fsensor_st_cnt += cnt;
|
fsensor_st_cnt += cnt;
|
||||||
|
|
||||||
// !!! bit toggling (PINxn <- 1) (for PinChangeInterrupt) does not work for some MCU pins
|
// !!! bit toggling (PINxn <- 1) (for PinChangeInterrupt) does not work for some MCU pins
|
||||||
if (PIN_GET(FSENSOR_INT_PIN)) {PIN_VAL(FSENSOR_INT_PIN, LOW);}
|
WRITE(FSENSOR_INT_PIN, !READ(FSENSOR_INT_PIN));
|
||||||
else {PIN_VAL(FSENSOR_INT_PIN, HIGH);}
|
|
||||||
}
|
}
|
||||||
#endif //PAT9125
|
#endif //PAT9125
|
||||||
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
#include "io_atmega2560.h"
|
|
||||||
|
|
||||||
// All this is about silencing the heat bed, as it behaves like a loudspeaker.
|
// All this is about silencing the heat bed, as it behaves like a loudspeaker.
|
||||||
// Basically, we want the PWM heating switched at 30Hz (or so) which is a well ballanced
|
// Basically, we want the PWM heating switched at 30Hz (or so) which is a well ballanced
|
||||||
|
@ -1,374 +0,0 @@
|
|||||||
//io_atmega2560.h
|
|
||||||
#ifndef _IO_ATMEGA2560
|
|
||||||
#define _IO_ATMEGA2560
|
|
||||||
|
|
||||||
|
|
||||||
#define __PIN_P0 PINE
|
|
||||||
#define __PIN_P1 PINE
|
|
||||||
#define __PIN_P2 PINE
|
|
||||||
#define __PIN_P3 PINE
|
|
||||||
#define __PIN_P4 PING
|
|
||||||
#define __PIN_P5 PINE
|
|
||||||
#define __PIN_P6 PINH
|
|
||||||
#define __PIN_P7 PINH
|
|
||||||
#define __PIN_P8 PINH
|
|
||||||
#define __PIN_P9 PINH
|
|
||||||
#define __PIN_P10 PINB
|
|
||||||
#define __PIN_P11 PINB
|
|
||||||
#define __PIN_P12 PINB
|
|
||||||
#define __PIN_P13 PINB
|
|
||||||
#define __PIN_P14 PINJ
|
|
||||||
#define __PIN_P15 PINJ
|
|
||||||
#define __PIN_P16 PINH
|
|
||||||
#define __PIN_P17 PINH
|
|
||||||
#define __PIN_P18 PIND
|
|
||||||
#define __PIN_P19 PIND
|
|
||||||
#define __PIN_P20 PIND
|
|
||||||
#define __PIN_P21 PIND
|
|
||||||
#define __PIN_P22 PINA
|
|
||||||
#define __PIN_P23 PINA
|
|
||||||
#define __PIN_P24 PINA
|
|
||||||
#define __PIN_P25 PINA
|
|
||||||
#define __PIN_P26 PINA
|
|
||||||
#define __PIN_P27 PINA
|
|
||||||
#define __PIN_P28 PINA
|
|
||||||
#define __PIN_P29 PINA
|
|
||||||
#define __PIN_P30 PINC
|
|
||||||
#define __PIN_P31 PINC
|
|
||||||
#define __PIN_P32 PINC
|
|
||||||
#define __PIN_P33 PINC
|
|
||||||
#define __PIN_P34 PINC
|
|
||||||
#define __PIN_P35 PINC
|
|
||||||
#define __PIN_P36 PINC
|
|
||||||
#define __PIN_P37 PINC
|
|
||||||
#define __PIN_P38 PIND
|
|
||||||
#define __PIN_P39 PING
|
|
||||||
#define __PIN_P40 PING
|
|
||||||
#define __PIN_P41 PING
|
|
||||||
#define __PIN_P42 PINL
|
|
||||||
#define __PIN_P43 PINL
|
|
||||||
#define __PIN_P44 PINL
|
|
||||||
#define __PIN_P45 PINL
|
|
||||||
#define __PIN_P46 PINL
|
|
||||||
#define __PIN_P47 PINL
|
|
||||||
#define __PIN_P48 PINL
|
|
||||||
#define __PIN_P49 PINL
|
|
||||||
#define __PIN_P50 PINB
|
|
||||||
#define __PIN_P51 PINB
|
|
||||||
#define __PIN_P52 PINB
|
|
||||||
#define __PIN_P53 PINB
|
|
||||||
#define __PIN_P54 PINF
|
|
||||||
#define __PIN_P55 PINF
|
|
||||||
#define __PIN_P56 PINF
|
|
||||||
#define __PIN_P57 PINF
|
|
||||||
#define __PIN_P58 PINF
|
|
||||||
#define __PIN_P59 PINF
|
|
||||||
#define __PIN_P60 PINF
|
|
||||||
#define __PIN_P61 PINF
|
|
||||||
#define __PIN_P62 PINK
|
|
||||||
#define __PIN_P63 PINK
|
|
||||||
#define __PIN_P64 PINK
|
|
||||||
#define __PIN_P65 PINK
|
|
||||||
#define __PIN_P66 PINK
|
|
||||||
#define __PIN_P67 PINK
|
|
||||||
#define __PIN_P68 PINK
|
|
||||||
#define __PIN_P69 PINK
|
|
||||||
#define __PIN_P70 PING
|
|
||||||
#define __PIN_P71 PING
|
|
||||||
#define __PIN_P72 PINJ
|
|
||||||
#define __PIN_P73 PINJ
|
|
||||||
#define __PIN_P74 PINJ
|
|
||||||
#define __PIN_P75 PINJ
|
|
||||||
#define __PIN_P76 PINJ
|
|
||||||
#define __PIN_P77 PINJ
|
|
||||||
#define __PIN_P78 PINE
|
|
||||||
#define __PIN_P79 PINE
|
|
||||||
#define __PIN_P80 PINE
|
|
||||||
#define __PIN_P81 PIND
|
|
||||||
#define __PIN_P82 PIND
|
|
||||||
#define __PIN_P83 PIND
|
|
||||||
#define __PIN_P84 PINH
|
|
||||||
#define __PIN_P85 PINH
|
|
||||||
|
|
||||||
#define __PORT_P0 PORTE
|
|
||||||
#define __PORT_P1 PORTE
|
|
||||||
#define __PORT_P2 PORTE
|
|
||||||
#define __PORT_P3 PORTE
|
|
||||||
#define __PORT_P4 PORTG
|
|
||||||
#define __PORT_P5 PORTE
|
|
||||||
#define __PORT_P6 PORTH
|
|
||||||
#define __PORT_P7 PORTH
|
|
||||||
#define __PORT_P8 PORTH
|
|
||||||
#define __PORT_P9 PORTH
|
|
||||||
#define __PORT_P10 PORTB
|
|
||||||
#define __PORT_P11 PORTB
|
|
||||||
#define __PORT_P12 PORTB
|
|
||||||
#define __PORT_P13 PORTB
|
|
||||||
#define __PORT_P14 PORTJ
|
|
||||||
#define __PORT_P15 PORTJ
|
|
||||||
#define __PORT_P16 PORTH
|
|
||||||
#define __PORT_P17 PORTH
|
|
||||||
#define __PORT_P18 PORTD
|
|
||||||
#define __PORT_P19 PORTD
|
|
||||||
#define __PORT_P20 PORTD
|
|
||||||
#define __PORT_P21 PORTD
|
|
||||||
#define __PORT_P22 PORTA
|
|
||||||
#define __PORT_P23 PORTA
|
|
||||||
#define __PORT_P24 PORTA
|
|
||||||
#define __PORT_P25 PORTA
|
|
||||||
#define __PORT_P26 PORTA
|
|
||||||
#define __PORT_P27 PORTA
|
|
||||||
#define __PORT_P28 PORTA
|
|
||||||
#define __PORT_P29 PORTA
|
|
||||||
#define __PORT_P30 PORTC
|
|
||||||
#define __PORT_P31 PORTC
|
|
||||||
#define __PORT_P32 PORTC
|
|
||||||
#define __PORT_P33 PORTC
|
|
||||||
#define __PORT_P34 PORTC
|
|
||||||
#define __PORT_P35 PORTC
|
|
||||||
#define __PORT_P36 PORTC
|
|
||||||
#define __PORT_P37 PORTC
|
|
||||||
#define __PORT_P38 PORTD
|
|
||||||
#define __PORT_P39 PORTG
|
|
||||||
#define __PORT_P40 PORTG
|
|
||||||
#define __PORT_P41 PORTG
|
|
||||||
#define __PORT_P42 PORTL
|
|
||||||
#define __PORT_P43 PORTL
|
|
||||||
#define __PORT_P44 PORTL
|
|
||||||
#define __PORT_P45 PORTL
|
|
||||||
#define __PORT_P46 PORTL
|
|
||||||
#define __PORT_P47 PORTL
|
|
||||||
#define __PORT_P48 PORTL
|
|
||||||
#define __PORT_P49 PORTL
|
|
||||||
#define __PORT_P50 PORTB
|
|
||||||
#define __PORT_P51 PORTB
|
|
||||||
#define __PORT_P52 PORTB
|
|
||||||
#define __PORT_P53 PORTB
|
|
||||||
#define __PORT_P54 PORTF
|
|
||||||
#define __PORT_P55 PORTF
|
|
||||||
#define __PORT_P56 PORTF
|
|
||||||
#define __PORT_P57 PORTF
|
|
||||||
#define __PORT_P58 PORTF
|
|
||||||
#define __PORT_P59 PORTF
|
|
||||||
#define __PORT_P60 PORTF
|
|
||||||
#define __PORT_P61 PORTF
|
|
||||||
#define __PORT_P62 PORTK
|
|
||||||
#define __PORT_P63 PORTK
|
|
||||||
#define __PORT_P64 PORTK
|
|
||||||
#define __PORT_P65 PORTK
|
|
||||||
#define __PORT_P66 PORTK
|
|
||||||
#define __PORT_P67 PORTK
|
|
||||||
#define __PORT_P68 PORTK
|
|
||||||
#define __PORT_P69 PORTK
|
|
||||||
#define __PORT_P70 PORTG
|
|
||||||
#define __PORT_P71 PORTG
|
|
||||||
#define __PORT_P72 PORTJ
|
|
||||||
#define __PORT_P73 PORTJ
|
|
||||||
#define __PORT_P74 PORTJ
|
|
||||||
#define __PORT_P75 PORTJ
|
|
||||||
#define __PORT_P76 PORTJ
|
|
||||||
#define __PORT_P77 PORTJ
|
|
||||||
#define __PORT_P78 PORTE
|
|
||||||
#define __PORT_P79 PORTE
|
|
||||||
#define __PORT_P80 PORTE
|
|
||||||
#define __PORT_P81 PORTD
|
|
||||||
#define __PORT_P82 PORTD
|
|
||||||
#define __PORT_P83 PORTD
|
|
||||||
#define __PORT_P84 PORTH
|
|
||||||
#define __PORT_P85 PORTH
|
|
||||||
|
|
||||||
#define __DDR_P0 DDRE
|
|
||||||
#define __DDR_P1 DDRE
|
|
||||||
#define __DDR_P2 DDRE
|
|
||||||
#define __DDR_P3 DDRE
|
|
||||||
#define __DDR_P4 DDRG
|
|
||||||
#define __DDR_P5 DDRE
|
|
||||||
#define __DDR_P6 DDRH
|
|
||||||
#define __DDR_P7 DDRH
|
|
||||||
#define __DDR_P8 DDRH
|
|
||||||
#define __DDR_P9 DDRH
|
|
||||||
#define __DDR_P10 DDRB
|
|
||||||
#define __DDR_P11 DDRB
|
|
||||||
#define __DDR_P12 DDRB
|
|
||||||
#define __DDR_P13 DDRB
|
|
||||||
#define __DDR_P14 DDRJ
|
|
||||||
#define __DDR_P15 DDRJ
|
|
||||||
#define __DDR_P16 DDRH
|
|
||||||
#define __DDR_P17 DDRH
|
|
||||||
#define __DDR_P18 DDRD
|
|
||||||
#define __DDR_P19 DDRD
|
|
||||||
#define __DDR_P20 DDRD
|
|
||||||
#define __DDR_P21 DDRD
|
|
||||||
#define __DDR_P22 DDRA
|
|
||||||
#define __DDR_P23 DDRA
|
|
||||||
#define __DDR_P24 DDRA
|
|
||||||
#define __DDR_P25 DDRA
|
|
||||||
#define __DDR_P26 DDRA
|
|
||||||
#define __DDR_P27 DDRA
|
|
||||||
#define __DDR_P28 DDRA
|
|
||||||
#define __DDR_P29 DDRA
|
|
||||||
#define __DDR_P30 DDRC
|
|
||||||
#define __DDR_P31 DDRC
|
|
||||||
#define __DDR_P32 DDRC
|
|
||||||
#define __DDR_P33 DDRC
|
|
||||||
#define __DDR_P34 DDRC
|
|
||||||
#define __DDR_P35 DDRC
|
|
||||||
#define __DDR_P36 DDRC
|
|
||||||
#define __DDR_P37 DDRC
|
|
||||||
#define __DDR_P38 DDRD
|
|
||||||
#define __DDR_P39 DDRG
|
|
||||||
#define __DDR_P40 DDRG
|
|
||||||
#define __DDR_P41 DDRG
|
|
||||||
#define __DDR_P42 DDRL
|
|
||||||
#define __DDR_P43 DDRL
|
|
||||||
#define __DDR_P44 DDRL
|
|
||||||
#define __DDR_P45 DDRL
|
|
||||||
#define __DDR_P46 DDRL
|
|
||||||
#define __DDR_P47 DDRL
|
|
||||||
#define __DDR_P48 DDRL
|
|
||||||
#define __DDR_P49 DDRL
|
|
||||||
#define __DDR_P50 DDRB
|
|
||||||
#define __DDR_P51 DDRB
|
|
||||||
#define __DDR_P52 DDRB
|
|
||||||
#define __DDR_P53 DDRB
|
|
||||||
#define __DDR_P54 DDRF
|
|
||||||
#define __DDR_P55 DDRF
|
|
||||||
#define __DDR_P56 DDRF
|
|
||||||
#define __DDR_P57 DDRF
|
|
||||||
#define __DDR_P58 DDRF
|
|
||||||
#define __DDR_P59 DDRF
|
|
||||||
#define __DDR_P60 DDRF
|
|
||||||
#define __DDR_P61 DDRF
|
|
||||||
#define __DDR_P62 DDRK
|
|
||||||
#define __DDR_P63 DDRK
|
|
||||||
#define __DDR_P64 DDRK
|
|
||||||
#define __DDR_P65 DDRK
|
|
||||||
#define __DDR_P66 DDRK
|
|
||||||
#define __DDR_P67 DDRK
|
|
||||||
#define __DDR_P68 DDRK
|
|
||||||
#define __DDR_P69 DDRK
|
|
||||||
#define __DDR_P70 DDRG
|
|
||||||
#define __DDR_P71 DDRG
|
|
||||||
#define __DDR_P72 DDRJ
|
|
||||||
#define __DDR_P73 DDRJ
|
|
||||||
#define __DDR_P74 DDRJ
|
|
||||||
#define __DDR_P75 DDRJ
|
|
||||||
#define __DDR_P76 DDRJ
|
|
||||||
#define __DDR_P77 DDRJ
|
|
||||||
#define __DDR_P78 DDRE
|
|
||||||
#define __DDR_P79 DDRE
|
|
||||||
#define __DDR_P80 DDRE
|
|
||||||
#define __DDR_P81 DDRD
|
|
||||||
#define __DDR_P82 DDRD
|
|
||||||
#define __DDR_P83 DDRD
|
|
||||||
#define __DDR_P84 DDRH
|
|
||||||
#define __DDR_P85 DDRH
|
|
||||||
|
|
||||||
#define __BIT_P0 0
|
|
||||||
#define __BIT_P1 1
|
|
||||||
#define __BIT_P2 4
|
|
||||||
#define __BIT_P3 5
|
|
||||||
#define __BIT_P4 5
|
|
||||||
#define __BIT_P5 3
|
|
||||||
#define __BIT_P6 3
|
|
||||||
#define __BIT_P7 4
|
|
||||||
#define __BIT_P8 5
|
|
||||||
#define __BIT_P9 6
|
|
||||||
#define __BIT_P10 4
|
|
||||||
#define __BIT_P11 5
|
|
||||||
#define __BIT_P12 6
|
|
||||||
#define __BIT_P13 7
|
|
||||||
#define __BIT_P14 1
|
|
||||||
#define __BIT_P15 0
|
|
||||||
#define __BIT_P16 0
|
|
||||||
#define __BIT_P17 1
|
|
||||||
#define __BIT_P18 3
|
|
||||||
#define __BIT_P19 2
|
|
||||||
#define __BIT_P20 1
|
|
||||||
#define __BIT_P21 0
|
|
||||||
#define __BIT_P22 0
|
|
||||||
#define __BIT_P23 1
|
|
||||||
#define __BIT_P24 2
|
|
||||||
#define __BIT_P25 3
|
|
||||||
#define __BIT_P26 4
|
|
||||||
#define __BIT_P27 5
|
|
||||||
#define __BIT_P28 6
|
|
||||||
#define __BIT_P29 7
|
|
||||||
#define __BIT_P30 7
|
|
||||||
#define __BIT_P31 6
|
|
||||||
#define __BIT_P32 5
|
|
||||||
#define __BIT_P33 4
|
|
||||||
#define __BIT_P34 3
|
|
||||||
#define __BIT_P35 2
|
|
||||||
#define __BIT_P36 1
|
|
||||||
#define __BIT_P37 0
|
|
||||||
#define __BIT_P38 7
|
|
||||||
#define __BIT_P39 2
|
|
||||||
#define __BIT_P40 1
|
|
||||||
#define __BIT_P41 0
|
|
||||||
#define __BIT_P42 7
|
|
||||||
#define __BIT_P43 6
|
|
||||||
#define __BIT_P44 5
|
|
||||||
#define __BIT_P45 4
|
|
||||||
#define __BIT_P46 3
|
|
||||||
#define __BIT_P47 2
|
|
||||||
#define __BIT_P48 1
|
|
||||||
#define __BIT_P49 0
|
|
||||||
#define __BIT_P50 3
|
|
||||||
#define __BIT_P51 2
|
|
||||||
#define __BIT_P52 1
|
|
||||||
#define __BIT_P53 0
|
|
||||||
#define __BIT_P54 0
|
|
||||||
#define __BIT_P55 1
|
|
||||||
#define __BIT_P56 2
|
|
||||||
#define __BIT_P57 3
|
|
||||||
#define __BIT_P58 4
|
|
||||||
#define __BIT_P59 5
|
|
||||||
#define __BIT_P60 6
|
|
||||||
#define __BIT_P61 7
|
|
||||||
#define __BIT_P62 0
|
|
||||||
#define __BIT_P63 1
|
|
||||||
#define __BIT_P64 2
|
|
||||||
#define __BIT_P65 3
|
|
||||||
#define __BIT_P66 4
|
|
||||||
#define __BIT_P67 5
|
|
||||||
#define __BIT_P68 6
|
|
||||||
#define __BIT_P69 7
|
|
||||||
#define __BIT_P70 4
|
|
||||||
#define __BIT_P71 3
|
|
||||||
#define __BIT_P72 2
|
|
||||||
#define __BIT_P73 3
|
|
||||||
#define __BIT_P74 7
|
|
||||||
#define __BIT_P75 4
|
|
||||||
#define __BIT_P76 5
|
|
||||||
#define __BIT_P77 6
|
|
||||||
#define __BIT_P78 2
|
|
||||||
#define __BIT_P79 6
|
|
||||||
#define __BIT_P80 7
|
|
||||||
#define __BIT_P81 4
|
|
||||||
#define __BIT_P82 5
|
|
||||||
#define __BIT_P83 6
|
|
||||||
#define __BIT_P84 2
|
|
||||||
#define __BIT_P85 7
|
|
||||||
|
|
||||||
#define __BIT(pin) __BIT_P##pin
|
|
||||||
#define __MSK(pin) (1 << __BIT(pin))
|
|
||||||
|
|
||||||
#define __PIN(pin) __PIN_P##pin
|
|
||||||
#define __PORT(pin) __PORT_P##pin
|
|
||||||
#define __DDR(pin) __DDR_P##pin
|
|
||||||
|
|
||||||
#define PIN(pin) __PIN(pin)
|
|
||||||
#define PORT(pin) __PORT(pin)
|
|
||||||
#define DDR(pin) __DDR(pin)
|
|
||||||
|
|
||||||
#define PIN_INP(pin) DDR(pin) &= ~__MSK(pin)
|
|
||||||
#define PIN_OUT(pin) DDR(pin) |= __MSK(pin)
|
|
||||||
#define PIN_CLR(pin) PORT(pin) &= ~__MSK(pin)
|
|
||||||
#define PIN_SET(pin) PORT(pin) |= __MSK(pin)
|
|
||||||
#define PIN_VAL(pin, val) if (val) PIN_SET(pin); else PIN_CLR(pin);
|
|
||||||
#define PIN_GET(pin) (PIN(pin) & __MSK(pin))
|
|
||||||
#define PIN_INQ(pin) (PORT(pin) & __MSK(pin))
|
|
||||||
|
|
||||||
|
|
||||||
#endif //_IO_ATMEGA2560
|
|
@ -17,10 +17,10 @@ uint8_t lang_selected = 0;
|
|||||||
|
|
||||||
#if (LANG_MODE == 0) //primary language only
|
#if (LANG_MODE == 0) //primary language only
|
||||||
|
|
||||||
uint8_t lang_select(__attribute__((unused)) uint8_t lang) { return 0; }
|
uint8_t lang_select(_UNUSED uint8_t lang) { return 0; }
|
||||||
uint8_t lang_get_count() { return 1; }
|
uint8_t lang_get_count() { return 1; }
|
||||||
uint16_t lang_get_code(__attribute__((unused)) uint8_t lang) { return LANG_CODE_EN; }
|
uint16_t lang_get_code(_UNUSED uint8_t lang) { return LANG_CODE_EN; }
|
||||||
const char* lang_get_name_by_code(__attribute__((unused)) uint16_t code) { return _n("English"); }
|
const char* lang_get_name_by_code(_UNUSED uint16_t code) { return _n("English"); }
|
||||||
void lang_reset(void) { }
|
void lang_reset(void) { }
|
||||||
uint8_t lang_is_selected(void) { return 1; }
|
uint8_t lang_is_selected(void) { return 1; }
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
#include "macros.h"
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#ifdef DEBUG_SEC_LANG
|
#ifdef DEBUG_SEC_LANG
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -22,9 +23,6 @@
|
|||||||
|
|
||||||
#define MSG_FW_VERSION "Firmware"
|
#define MSG_FW_VERSION "Firmware"
|
||||||
|
|
||||||
#define STRINGIFY_(n) #n
|
|
||||||
#define STRINGIFY(n) STRINGIFY_(n)
|
|
||||||
|
|
||||||
#if (LANG_MODE == 0) //primary language only
|
#if (LANG_MODE == 0) //primary language only
|
||||||
#define PROGMEM_I2 __attribute__((section(".progmem0")))
|
#define PROGMEM_I2 __attribute__((section(".progmem0")))
|
||||||
#define PROGMEM_I1 __attribute__((section(".progmem1")))
|
#define PROGMEM_I1 __attribute__((section(".progmem1")))
|
||||||
|
90
Firmware/macros.h
Normal file
90
Firmware/macros.h
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
#ifndef MACROS_H
|
||||||
|
#define MACROS_H
|
||||||
|
|
||||||
|
#include <avr/interrupt.h> //for cli() and sei()
|
||||||
|
|
||||||
|
#define FORCE_INLINE __attribute__((always_inline)) inline
|
||||||
|
#define _UNUSED __attribute__((unused))
|
||||||
|
|
||||||
|
#ifndef CRITICAL_SECTION_START
|
||||||
|
#define CRITICAL_SECTION_START unsigned char _sreg = SREG; cli();
|
||||||
|
#define CRITICAL_SECTION_END SREG = _sreg;
|
||||||
|
#endif //CRITICAL_SECTION_START
|
||||||
|
|
||||||
|
// Macros to make a string from a macro
|
||||||
|
#define STRINGIFY_(M) #M
|
||||||
|
#define STRINGIFY(M) STRINGIFY_(M)
|
||||||
|
|
||||||
|
// Macros for bit masks
|
||||||
|
#undef _BV
|
||||||
|
#define _BV(n) (1<<(n))
|
||||||
|
#define TEST(n,b) (!!((n)&_BV(b)))
|
||||||
|
#define SET_BIT_TO(N,B,TF) do{ if (TF) SBI(N,B); else CBI(N,B); }while(0)
|
||||||
|
|
||||||
|
#ifndef SBI
|
||||||
|
#define SBI(A,B) (A |= (1 << (B)))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CBI
|
||||||
|
#define CBI(A,B) (A &= ~(1 << (B)))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define TBI(N,B) (N ^= _BV(B))
|
||||||
|
|
||||||
|
|
||||||
|
// Macros to chain up to 12 conditions
|
||||||
|
#define _DO_1(W,C,A) (_##W##_1(A))
|
||||||
|
#define _DO_2(W,C,A,B) (_##W##_1(A) C _##W##_1(B))
|
||||||
|
#define _DO_3(W,C,A,V...) (_##W##_1(A) C _DO_2(W,C,V))
|
||||||
|
#define _DO_4(W,C,A,V...) (_##W##_1(A) C _DO_3(W,C,V))
|
||||||
|
#define _DO_5(W,C,A,V...) (_##W##_1(A) C _DO_4(W,C,V))
|
||||||
|
#define _DO_6(W,C,A,V...) (_##W##_1(A) C _DO_5(W,C,V))
|
||||||
|
#define _DO_7(W,C,A,V...) (_##W##_1(A) C _DO_6(W,C,V))
|
||||||
|
#define _DO_8(W,C,A,V...) (_##W##_1(A) C _DO_7(W,C,V))
|
||||||
|
#define _DO_9(W,C,A,V...) (_##W##_1(A) C _DO_8(W,C,V))
|
||||||
|
#define _DO_10(W,C,A,V...) (_##W##_1(A) C _DO_9(W,C,V))
|
||||||
|
#define _DO_11(W,C,A,V...) (_##W##_1(A) C _DO_10(W,C,V))
|
||||||
|
#define _DO_12(W,C,A,V...) (_##W##_1(A) C _DO_11(W,C,V))
|
||||||
|
#define __DO_N(W,C,N,V...) _DO_##N(W,C,V)
|
||||||
|
#define _DO_N(W,C,N,V...) __DO_N(W,C,N,V)
|
||||||
|
#define DO(W,C,V...) _DO_N(W,C,NUM_ARGS(V),V)
|
||||||
|
|
||||||
|
// Macros to support option testing
|
||||||
|
#define _CAT(a,V...) a##V
|
||||||
|
#define CAT(a,V...) _CAT(a,V)
|
||||||
|
|
||||||
|
#define _ISENA_ ~,1
|
||||||
|
#define _ISENA_1 ~,1
|
||||||
|
#define _ISENA_0x1 ~,1
|
||||||
|
#define _ISENA_true ~,1
|
||||||
|
#define _ISENA(V...) IS_PROBE(V)
|
||||||
|
|
||||||
|
#define _ENA_1(O) _ISENA(CAT(_IS,CAT(ENA_, O)))
|
||||||
|
#define _DIS_1(O) NOT(_ENA_1(O))
|
||||||
|
#define ENABLED(V...) DO(ENA,&&,V)
|
||||||
|
#define DISABLED(V...) DO(DIS,&&,V)
|
||||||
|
|
||||||
|
#define TERN(O,A,B) _TERN(_ENA_1(O),B,A) // OPTION converted to '0' or '1'
|
||||||
|
#define TERN0(O,A) _TERN(_ENA_1(O),0,A) // OPTION converted to A or '0'
|
||||||
|
#define TERN1(O,A) _TERN(_ENA_1(O),1,A) // OPTION converted to A or '1'
|
||||||
|
#define TERN_(O,A) _TERN(_ENA_1(O),,A) // OPTION converted to A or '<nul>'
|
||||||
|
#define _TERN(E,V...) __TERN(_CAT(T_,E),V) // Prepend 'T_' to get 'T_0' or 'T_1'
|
||||||
|
#define __TERN(T,V...) ___TERN(_CAT(_NO,T),V) // Prepend '_NO' to get '_NOT_0' or '_NOT_1'
|
||||||
|
#define ___TERN(P,V...) THIRD(P,V) // If first argument has a comma, A. Else B.
|
||||||
|
|
||||||
|
|
||||||
|
// Use NUM_ARGS(__VA_ARGS__) to get the number of variadic arguments
|
||||||
|
#define _NUM_ARGS(_,Z,Y,X,W,V,U,T,S,R,Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A,OUT,...) OUT
|
||||||
|
#define NUM_ARGS(V...) _NUM_ARGS(0,V,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)
|
||||||
|
|
||||||
|
//
|
||||||
|
// Primitives supporting precompiler REPEAT
|
||||||
|
//
|
||||||
|
#define FIRST(a,...) a
|
||||||
|
#define SECOND(a,b,...) b
|
||||||
|
#define THIRD(a,b,c,...) c
|
||||||
|
|
||||||
|
#define IS_PROBE(V...) SECOND(V, 0) // Get the second item passed, or 0
|
||||||
|
#define NOT(x) IS_PROBE(_CAT(_NOT_, x)) // NOT('0') gets '1'. Anything else gets '0'.
|
||||||
|
|
||||||
|
#endif //MACROS_H
|
@ -8,6 +8,7 @@
|
|||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
#include "Configuration.h"
|
#include "Configuration.h"
|
||||||
#include "Marlin.h"
|
#include "Marlin.h"
|
||||||
|
#include "cmdqueue.h"
|
||||||
#include "ultralcd.h"
|
#include "ultralcd.h"
|
||||||
#include "language.h"
|
#include "language.h"
|
||||||
#include "static_assert.h"
|
#include "static_assert.h"
|
||||||
@ -48,6 +49,7 @@ void menu_goto(menu_func_t menu, const uint32_t encoder, const bool feedback, bo
|
|||||||
{
|
{
|
||||||
menu_menu = menu;
|
menu_menu = menu;
|
||||||
lcd_encoder = encoder;
|
lcd_encoder = encoder;
|
||||||
|
menu_top = 0; //reset menu view. Needed if menu_back() is called from deep inside a menu, such as Support
|
||||||
asm("sei");
|
asm("sei");
|
||||||
if (reset_menu_state)
|
if (reset_menu_state)
|
||||||
{
|
{
|
||||||
|
@ -176,4 +176,4 @@ const char MSG_FANCHECK_PRINT[] PROGMEM_N1 = "Err: PRINT FAN ERROR"; ////c=20
|
|||||||
const char MSG_M112_KILL[] PROGMEM_N1 = "M112 called. Emergency Stop."; ////c=20
|
const char MSG_M112_KILL[] PROGMEM_N1 = "M112 called. Emergency Stop."; ////c=20
|
||||||
const char MSG_ADVANCE_K[] PROGMEM_N1 = "Advance K:"; ////c=13
|
const char MSG_ADVANCE_K[] PROGMEM_N1 = "Advance K:"; ////c=13
|
||||||
const char MSG_POWERPANIC_DETECTED[] PROGMEM_N1 = "POWER PANIC DETECTED"; ////c=20
|
const char MSG_POWERPANIC_DETECTED[] PROGMEM_N1 = "POWER PANIC DETECTED"; ////c=20
|
||||||
|
const char MSG_LCD_STATUS_CHANGED[] PROGMEM_N1 = "LCD status changed";
|
||||||
|
@ -176,6 +176,7 @@ extern const char MSG_FANCHECK_PRINT[];
|
|||||||
extern const char MSG_M112_KILL[];
|
extern const char MSG_M112_KILL[];
|
||||||
extern const char MSG_ADVANCE_K[];
|
extern const char MSG_ADVANCE_K[];
|
||||||
extern const char MSG_POWERPANIC_DETECTED[];
|
extern const char MSG_POWERPANIC_DETECTED[];
|
||||||
|
extern const char MSG_LCD_STATUS_CHANGED[];
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
}
|
}
|
||||||
|
@ -9,12 +9,14 @@
|
|||||||
#include "Configuration_prusa.h"
|
#include "Configuration_prusa.h"
|
||||||
#include "fsensor.h"
|
#include "fsensor.h"
|
||||||
#include "cardreader.h"
|
#include "cardreader.h"
|
||||||
|
#include "cmdqueue.h"
|
||||||
#include "ultralcd.h"
|
#include "ultralcd.h"
|
||||||
#include "sound.h"
|
#include "sound.h"
|
||||||
#include "printers.h"
|
#include "printers.h"
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
#include "io_atmega2560.h"
|
|
||||||
#include "AutoDeplete.h"
|
#include "AutoDeplete.h"
|
||||||
|
#include "fastio.h"
|
||||||
|
#include "pins.h"
|
||||||
//-//
|
//-//
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
@ -28,9 +30,6 @@
|
|||||||
#define MMU_P0_TIMEOUT 3000ul //timeout for P0 command: 3seconds
|
#define MMU_P0_TIMEOUT 3000ul //timeout for P0 command: 3seconds
|
||||||
#define MMU_MAX_RESEND_ATTEMPTS 2
|
#define MMU_MAX_RESEND_ATTEMPTS 2
|
||||||
|
|
||||||
#ifdef MMU_HWRESET
|
|
||||||
#define MMU_RST_PIN 76
|
|
||||||
#endif //MMU_HWRESET
|
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
@ -156,8 +155,8 @@ void mmu_init(void)
|
|||||||
_delay_ms(10); //wait 10ms for sure
|
_delay_ms(10); //wait 10ms for sure
|
||||||
mmu_reset(); //reset mmu (HW or SW), do not wait for response
|
mmu_reset(); //reset mmu (HW or SW), do not wait for response
|
||||||
mmu_state = S::Init;
|
mmu_state = S::Init;
|
||||||
PIN_INP(IR_SENSOR_PIN); //input mode
|
SET_INPUT(IR_SENSOR_PIN); //input mode
|
||||||
PIN_SET(IR_SENSOR_PIN); //pullup
|
WRITE(IR_SENSOR_PIN, 1); //pullup
|
||||||
}
|
}
|
||||||
|
|
||||||
//if IR_SENSOR defined, always returns true
|
//if IR_SENSOR defined, always returns true
|
||||||
@ -170,7 +169,7 @@ bool check_for_ir_sensor()
|
|||||||
|
|
||||||
bool detected = false;
|
bool detected = false;
|
||||||
//if IR_SENSOR_PIN input is low and pat9125sensor is not present we detected idler sensor
|
//if IR_SENSOR_PIN input is low and pat9125sensor is not present we detected idler sensor
|
||||||
if ((PIN_GET(IR_SENSOR_PIN) == 0)
|
if ((READ(IR_SENSOR_PIN) == 0)
|
||||||
#ifdef PAT9125
|
#ifdef PAT9125
|
||||||
&& fsensor_not_responding
|
&& fsensor_not_responding
|
||||||
#endif //PAT9125
|
#endif //PAT9125
|
||||||
@ -363,7 +362,7 @@ void mmu_loop(void)
|
|||||||
case S::GetFinda: //response to command P0
|
case S::GetFinda: //response to command P0
|
||||||
if (mmu_idl_sens)
|
if (mmu_idl_sens)
|
||||||
{
|
{
|
||||||
if (PIN_GET(IR_SENSOR_PIN) == 0 && mmu_loading_flag)
|
if (READ(IR_SENSOR_PIN) == 0 && mmu_loading_flag)
|
||||||
{
|
{
|
||||||
#ifdef MMU_DEBUG
|
#ifdef MMU_DEBUG
|
||||||
printf_P(PSTR("MMU <= 'A'\n"));
|
printf_P(PSTR("MMU <= 'A'\n"));
|
||||||
@ -406,7 +405,7 @@ void mmu_loop(void)
|
|||||||
case S::WaitCmd: //response to mmu commands
|
case S::WaitCmd: //response to mmu commands
|
||||||
if (mmu_idl_sens)
|
if (mmu_idl_sens)
|
||||||
{
|
{
|
||||||
if (PIN_GET(IR_SENSOR_PIN) == 0 && mmu_loading_flag)
|
if (READ(IR_SENSOR_PIN) == 0 && mmu_loading_flag)
|
||||||
{
|
{
|
||||||
DEBUG_PRINTF_P(PSTR("MMU <= 'A'\n"));
|
DEBUG_PRINTF_P(PSTR("MMU <= 'A'\n"));
|
||||||
mmu_puts_P(PSTR("A\n")); //send 'abort' request
|
mmu_puts_P(PSTR("A\n")); //send 'abort' request
|
||||||
@ -596,10 +595,10 @@ bool mmu_get_response(uint8_t move)
|
|||||||
mmu_loading_flag = true;
|
mmu_loading_flag = true;
|
||||||
if (can_extrude()) mmu_load_step();
|
if (can_extrude()) mmu_load_step();
|
||||||
//don't rely on "ok" signal from mmu unit; if filament detected by idler sensor during loading stop loading movements to prevent infinite loading
|
//don't rely on "ok" signal from mmu unit; if filament detected by idler sensor during loading stop loading movements to prevent infinite loading
|
||||||
if (PIN_GET(IR_SENSOR_PIN) == 0) move = MMU_NO_MOVE;
|
if (READ(IR_SENSOR_PIN) == 0) move = MMU_NO_MOVE;
|
||||||
break;
|
break;
|
||||||
case MMU_UNLOAD_MOVE:
|
case MMU_UNLOAD_MOVE:
|
||||||
if (PIN_GET(IR_SENSOR_PIN) == 0) //filament is still detected by idler sensor, printer helps with unlading
|
if (READ(IR_SENSOR_PIN) == 0) //filament is still detected by idler sensor, printer helps with unlading
|
||||||
{
|
{
|
||||||
if (can_extrude())
|
if (can_extrude())
|
||||||
{
|
{
|
||||||
@ -617,7 +616,7 @@ bool mmu_get_response(uint8_t move)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MMU_TCODE_MOVE: //first do unload and then continue with infinite loading movements
|
case MMU_TCODE_MOVE: //first do unload and then continue with infinite loading movements
|
||||||
if (PIN_GET(IR_SENSOR_PIN) == 0) //filament detected by idler sensor, we must unload first
|
if (READ(IR_SENSOR_PIN) == 0) //filament detected by idler sensor, we must unload first
|
||||||
{
|
{
|
||||||
if (can_extrude())
|
if (can_extrude())
|
||||||
{
|
{
|
||||||
@ -1460,7 +1459,7 @@ static bool can_load()
|
|||||||
current_position[E_AXIS] -= e_increment;
|
current_position[E_AXIS] -= e_increment;
|
||||||
plan_buffer_line_curposXYZE(MMU_LOAD_FEEDRATE);
|
plan_buffer_line_curposXYZE(MMU_LOAD_FEEDRATE);
|
||||||
st_synchronize();
|
st_synchronize();
|
||||||
if(0 == PIN_GET(IR_SENSOR_PIN))
|
if(0 == READ(IR_SENSOR_PIN))
|
||||||
{
|
{
|
||||||
++filament_detected_count;
|
++filament_detected_count;
|
||||||
DEBUG_PUTCHAR('O');
|
DEBUG_PUTCHAR('O');
|
||||||
@ -1491,7 +1490,7 @@ static bool load_more()
|
|||||||
{
|
{
|
||||||
for (uint8_t i = 0; i < MMU_IDLER_SENSOR_ATTEMPTS_NR; i++)
|
for (uint8_t i = 0; i < MMU_IDLER_SENSOR_ATTEMPTS_NR; i++)
|
||||||
{
|
{
|
||||||
if (PIN_GET(IR_SENSOR_PIN) == 0) return true;
|
if (READ(IR_SENSOR_PIN) == 0) return true;
|
||||||
DEBUG_PRINTF_P(PSTR("Additional load attempt nr. %d\n"), i);
|
DEBUG_PRINTF_P(PSTR("Additional load attempt nr. %d\n"), i);
|
||||||
mmu_command(MmuCmd::C0);
|
mmu_command(MmuCmd::C0);
|
||||||
manage_response(true, true, MMU_LOAD_MOVE);
|
manage_response(true, true, MMU_LOAD_MOVE);
|
||||||
|
@ -121,6 +121,8 @@
|
|||||||
|
|
||||||
#define IR_SENSOR_PIN 62 //idler sensor @PK0 (digital pin 62/A8)
|
#define IR_SENSOR_PIN 62 //idler sensor @PK0 (digital pin 62/A8)
|
||||||
|
|
||||||
|
#define MMU_RST_PIN 76
|
||||||
|
|
||||||
// Support for an 8 bit logic analyzer, for example the Saleae.
|
// Support for an 8 bit logic analyzer, for example the Saleae.
|
||||||
// Channels 0-2 are fast, they could generate 2.667Mhz waveform with a software loop.
|
// Channels 0-2 are fast, they could generate 2.667Mhz waveform with a software loop.
|
||||||
#define LOGIC_ANALYZER_CH0 X_MIN_PIN // PB6
|
#define LOGIC_ANALYZER_CH0 X_MIN_PIN // PB6
|
||||||
|
@ -3,9 +3,10 @@
|
|||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <util/delay.h>
|
#include <util/delay.h>
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
|
#include "stdbool.h"
|
||||||
#include "Configuration_prusa.h"
|
#include "Configuration_prusa.h"
|
||||||
#include "pins.h"
|
#include "pins.h"
|
||||||
#include "io_atmega2560.h"
|
#include "fastio.h"
|
||||||
|
|
||||||
|
|
||||||
#define SWI2C_RMSK 0x01 //read mask (bit0 = 1)
|
#define SWI2C_RMSK 0x01 //read mask (bit0 = 1)
|
||||||
@ -21,75 +22,75 @@ void __delay(void)
|
|||||||
|
|
||||||
void swi2c_init(void)
|
void swi2c_init(void)
|
||||||
{
|
{
|
||||||
PIN_OUT(SWI2C_SDA);
|
WRITE(SWI2C_SDA, 1);
|
||||||
PIN_OUT(SWI2C_SCL);
|
WRITE(SWI2C_SCL, 1);
|
||||||
PIN_SET(SWI2C_SDA);
|
SET_OUTPUT(SWI2C_SDA);
|
||||||
PIN_SET(SWI2C_SCL);
|
SET_OUTPUT(SWI2C_SCL);
|
||||||
uint8_t i; for (i = 0; i < 100; i++)
|
uint8_t i; for (i = 0; i < 100; i++)
|
||||||
__delay();
|
__delay();
|
||||||
}
|
}
|
||||||
|
|
||||||
void swi2c_start(void)
|
void swi2c_start(void)
|
||||||
{
|
{
|
||||||
PIN_CLR(SWI2C_SDA);
|
WRITE(SWI2C_SDA, 0);
|
||||||
__delay();
|
__delay();
|
||||||
PIN_CLR(SWI2C_SCL);
|
WRITE(SWI2C_SCL, 0);
|
||||||
__delay();
|
__delay();
|
||||||
}
|
}
|
||||||
|
|
||||||
void swi2c_stop(void)
|
void swi2c_stop(void)
|
||||||
{
|
{
|
||||||
PIN_SET(SWI2C_SCL);
|
WRITE(SWI2C_SCL, 1);
|
||||||
__delay();
|
__delay();
|
||||||
PIN_SET(SWI2C_SDA);
|
WRITE(SWI2C_SDA, 1);
|
||||||
__delay();
|
__delay();
|
||||||
}
|
}
|
||||||
|
|
||||||
void swi2c_ack(void)
|
void swi2c_ack(void)
|
||||||
{
|
{
|
||||||
PIN_CLR(SWI2C_SDA);
|
WRITE(SWI2C_SDA, 0);
|
||||||
__delay();
|
__delay();
|
||||||
PIN_SET(SWI2C_SCL);
|
WRITE(SWI2C_SCL, 1);
|
||||||
__delay();
|
__delay();
|
||||||
PIN_CLR(SWI2C_SCL);
|
WRITE(SWI2C_SCL, 0);
|
||||||
__delay();
|
__delay();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t swi2c_wait_ack()
|
uint8_t swi2c_wait_ack()
|
||||||
{
|
{
|
||||||
PIN_INP(SWI2C_SDA);
|
SET_INPUT(SWI2C_SDA);
|
||||||
__delay();
|
__delay();
|
||||||
// PIN_SET(SWI2C_SDA);
|
// WRITE(SWI2C_SDA, 1);
|
||||||
__delay();
|
__delay();
|
||||||
PIN_SET(SWI2C_SCL);
|
WRITE(SWI2C_SCL, 1);
|
||||||
// __delay();
|
// __delay();
|
||||||
uint8_t ack = 0;
|
uint8_t ack = 0;
|
||||||
uint16_t ackto = SWI2C_TMO;
|
uint16_t ackto = SWI2C_TMO;
|
||||||
while (!(ack = (PIN_GET(SWI2C_SDA)?0:1)) && ackto--) __delay();
|
while (!(ack = (!READ(SWI2C_SDA))) && ackto--) __delay();
|
||||||
PIN_CLR(SWI2C_SCL);
|
WRITE(SWI2C_SCL, 0);
|
||||||
__delay();
|
__delay();
|
||||||
PIN_OUT(SWI2C_SDA);
|
SET_OUTPUT(SWI2C_SDA);
|
||||||
__delay();
|
__delay();
|
||||||
PIN_CLR(SWI2C_SDA);
|
WRITE(SWI2C_SDA, 0);
|
||||||
__delay();
|
__delay();
|
||||||
return ack;
|
return ack;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t swi2c_read(void)
|
uint8_t swi2c_read(void)
|
||||||
{
|
{
|
||||||
PIN_SET(SWI2C_SDA);
|
WRITE(SWI2C_SDA, 1);
|
||||||
__delay();
|
__delay();
|
||||||
PIN_INP(SWI2C_SDA);
|
SET_INPUT(SWI2C_SDA);
|
||||||
uint8_t data = 0;
|
uint8_t data = 0;
|
||||||
int8_t bit; for (bit = 7; bit >= 0; bit--)
|
int8_t bit; for (bit = 7; bit >= 0; bit--)
|
||||||
{
|
{
|
||||||
PIN_SET(SWI2C_SCL);
|
WRITE(SWI2C_SCL, 1);
|
||||||
__delay();
|
__delay();
|
||||||
data |= (PIN_GET(SWI2C_SDA)?1:0) << bit;
|
data |= (READ(SWI2C_SDA)) << bit;
|
||||||
PIN_CLR(SWI2C_SCL);
|
WRITE(SWI2C_SCL, 0);
|
||||||
__delay();
|
__delay();
|
||||||
}
|
}
|
||||||
PIN_OUT(SWI2C_SDA);
|
SET_OUTPUT(SWI2C_SDA);
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,12 +98,11 @@ void swi2c_write(uint8_t data)
|
|||||||
{
|
{
|
||||||
int8_t bit; for (bit = 7; bit >= 0; bit--)
|
int8_t bit; for (bit = 7; bit >= 0; bit--)
|
||||||
{
|
{
|
||||||
if (data & (1 << bit)) PIN_SET(SWI2C_SDA);
|
WRITE(SWI2C_SDA, data & _BV(bit));
|
||||||
else PIN_CLR(SWI2C_SDA);
|
|
||||||
__delay();
|
__delay();
|
||||||
PIN_SET(SWI2C_SCL);
|
WRITE(SWI2C_SCL, 1);
|
||||||
__delay();
|
__delay();
|
||||||
PIN_CLR(SWI2C_SCL);
|
WRITE(SWI2C_SCL, 0);
|
||||||
__delay();
|
__delay();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "Marlin.h"
|
#include "Marlin.h"
|
||||||
|
#include "cmdqueue.h"
|
||||||
#include "ultralcd.h"
|
#include "ultralcd.h"
|
||||||
#include "sound.h"
|
#include "sound.h"
|
||||||
#include "temperature.h"
|
#include "temperature.h"
|
||||||
@ -632,7 +633,6 @@ void fanSpeedError(unsigned char _fan) {
|
|||||||
fanSpeedErrorBeep(PSTR("Print fan speed is lower than expected"), MSG_FANCHECK_PRINT);
|
fanSpeedErrorBeep(PSTR("Print fan speed is lower than expected"), MSG_FANCHECK_PRINT);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// SERIAL_PROTOCOLLNRPGM(MSG_OK); //This ok messes things up with octoprint.
|
|
||||||
}
|
}
|
||||||
#endif //(defined(TACH_0) && TACH_0 >-1) || (defined(TACH_1) && TACH_1 > -1)
|
#endif //(defined(TACH_0) && TACH_0 >-1) || (defined(TACH_1) && TACH_1 > -1)
|
||||||
|
|
||||||
|
@ -9,9 +9,6 @@
|
|||||||
|
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
#include "io_atmega2560.h"
|
|
||||||
|
|
||||||
#define BEEPER 84
|
|
||||||
|
|
||||||
void timer0_init(void)
|
void timer0_init(void)
|
||||||
{
|
{
|
||||||
|
@ -10,14 +10,8 @@
|
|||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
#include "pins.h"
|
#include "pins.h"
|
||||||
|
|
||||||
#ifndef CRITICAL_SECTION_START
|
|
||||||
#define CRITICAL_SECTION_START unsigned char _sreg = SREG; cli();
|
|
||||||
#define CRITICAL_SECTION_END SREG = _sreg;
|
|
||||||
#endif //CRITICAL_SECTION_START
|
|
||||||
|
|
||||||
|
|
||||||
#include "fastio.h"
|
#include "fastio.h"
|
||||||
|
#include "macros.h"
|
||||||
|
|
||||||
void timer4_init(void)
|
void timer4_init(void)
|
||||||
{
|
{
|
||||||
@ -79,7 +73,7 @@ ISR(TIMER4_OVF_vect)
|
|||||||
WRITE(BEEPER, 0);
|
WRITE(BEEPER, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tone4(__attribute__((unused)) uint8_t _pin, uint16_t frequency)
|
void tone4(_UNUSED uint8_t _pin, uint16_t frequency)
|
||||||
{
|
{
|
||||||
//this ocr and prescalarbits calculation is taken from the Arduino core and simplified for one type of timer only
|
//this ocr and prescalarbits calculation is taken from the Arduino core and simplified for one type of timer only
|
||||||
uint8_t prescalarbits = 0b001;
|
uint8_t prescalarbits = 0b001;
|
||||||
@ -105,7 +99,7 @@ void tone4(__attribute__((unused)) uint8_t _pin, uint16_t frequency)
|
|||||||
CRITICAL_SECTION_END;
|
CRITICAL_SECTION_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
void noTone4(__attribute__((unused)) uint8_t _pin)
|
void noTone4(_UNUSED uint8_t _pin)
|
||||||
{
|
{
|
||||||
CRITICAL_SECTION_START;
|
CRITICAL_SECTION_START;
|
||||||
// Revert prescaler to CLK/1024
|
// Revert prescaler to CLK/1024
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
#include "rbuf.h"
|
#include "rbuf.h"
|
||||||
|
#include "macros.h"
|
||||||
|
|
||||||
#define UART2_BAUD 115200
|
#define UART2_BAUD 115200
|
||||||
#define UART_BAUD_SELECT(baudRate,xtalCpu) (((float)(xtalCpu))/(((float)(baudRate))*8.0)-1.0+0.5)
|
#define UART_BAUD_SELECT(baudRate,xtalCpu) (((float)(xtalCpu))/(((float)(baudRate))*8.0)-1.0+0.5)
|
||||||
@ -16,7 +17,7 @@ uint8_t uart2_ibuf[14] = {0, 0};
|
|||||||
FILE _uart2io = {0};
|
FILE _uart2io = {0};
|
||||||
|
|
||||||
|
|
||||||
int uart2_putchar(char c, FILE *stream __attribute__((unused)))
|
int uart2_putchar(char c, _UNUSED FILE *stream)
|
||||||
{
|
{
|
||||||
while (!uart2_txready);
|
while (!uart2_txready);
|
||||||
UDR2 = c; // transmit byte
|
UDR2 = c; // transmit byte
|
||||||
@ -25,7 +26,7 @@ int uart2_putchar(char c, FILE *stream __attribute__((unused)))
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int uart2_getchar(FILE *stream __attribute__((unused)))
|
int uart2_getchar(_UNUSED FILE *stream)
|
||||||
{
|
{
|
||||||
if (rbuf_empty(uart2_ibuf)) return -1;
|
if (rbuf_empty(uart2_ibuf)) return -1;
|
||||||
return rbuf_get(uart2_ibuf);
|
return rbuf_get(uart2_ibuf);
|
||||||
|
@ -44,7 +44,6 @@
|
|||||||
#include "mmu.h"
|
#include "mmu.h"
|
||||||
|
|
||||||
#include "static_assert.h"
|
#include "static_assert.h"
|
||||||
#include "io_atmega2560.h"
|
|
||||||
#include "first_lay_cal.h"
|
#include "first_lay_cal.h"
|
||||||
|
|
||||||
#include "fsensor.h"
|
#include "fsensor.h"
|
||||||
@ -1001,6 +1000,36 @@ void lcd_status_screen() // NOT static due to using ins
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ULTIPANEL_FEEDMULTIPLY
|
||||||
|
// Dead zone at 100% feedrate
|
||||||
|
if ((feedmultiply < 100 && (feedmultiply + int(lcd_encoder)) > 100) ||
|
||||||
|
(feedmultiply > 100 && (feedmultiply + int(lcd_encoder)) < 100))
|
||||||
|
{
|
||||||
|
lcd_encoder = 0;
|
||||||
|
feedmultiply = 100;
|
||||||
|
}
|
||||||
|
if (feedmultiply == 100 && int(lcd_encoder) > ENCODER_FEEDRATE_DEADZONE)
|
||||||
|
{
|
||||||
|
feedmultiply += int(lcd_encoder) - ENCODER_FEEDRATE_DEADZONE;
|
||||||
|
lcd_encoder = 0;
|
||||||
|
}
|
||||||
|
else if (feedmultiply == 100 && int(lcd_encoder) < -ENCODER_FEEDRATE_DEADZONE)
|
||||||
|
{
|
||||||
|
feedmultiply += int(lcd_encoder) + ENCODER_FEEDRATE_DEADZONE;
|
||||||
|
lcd_encoder = 0;
|
||||||
|
}
|
||||||
|
else if (feedmultiply != 100)
|
||||||
|
{
|
||||||
|
feedmultiply += int(lcd_encoder);
|
||||||
|
lcd_encoder = 0;
|
||||||
|
}
|
||||||
|
#endif //ULTIPANEL_FEEDMULTIPLY
|
||||||
|
|
||||||
|
if (feedmultiply < 10)
|
||||||
|
feedmultiply = 10;
|
||||||
|
else if (feedmultiply > 999)
|
||||||
|
feedmultiply = 999;
|
||||||
|
|
||||||
if (lcd_status_update_delay)
|
if (lcd_status_update_delay)
|
||||||
lcd_status_update_delay--;
|
lcd_status_update_delay--;
|
||||||
else
|
else
|
||||||
@ -1077,36 +1106,6 @@ void lcd_status_screen() // NOT static due to using ins
|
|||||||
menu_submenu(lcd_main_menu);
|
menu_submenu(lcd_main_menu);
|
||||||
lcd_refresh(); // to maybe revive the LCD if static electricity killed it.
|
lcd_refresh(); // to maybe revive the LCD if static electricity killed it.
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ULTIPANEL_FEEDMULTIPLY
|
|
||||||
// Dead zone at 100% feedrate
|
|
||||||
if ((feedmultiply < 100 && (feedmultiply + int(lcd_encoder)) > 100) ||
|
|
||||||
(feedmultiply > 100 && (feedmultiply + int(lcd_encoder)) < 100))
|
|
||||||
{
|
|
||||||
lcd_encoder = 0;
|
|
||||||
feedmultiply = 100;
|
|
||||||
}
|
|
||||||
if (feedmultiply == 100 && int(lcd_encoder) > ENCODER_FEEDRATE_DEADZONE)
|
|
||||||
{
|
|
||||||
feedmultiply += int(lcd_encoder) - ENCODER_FEEDRATE_DEADZONE;
|
|
||||||
lcd_encoder = 0;
|
|
||||||
}
|
|
||||||
else if (feedmultiply == 100 && int(lcd_encoder) < -ENCODER_FEEDRATE_DEADZONE)
|
|
||||||
{
|
|
||||||
feedmultiply += int(lcd_encoder) + ENCODER_FEEDRATE_DEADZONE;
|
|
||||||
lcd_encoder = 0;
|
|
||||||
}
|
|
||||||
else if (feedmultiply != 100)
|
|
||||||
{
|
|
||||||
feedmultiply += int(lcd_encoder);
|
|
||||||
lcd_encoder = 0;
|
|
||||||
}
|
|
||||||
#endif //ULTIPANEL_FEEDMULTIPLY
|
|
||||||
|
|
||||||
if (feedmultiply < 10)
|
|
||||||
feedmultiply = 10;
|
|
||||||
else if (feedmultiply > 999)
|
|
||||||
feedmultiply = 999;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcd_commands()
|
void lcd_commands()
|
||||||
@ -1583,6 +1582,7 @@ void lcd_return_to_status()
|
|||||||
//! @brief Pause print, disable nozzle heater, move to park position
|
//! @brief Pause print, disable nozzle heater, move to park position
|
||||||
void lcd_pause_print()
|
void lcd_pause_print()
|
||||||
{
|
{
|
||||||
|
SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED); //pause for octoprint
|
||||||
stop_and_save_print_to_ram(0.0, -default_retraction);
|
stop_and_save_print_to_ram(0.0, -default_retraction);
|
||||||
lcd_return_to_status();
|
lcd_return_to_status();
|
||||||
isPrintPaused = true;
|
isPrintPaused = true;
|
||||||
@ -1590,7 +1590,6 @@ void lcd_pause_print()
|
|||||||
{
|
{
|
||||||
lcd_commands_type = LcdCommands::LongPause;
|
lcd_commands_type = LcdCommands::LongPause;
|
||||||
}
|
}
|
||||||
SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED); //pause for octoprint
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3999,7 +3998,7 @@ static void lcd_show_sensors_state()
|
|||||||
finda_state = mmu_finda;
|
finda_state = mmu_finda;
|
||||||
}
|
}
|
||||||
if (ir_sensor_detected) {
|
if (ir_sensor_detected) {
|
||||||
idler_state = !PIN_GET(IR_SENSOR_PIN);
|
idler_state = !READ(IR_SENSOR_PIN);
|
||||||
}
|
}
|
||||||
lcd_puts_at_P(0, 0, _i("Sensor state"));
|
lcd_puts_at_P(0, 0, _i("Sensor state"));
|
||||||
lcd_puts_at_P(1, 1, _i("PINDA:"));
|
lcd_puts_at_P(1, 1, _i("PINDA:"));
|
||||||
@ -6750,6 +6749,7 @@ void lcd_resume_print()
|
|||||||
lcd_return_to_status();
|
lcd_return_to_status();
|
||||||
lcd_reset_alert_level(); //for fan speed error
|
lcd_reset_alert_level(); //for fan speed error
|
||||||
if (fan_error_selftest()) return; //abort if error persists
|
if (fan_error_selftest()) return; //abort if error persists
|
||||||
|
cmdqueue_serial_disabled = false;
|
||||||
|
|
||||||
lcd_setstatuspgm(_T(MSG_FINISHING_MOVEMENTS));
|
lcd_setstatuspgm(_T(MSG_FINISHING_MOVEMENTS));
|
||||||
st_synchronize();
|
st_synchronize();
|
||||||
@ -7362,6 +7362,7 @@ void lcd_print_stop()
|
|||||||
if (!card.sdprinting) {
|
if (!card.sdprinting) {
|
||||||
SERIAL_ECHOLNRPGM(MSG_OCTOPRINT_CANCEL); // for Octoprint
|
SERIAL_ECHOLNRPGM(MSG_OCTOPRINT_CANCEL); // for Octoprint
|
||||||
}
|
}
|
||||||
|
cmdqueue_serial_disabled = false; //for when canceling a print with a fancheck
|
||||||
|
|
||||||
CRITICAL_SECTION_START;
|
CRITICAL_SECTION_START;
|
||||||
|
|
||||||
@ -8484,7 +8485,7 @@ static bool selftest_irsensor()
|
|||||||
mmu_load_step(false);
|
mmu_load_step(false);
|
||||||
while (blocks_queued())
|
while (blocks_queued())
|
||||||
{
|
{
|
||||||
if (PIN_GET(IR_SENSOR_PIN) == 0)
|
if (READ(IR_SENSOR_PIN) == 0)
|
||||||
{
|
{
|
||||||
lcd_selftest_error(TestError::TriggeringFsensor, "", "");
|
lcd_selftest_error(TestError::TriggeringFsensor, "", "");
|
||||||
return false;
|
return false;
|
||||||
@ -8791,26 +8792,42 @@ static void lcd_selftest_screen_step(int _row, int _col, int _state, const char
|
|||||||
|
|
||||||
static bool check_file(const char* filename) {
|
static bool check_file(const char* filename) {
|
||||||
if (farm_mode) return true;
|
if (farm_mode) return true;
|
||||||
bool result = false;
|
|
||||||
uint32_t filesize;
|
|
||||||
card.openFile((char*)filename, true);
|
card.openFile((char*)filename, true);
|
||||||
filesize = card.getFileSize();
|
bool result = false;
|
||||||
|
const uint32_t filesize = card.getFileSize();
|
||||||
|
uint32_t startPos = 0;
|
||||||
|
const uint16_t bytesToCheck = min(END_FILE_SECTION, filesize);
|
||||||
|
uint8_t blocksPrinted = 0;
|
||||||
if (filesize > END_FILE_SECTION) {
|
if (filesize > END_FILE_SECTION) {
|
||||||
card.setIndex(filesize - END_FILE_SECTION);
|
startPos = filesize - END_FILE_SECTION;
|
||||||
|
card.setIndex(startPos);
|
||||||
}
|
}
|
||||||
|
cmdqueue_reset();
|
||||||
|
cmdqueue_serial_disabled = true;
|
||||||
|
|
||||||
|
lcd_clear();
|
||||||
|
lcd_puts_at_P(0, 1, _i("Checking file"));////c=20 r=1
|
||||||
|
lcd_set_cursor(0, 2);
|
||||||
while (!card.eof() && !result) {
|
while (!card.eof() && !result) {
|
||||||
|
for (; blocksPrinted < (((card.get_sdpos() - startPos) * LCD_WIDTH) / bytesToCheck); blocksPrinted++)
|
||||||
|
lcd_print('\xFF'); //simple progress bar
|
||||||
|
|
||||||
card.sdprinting = true;
|
card.sdprinting = true;
|
||||||
get_command();
|
get_command();
|
||||||
result = check_commands();
|
result = check_commands();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (; blocksPrinted < LCD_WIDTH; blocksPrinted++)
|
||||||
|
lcd_print('\xFF'); //simple progress bar
|
||||||
|
_delay(100); //for the user to see the end of the progress bar.
|
||||||
|
|
||||||
|
|
||||||
|
cmdqueue_serial_disabled = false;
|
||||||
card.printingHasFinished();
|
card.printingHasFinished();
|
||||||
|
|
||||||
strncpy_P(lcd_status_message, _T(WELCOME_MSG), LCD_WIDTH);
|
strncpy_P(lcd_status_message, _T(WELCOME_MSG), LCD_WIDTH);
|
||||||
lcd_finishstatus();
|
lcd_finishstatus();
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void menu_action_sdfile(const char* filename)
|
static void menu_action_sdfile(const char* filename)
|
||||||
@ -8978,6 +8995,7 @@ void lcd_ignore_click(bool b)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void lcd_finishstatus() {
|
void lcd_finishstatus() {
|
||||||
|
SERIAL_PROTOCOLLNRPGM(MSG_LCD_STATUS_CHANGED);
|
||||||
int len = strlen(lcd_status_message);
|
int len = strlen(lcd_status_message);
|
||||||
if (len > 0) {
|
if (len > 0) {
|
||||||
while (len < LCD_WIDTH) {
|
while (len < LCD_WIDTH) {
|
||||||
|
@ -3,8 +3,8 @@
|
|||||||
#include "w25x20cl.h"
|
#include "w25x20cl.h"
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
#include "io_atmega2560.h"
|
|
||||||
#include "spi.h"
|
#include "spi.h"
|
||||||
|
#include "fastio.h"
|
||||||
|
|
||||||
#define _MFRID 0xEF
|
#define _MFRID 0xEF
|
||||||
#define _DEVID 0x11
|
#define _DEVID 0x11
|
||||||
@ -31,8 +31,8 @@
|
|||||||
#define _CMD_JEDEC_ID 0x9f
|
#define _CMD_JEDEC_ID 0x9f
|
||||||
#define _CMD_RD_UID 0x4b
|
#define _CMD_RD_UID 0x4b
|
||||||
|
|
||||||
#define _CS_LOW() PORT(W25X20CL_PIN_CS) &= ~__MSK(W25X20CL_PIN_CS)
|
#define _CS_LOW() WRITE(W25X20CL_PIN_CS, 0)
|
||||||
#define _CS_HIGH() PORT(W25X20CL_PIN_CS) |= __MSK(W25X20CL_PIN_CS)
|
#define _CS_HIGH() WRITE(W25X20CL_PIN_CS, 1)
|
||||||
|
|
||||||
//#define _SPI_TX swspi_tx
|
//#define _SPI_TX swspi_tx
|
||||||
//#define _SPI_RX swspi_rx
|
//#define _SPI_RX swspi_rx
|
||||||
@ -45,8 +45,8 @@ int w25x20cl_mfrid_devid(void);
|
|||||||
|
|
||||||
int8_t w25x20cl_init(void)
|
int8_t w25x20cl_init(void)
|
||||||
{
|
{
|
||||||
PIN_OUT(W25X20CL_PIN_CS);
|
|
||||||
_CS_HIGH();
|
_CS_HIGH();
|
||||||
|
SET_OUTPUT(W25X20CL_PIN_CS);
|
||||||
W25X20CL_SPI_ENTER();
|
W25X20CL_SPI_ENTER();
|
||||||
if (!w25x20cl_mfrid_devid()) return 0;
|
if (!w25x20cl_mfrid_devid()) return 0;
|
||||||
return 1;
|
return 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user