Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
M
MarlinKimbra
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
machinery
MarlinKimbra
Commits
86d3dd96
Commit
86d3dd96
authored
Mar 17, 2015
by
MagoKimbra
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update code
parent
ba8f964e
Changes
36
Hide whitespace changes
Inline
Side-by-side
Showing
36 changed files
with
1076 additions
and
996 deletions
+1076
-996
Configuration_Cartesian.h
MarlinKimbra/Configuration_Cartesian.h
+14
-2
Configuration_Corexy.h
MarlinKimbra/Configuration_Corexy.h
+14
-2
Configuration_Scara.h
MarlinKimbra/Configuration_Scara.h
+14
-2
Marlin.h
MarlinKimbra/Marlin.h
+3
-0
MarlinSerial.cpp
MarlinKimbra/MarlinSerial.cpp
+1
-1
MarlinSerial.h
MarlinKimbra/MarlinSerial.h
+2
-2
Marlin_main.cpp
MarlinKimbra/Marlin_main.cpp
+118
-83
Sd2Card.cpp
MarlinKimbra/Sd2Card.cpp
+9
-9
Sd2PinMap.h
MarlinKimbra/Sd2PinMap.h
+4
-4
SdBaseFile.h
MarlinKimbra/SdBaseFile.h
+2
-2
SdVolume.cpp
MarlinKimbra/SdVolume.cpp
+1
-1
dogm_lcd_implementation.h
MarlinKimbra/dogm_lcd_implementation.h
+3
-3
language_an.h
MarlinKimbra/language_an.h
+11
-4
language_ca.h
MarlinKimbra/language_ca.h
+7
-0
language_de.h
MarlinKimbra/language_de.h
+7
-0
language_en.h
MarlinKimbra/language_en.h
+7
-0
language_es.h
MarlinKimbra/language_es.h
+7
-0
language_eu.h
MarlinKimbra/language_eu.h
+7
-0
language_fi.h
MarlinKimbra/language_fi.h
+7
-0
language_fr.h
MarlinKimbra/language_fr.h
+7
-0
language_it.h
MarlinKimbra/language_it.h
+7
-0
language_nl.h
MarlinKimbra/language_nl.h
+7
-0
language_pl.h
MarlinKimbra/language_pl.h
+7
-0
language_pt-br.h
MarlinKimbra/language_pt-br.h
+7
-0
language_pt.h
MarlinKimbra/language_pt.h
+13
-6
language_ru.h
MarlinKimbra/language_ru.h
+7
-0
pins.h
MarlinKimbra/pins.h
+50
-46
pins2tool.h
MarlinKimbra/pins2tool.h
+1
-1
planner.cpp
MarlinKimbra/planner.cpp
+12
-11
stepper.cpp
MarlinKimbra/stepper.cpp
+569
-769
stepper.h
MarlinKimbra/stepper.h
+8
-8
temperature.cpp
MarlinKimbra/temperature.cpp
+19
-19
temperature.h
MarlinKimbra/temperature.h
+1
-1
ultralcd.cpp
MarlinKimbra/ultralcd.cpp
+101
-3
ultralcd.h
MarlinKimbra/ultralcd.h
+5
-0
ultralcd_implementation_hitachi_HD44780.h
MarlinKimbra/ultralcd_implementation_hitachi_HD44780.h
+17
-17
No files found.
MarlinKimbra/Configuration_Cartesian.h
View file @
86d3dd96
...
...
@@ -123,17 +123,29 @@ const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the lo
#define AUTO_BED_LEVELING_GRID
#ifdef AUTO_BED_LEVELING_GRID
// Use one of these defines to specify the origin
// for a topographical map to be printed for your bed.
enum
{
OriginBackLeft
,
OriginFrontLeft
,
OriginBackRight
,
OriginFrontRight
};
#define TOPO_ORIGIN OriginFrontLeft
#define MIN_PROBE_EDGE 10 // The probe square sides can be no smaller than this
// Set the number of grid points per dimension
// You probably don't need more than 3 (squared=9)
#define AUTO_BED_LEVELING_GRID_POINTS 2
#else // not AUTO_BED_LEVELING_GRID
// with no grid, just probe 3 arbitrary points. A simple cross-product
// is used to estimate the plane of the print bed
// Arbitrary points to probe. A simple cross-product
// is used to estimate the plane of the bed.
#define ABL_PROBE_PT_1_X 15
#define ABL_PROBE_PT_1_Y 180
#define ABL_PROBE_PT_2_X 15
#define ABL_PROBE_PT_2_Y 20
#define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20
#endif // AUTO_BED_LEVELING_GRID
// Offsets to the probe relative to the extruder tip (Hotend - Probe)
...
...
MarlinKimbra/Configuration_Corexy.h
View file @
86d3dd96
...
...
@@ -123,17 +123,29 @@ const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the lo
#define AUTO_BED_LEVELING_GRID
#ifdef AUTO_BED_LEVELING_GRID
// Use one of these defines to specify the origin
// for a topographical map to be printed for your bed.
enum
{
OriginBackLeft
,
OriginFrontLeft
,
OriginBackRight
,
OriginFrontRight
};
#define TOPO_ORIGIN OriginFrontLeft
#define MIN_PROBE_EDGE 10 // The probe square sides can be no smaller than this
// Set the number of grid points per dimension
// You probably don't need more than 3 (squared=9)
#define AUTO_BED_LEVELING_GRID_POINTS 2
#else // not AUTO_BED_LEVELING_GRID
// with no grid, just probe 3 arbitrary points. A simple cross-product
// is used to estimate the plane of the print bed
// Arbitrary points to probe. A simple cross-product
// is used to estimate the plane of the bed.
#define ABL_PROBE_PT_1_X 15
#define ABL_PROBE_PT_1_Y 180
#define ABL_PROBE_PT_2_X 15
#define ABL_PROBE_PT_2_Y 20
#define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20
#endif // AUTO_BED_LEVELING_GRID
// Offsets to the probe relative to the extruder tip (Hotend - Probe)
...
...
MarlinKimbra/Configuration_Scara.h
View file @
86d3dd96
...
...
@@ -147,17 +147,29 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the lo
#define AUTO_BED_LEVELING_GRID
#ifdef AUTO_BED_LEVELING_GRID
// Use one of these defines to specify the origin
// for a topographical map to be printed for your bed.
enum
{
OriginBackLeft
,
OriginFrontLeft
,
OriginBackRight
,
OriginFrontRight
};
#define TOPO_ORIGIN OriginFrontLeft
#define MIN_PROBE_EDGE 10 // The probe square sides can be no smaller than this
// Set the number of grid points per dimension
// You probably don't need more than 3 (squared=9)
#define AUTO_BED_LEVELING_GRID_POINTS 2
#else // not AUTO_BED_LEVELING_GRID
// with no grid, just probe 3 arbitrary points. A simple cross-product
// is used to estimate the plane of the print bed
// Arbitrary points to probe. A simple cross-product
// is used to estimate the plane of the bed.
#define ABL_PROBE_PT_1_X 15
#define ABL_PROBE_PT_1_Y 180
#define ABL_PROBE_PT_2_X 15
#define ABL_PROBE_PT_2_Y 20
#define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20
#endif // AUTO_BED_LEVELING_GRID
// Offsets to the probe relative to the extruder tip (Hotend - Probe)
...
...
MarlinKimbra/Marlin.h
View file @
86d3dd96
...
...
@@ -32,6 +32,9 @@
#include "WProgram.h"
#endif
#define BIT(b) (1<<(b))
#define TEST(n,b) (((n)&BIT(b))!=0)
// Arduino < 1.0.0 does not define this, so we need to do it ourselves
#ifndef analogInputToDigitalPin
#define analogInputToDigitalPin(p) ((p) + 0xA0)
...
...
MarlinKimbra/MarlinSerial.cpp
View file @
86d3dd96
...
...
@@ -76,7 +76,7 @@ void MarlinSerial::begin(long baud) {
#endif
if
(
useU2X
)
{
M_UCSRxA
=
1
<<
M_U2Xx
;
M_UCSRxA
=
BIT
(
M_U2Xx
)
;
baud_setting
=
(
F_CPU
/
4
/
baud
-
1
)
/
2
;
}
else
{
M_UCSRxA
=
0
;
...
...
MarlinKimbra/MarlinSerial.h
View file @
86d3dd96
...
...
@@ -97,14 +97,14 @@ class MarlinSerial { //: public Stream
}
FORCE_INLINE
void
write
(
uint8_t
c
)
{
while
(
!
((
M_UCSRxA
)
&
(
1
<<
M_UDREx
)
))
while
(
!
TEST
(
M_UCSRxA
,
M_UDREx
))
;
M_UDRx
=
c
;
}
FORCE_INLINE
void
checkRx
(
void
)
{
if
(
(
M_UCSRxA
&
(
1
<<
M_RXCx
))
!=
0
)
{
if
(
TEST
(
M_UCSRxA
,
M_RXCx
)
)
{
unsigned
char
c
=
M_UDRx
;
int
i
=
(
unsigned
int
)(
rx_buffer
.
head
+
1
)
%
RX_BUFFER_SIZE
;
...
...
MarlinKimbra/Marlin_main.cpp
View file @
86d3dd96
...
...
@@ -1166,6 +1166,24 @@ bool extruder_duplication_enabled = false; // used in mode 2
#endif // SCARA
}
static
void
do_blocking_move_to
(
float
x
,
float
y
,
float
z
)
{
float
oldFeedRate
=
feedrate
;
feedrate
=
homing_feedrate
[
Z_AXIS
];
current_position
[
Z_AXIS
]
=
z
;
plan_buffer_line
(
current_position
[
X_AXIS
],
current_position
[
Y_AXIS
],
current_position
[
Z_AXIS
],
current_position
[
E_AXIS
],
feedrate
/
60
,
active_extruder
,
active_driver
);
st_synchronize
();
feedrate
=
XY_TRAVEL_SPEED
;
current_position
[
X_AXIS
]
=
x
;
current_position
[
Y_AXIS
]
=
y
;
plan_buffer_line
(
current_position
[
X_AXIS
],
current_position
[
Y_AXIS
],
current_position
[
Z_AXIS
],
current_position
[
E_AXIS
],
feedrate
/
60
,
active_extruder
,
active_driver
);
st_synchronize
();
feedrate
=
oldFeedRate
;
}
#ifdef ENABLE_AUTO_BED_LEVELING
#ifdef AUTO_BED_LEVELING_GRID
static
void
set_bed_level_equation_lsq
(
double
*
plane_equation_coefficients
)
{
...
...
@@ -1252,24 +1270,6 @@ bool extruder_duplication_enabled = false; // used in mode 2
plan_set_position
(
current_position
[
X_AXIS
],
current_position
[
Y_AXIS
],
current_position
[
Z_AXIS
],
current_position
[
E_AXIS
]);
}
static
void
do_blocking_move_to
(
float
x
,
float
y
,
float
z
)
{
float
oldFeedRate
=
feedrate
;
feedrate
=
homing_feedrate
[
Z_AXIS
];
current_position
[
Z_AXIS
]
=
z
;
plan_buffer_line
(
current_position
[
X_AXIS
],
current_position
[
Y_AXIS
],
current_position
[
Z_AXIS
],
current_position
[
E_AXIS
],
feedrate
/
60
,
active_extruder
,
active_driver
);
st_synchronize
();
feedrate
=
xy_travel_speed
;
current_position
[
X_AXIS
]
=
x
;
current_position
[
Y_AXIS
]
=
y
;
plan_buffer_line
(
current_position
[
X_AXIS
],
current_position
[
Y_AXIS
],
current_position
[
Z_AXIS
],
current_position
[
E_AXIS
],
feedrate
/
60
,
active_extruder
,
active_driver
);
st_synchronize
();
feedrate
=
oldFeedRate
;
}
static
void
do_blocking_move_relative
(
float
offset_x
,
float
offset_y
,
float
offset_z
)
{
do_blocking_move_to
(
current_position
[
X_AXIS
]
+
offset_x
,
current_position
[
Y_AXIS
]
+
offset_y
,
current_position
[
Z_AXIS
]
+
offset_z
);
}
...
...
@@ -2365,66 +2365,107 @@ inline void gcode_G28(boolean home_x=false, boolean home_y=false) {
#if Z_HOME_DIR < 0 // If homing towards BED do Z last
#ifndef Z_SAFE_HOMING
if
(
code_seen
(
'M'
)
&&
!
(
home_x
||
home_y
))
{
// Manual G28
if
(
code_seen
(
'M'
)
&&
!
(
home_x
||
home_y
))
{
// Manual G28 bed level
#ifdef ULTIPANEL
if
(
home_all_axis
)
{
boolean
zig
=
true
;
int
xGridSpacing
=
(
RIGHT_PROBE_BED_POSITION
-
LEFT_PROBE_BED_POSITION
);
int
yGridSpacing
=
(
BACK_PROBE_BED_POSITION
-
FRONT_PROBE_BED_POSITION
);
for
(
int
yProbe
=
FRONT_PROBE_BED_POSITION
;
yProbe
<=
BACK_PROBE_BED_POSITION
;
yProbe
+=
yGridSpacing
)
{
int
xProbe
,
xInc
;
if
(
zig
)
{
// zig
xProbe
=
LEFT_PROBE_BED_POSITION
;
xInc
=
xGridSpacing
;
zig
=
false
;
}
else
// zag
{
xProbe
=
RIGHT_PROBE_BED_POSITION
;
xInc
=
-
xGridSpacing
;
zig
=
true
;
}
for
(
int
xCount
=
0
;
xCount
<
2
;
xCount
++
)
{
destination
[
X_AXIS
]
=
xProbe
;
destination
[
Y_AXIS
]
=
yProbe
;
destination
[
Z_AXIS
]
=
5
*
home_dir
(
Z_AXIS
)
*
(
-
1
);
feedrate
=
XY_TRAVEL_SPEED
;
current_position
[
Z_AXIS
]
=
0
;
plan_set_position
(
current_position
[
X_AXIS
],
current_position
[
Y_AXIS
],
current_position
[
Z_AXIS
],
current_position
[
E_AXIS
]);
plan_buffer_line
(
destination
[
X_AXIS
],
destination
[
Y_AXIS
],
destination
[
Z_AXIS
],
destination
[
E_AXIS
],
feedrate
/
60
,
active_extruder
,
active_driver
);
st_synchronize
();
current_position
[
X_AXIS
]
=
destination
[
X_AXIS
];
current_position
[
Y_AXIS
]
=
destination
[
Y_AXIS
];
HOMEAXIS
(
Z
);
lcd_setstatus
(
"Press button "
);
boolean
beepbutton
=
true
;
while
(
!
lcd_clicked
())
{
manage_heater
();
manage_inactivity
();
lcd_update
();
if
(
beepbutton
)
{
#if BEEPER > 0
SET_OUTPUT
(
BEEPER
);
WRITE
(
BEEPER
,
HIGH
);
delay
(
100
);
WRITE
(
BEEPER
,
LOW
);
delay
(
3
);
#else
#if !defined(LCD_FEEDBACK_FREQUENCY_HZ) || !defined(LCD_FEEDBACK_FREQUENCY_DURATION_MS)
lcd_buzz
(
1000
/
6
,
100
);
#else
lcd_buzz
(
LCD_FEEDBACK_FREQUENCY_DURATION_MS
,
LCD_FEEDBACK_FREQUENCY_HZ
);
#endif
#endif
beepbutton
=
false
;
}
}
xProbe
+=
xInc
;
}
}
lcd_setstatus
(
"Finish "
);
enquecommands_P
(
PSTR
(
"G28 X0 Y0
\n
G4 P0
\n
G4 P0
\n
G4 P0"
));
SERIAL_ECHOLN
(
" --LEVEL PLATE SCRIPT--"
);
set_ChangeScreen
(
true
);
while
(
!
lcd_clicked
())
{
set_pageShowInfo
(
0
);
lcd_update
();
}
saved_feedrate
=
feedrate
;
saved_feedmultiply
=
feedmultiply
;
feedmultiply
=
100
;
previous_millis_cmd
=
millis
();
enable_endstops
(
true
);
for
(
int8_t
i
=
0
;
i
<
NUM_AXIS
;
i
++
)
{
destination
[
i
]
=
current_position
[
i
];
}
feedrate
=
0.0
;
#if Z_HOME_DIR > 0 // If homing away from BED do Z first
HOMEAXIS
(
Z
);
#endif
HOMEAXIS
(
X
);
HOMEAXIS
(
Y
);
#if Z_HOME_DIR < 0
HOMEAXIS
(
Z
);
#endif
plan_set_position
(
current_position
[
X_AXIS
],
current_position
[
Y_AXIS
],
current_position
[
Z_AXIS
],
current_position
[
E_AXIS
]);
#ifdef ENDSTOPS_ONLY_FOR_HOMING
enable_endstops
(
false
);
#endif
feedrate
=
saved_feedrate
;
feedmultiply
=
saved_feedmultiply
;
previous_millis_cmd
=
millis
();
endstops_hit_on_purpose
();
plan_set_position
(
current_position
[
X_AXIS
],
current_position
[
Y_AXIS
],
current_position
[
Z_AXIS
],
current_position
[
E_AXIS
]);
do_blocking_move_to
(
current_position
[
X_AXIS
],
current_position
[
Y_AXIS
],
Z_MIN_POS
+
5
);
// PROBE FIRST POINT
set_pageShowInfo
(
1
);
set_ChangeScreen
(
true
);
do_blocking_move_to
(
LEFT_PROBE_BED_POSITION
,
FRONT_PROBE_BED_POSITION
,
current_position
[
Z_AXIS
]);
do_blocking_move_to
(
current_position
[
X_AXIS
],
current_position
[
Y_AXIS
],
Z_MIN_POS
);
while
(
!
lcd_clicked
())
{
manage_heater
();
manage_inactivity
();
}
// PROBE SECOND POINT
set_ChangeScreen
(
true
);
set_pageShowInfo
(
2
);
do_blocking_move_to
(
current_position
[
X_AXIS
],
current_position
[
Y_AXIS
],
Z_MIN_POS
+
5
);
do_blocking_move_to
(
RIGHT_PROBE_BED_POSITION
,
FRONT_PROBE_BED_POSITION
,
current_position
[
Z_AXIS
]);
do_blocking_move_to
(
current_position
[
X_AXIS
],
current_position
[
Y_AXIS
],
Z_MIN_POS
);
while
(
!
lcd_clicked
())
{
manage_heater
();
manage_inactivity
();
}
// PROBE THIRD POINT
set_ChangeScreen
(
true
);
set_pageShowInfo
(
3
);
do_blocking_move_to
(
current_position
[
X_AXIS
],
current_position
[
Y_AXIS
],
Z_MIN_POS
+
5
);
do_blocking_move_to
(
RIGHT_PROBE_BED_POSITION
,
BACK_PROBE_BED_POSITION
,
current_position
[
Z_AXIS
]);
do_blocking_move_to
(
current_position
[
X_AXIS
],
current_position
[
Y_AXIS
],
Z_MIN_POS
);
while
(
!
lcd_clicked
())
{
manage_heater
();
manage_inactivity
();
}
// PROBE FOURTH POINT
set_ChangeScreen
(
true
);
set_pageShowInfo
(
4
);
do_blocking_move_to
(
current_position
[
X_AXIS
],
current_position
[
Y_AXIS
],
Z_MIN_POS
+
5
);
do_blocking_move_to
(
LEFT_PROBE_BED_POSITION
,
BACK_PROBE_BED_POSITION
,
current_position
[
Z_AXIS
]);
do_blocking_move_to
(
current_position
[
X_AXIS
],
current_position
[
Y_AXIS
],
Z_MIN_POS
);
while
(
!
lcd_clicked
())
{
manage_heater
();
manage_inactivity
();
}
// PROBE CENTER
set_ChangeScreen
(
true
);
set_pageShowInfo
(
5
);
do_blocking_move_to
(
current_position
[
X_AXIS
],
current_position
[
Y_AXIS
],
Z_MIN_POS
+
5
);
do_blocking_move_to
((
X_MAX_POS
-
X_MIN_POS
)
/
2
,
(
Y_MAX_POS
-
Y_MIN_POS
)
/
2
,
current_position
[
Z_AXIS
]);
do_blocking_move_to
(
current_position
[
X_AXIS
],
current_position
[
Y_AXIS
],
Z_MIN_POS
);
while
(
!
lcd_clicked
())
{
manage_heater
();
manage_inactivity
();
}
// FINISH MANUAL BED LEVEL
set_ChangeScreen
(
true
);
set_pageShowInfo
(
6
);
do_blocking_move_to
(
current_position
[
X_AXIS
],
current_position
[
Y_AXIS
],
Z_MIN_POS
+
5
);
enquecommands_P
(
PSTR
(
"G28 X0 Y0
\n
G4 P0
\n
G4 P0
\n
G4 P0"
));
#endif // ULTIPANEL
}
else
if
((
home_all_axis
)
||
(
code_seen
(
axis_codes
[
Z_AXIS
])))
...
...
@@ -2593,12 +2634,6 @@ inline void gcode_G28(boolean home_x=false, boolean home_y=false) {
* Usage: "G29 E" or "G29 e"
*
*/
// Use one of these defines to specify the origin
// for a topographical map to be printed for your bed.
enum
{
OriginBackLeft
,
OriginFrontLeft
,
OriginBackRight
,
OriginFrontRight
};
#define TOPO_ORIGIN OriginFrontLeft
inline
void
gcode_G29
()
{
// Prevent user from running a G29 without first homing in X and Y
...
...
@@ -2624,7 +2659,7 @@ inline void gcode_G28(boolean home_x=false, boolean home_y=false) {
#ifdef AUTO_BED_LEVELING_GRID
bool
topo_flag
=
verbose_level
>
2
||
code_seen
(
'T'
)
||
code_seen
(
't'
);
bool
topo_flag
=
code_seen
(
'T'
)
||
code_seen
(
't'
);
if
(
verbose_level
>
0
)
SERIAL_PROTOCOLPGM
(
"G29 Auto Bed Leveling
\n
"
);
...
...
MarlinKimbra/Sd2Card.cpp
View file @
86d3dd96
...
...
@@ -35,14 +35,14 @@
*/
static
void
spiInit
(
uint8_t
spiRate
)
{
// See avr processor documentation
SPCR
=
(
1
<<
SPE
)
|
(
1
<<
MSTR
)
|
(
spiRate
>>
1
);
SPSR
=
spiRate
&
1
||
spiRate
==
6
?
0
:
1
<<
SPI2X
;
SPCR
=
BIT
(
SPE
)
|
BIT
(
MSTR
)
|
(
spiRate
>>
1
);
SPSR
=
spiRate
&
1
||
spiRate
==
6
?
0
:
BIT
(
SPI2X
)
;
}
//------------------------------------------------------------------------------
/** SPI receive a byte */
static
uint8_t
spiRec
()
{
SPDR
=
0XFF
;
while
(
!
(
SPSR
&
(
1
<<
SPIF
)
))
{
/* Intentionally left empty */
}
while
(
!
TEST
(
SPSR
,
SPIF
))
{
/* Intentionally left empty */
}
return
SPDR
;
}
//------------------------------------------------------------------------------
...
...
@@ -52,18 +52,18 @@ void spiRead(uint8_t* buf, uint16_t nbyte) {
if
(
nbyte
--
==
0
)
return
;
SPDR
=
0XFF
;
for
(
uint16_t
i
=
0
;
i
<
nbyte
;
i
++
)
{
while
(
!
(
SPSR
&
(
1
<<
SPIF
)
))
{
/* Intentionally left empty */
}
while
(
!
TEST
(
SPSR
,
SPIF
))
{
/* Intentionally left empty */
}
buf
[
i
]
=
SPDR
;
SPDR
=
0XFF
;
}
while
(
!
(
SPSR
&
(
1
<<
SPIF
)
))
{
/* Intentionally left empty */
}
while
(
!
TEST
(
SPSR
,
SPIF
))
{
/* Intentionally left empty */
}
buf
[
nbyte
]
=
SPDR
;
}
//------------------------------------------------------------------------------
/** SPI send a byte */
static
void
spiSend
(
uint8_t
b
)
{
SPDR
=
b
;
while
(
!
(
SPSR
&
(
1
<<
SPIF
)
))
{
/* Intentionally left empty */
}
while
(
!
TEST
(
SPSR
,
SPIF
))
{
/* Intentionally left empty */
}
}
//------------------------------------------------------------------------------
/** SPI send block - only one call so force inline */
...
...
@@ -71,12 +71,12 @@ static inline __attribute__((always_inline))
void
spiSendBlock
(
uint8_t
token
,
const
uint8_t
*
buf
)
{
SPDR
=
token
;
for
(
uint16_t
i
=
0
;
i
<
512
;
i
+=
2
)
{
while
(
!
(
SPSR
&
(
1
<<
SPIF
)
))
{
/* Intentionally left empty */
}
while
(
!
TEST
(
SPSR
,
SPIF
))
{
/* Intentionally left empty */
}
SPDR
=
buf
[
i
];
while
(
!
(
SPSR
&
(
1
<<
SPIF
)
))
{
/* Intentionally left empty */
}
while
(
!
TEST
(
SPSR
,
SPIF
))
{
/* Intentionally left empty */
}
SPDR
=
buf
[
i
+
1
];
}
while
(
!
(
SPSR
&
(
1
<<
SPIF
)
))
{
/* Intentionally left empty */
}
while
(
!
TEST
(
SPSR
,
SPIF
))
{
/* Intentionally left empty */
}
}
//------------------------------------------------------------------------------
#else // SOFTWARE_SPI
...
...
MarlinKimbra/Sd2PinMap.h
View file @
86d3dd96
...
...
@@ -334,9 +334,9 @@ static inline __attribute__((always_inline))
void
setPinMode
(
uint8_t
pin
,
uint8_t
mode
)
{
if
(
__builtin_constant_p
(
pin
)
&&
pin
<
digitalPinCount
)
{
if
(
mode
)
{
*
digitalPinMap
[
pin
].
ddr
|=
1
<<
digitalPinMap
[
pin
].
bit
;
*
digitalPinMap
[
pin
].
ddr
|=
BIT
(
digitalPinMap
[
pin
].
bit
)
;
}
else
{
*
digitalPinMap
[
pin
].
ddr
&=
~
(
1
<<
digitalPinMap
[
pin
].
bit
);
*
digitalPinMap
[
pin
].
ddr
&=
~
BIT
(
digitalPinMap
[
pin
].
bit
);
}
}
else
{
badPinNumber
();
...
...
@@ -354,9 +354,9 @@ static inline __attribute__((always_inline))
void
fastDigitalWrite
(
uint8_t
pin
,
uint8_t
value
)
{
if
(
__builtin_constant_p
(
pin
)
&&
pin
<
digitalPinCount
)
{
if
(
value
)
{
*
digitalPinMap
[
pin
].
port
|=
1
<<
digitalPinMap
[
pin
].
bit
;
*
digitalPinMap
[
pin
].
port
|=
BIT
(
digitalPinMap
[
pin
].
bit
)
;
}
else
{
*
digitalPinMap
[
pin
].
port
&=
~
(
1
<<
digitalPinMap
[
pin
].
bit
);
*
digitalPinMap
[
pin
].
port
&=
~
BIT
(
digitalPinMap
[
pin
].
bit
);
}
}
else
{
badPinNumber
();
...
...
MarlinKimbra/SdBaseFile.h
View file @
86d3dd96
...
...
@@ -171,9 +171,9 @@ static inline uint8_t FAT_SECOND(uint16_t fatTime) {
return
2
*
(
fatTime
&
0X1F
);
}
/** Default date for file timestamps is 1 Jan 2000 */
uint16_t
const
FAT_DEFAULT_DATE
=
((
2000
-
1980
)
<<
9
)
|
(
1
<<
5
)
|
1
;
uint16_t
const
FAT_DEFAULT_DATE
=
((
2000
-
1980
)
<<
9
)
|
BIT
(
5
)
|
1
;
/** Default time for file timestamp is 1 am */
uint16_t
const
FAT_DEFAULT_TIME
=
(
1
<<
11
);
uint16_t
const
FAT_DEFAULT_TIME
=
BIT
(
11
);
//------------------------------------------------------------------------------
/**
* \class SdBaseFile
...
...
MarlinKimbra/SdVolume.cpp
View file @
86d3dd96
...
...
@@ -360,7 +360,7 @@ bool SdVolume::init(Sd2Card* dev, uint8_t part) {
blocksPerCluster_
=
fbs
->
sectorsPerCluster
;
// determine shift that is same as multiply by blocksPerCluster_
clusterSizeShift_
=
0
;
while
(
blocksPerCluster_
!=
(
1
<<
clusterSizeShift_
))
{
while
(
blocksPerCluster_
!=
BIT
(
clusterSizeShift_
))
{
// error if not power of 2
if
(
clusterSizeShift_
++
>
7
)
goto
fail
;
}
...
...
MarlinKimbra/dogm_lcd_implementation.h
View file @
86d3dd96
...
...
@@ -24,9 +24,9 @@
#define BLEN_A 0
#define BLEN_B 1
#define BLEN_C 2
#define EN_A
(1<<
BLEN_A)
#define EN_B
(1<<
BLEN_B)
#define EN_C
(1<<
BLEN_C)
#define EN_A
BIT(
BLEN_A)
#define EN_B
BIT(
BLEN_B)
#define EN_C
BIT(
BLEN_C)
#define LCD_CLICKED (buttons&EN_C)
#endif
...
...
MarlinKimbra/language_an.h
View file @
86d3dd96
...
...
@@ -16,6 +16,13 @@
#define MSG_DISABLE_STEPPERS "Amortar motors"
#define MSG_AUTO_HOME "Levar a l'orichen"
#define MSG_BED_SETTING "Bed Setting"
#define MSG_LP_INTRO " Leveling bed... Press to start "
#define MSG_LP_1 " Adjust first point & Press the button"
#define MSG_LP_2 " Adjust second point & Press the button"
#define MSG_LP_3 " Adjust third point & Press the button"
#define MSG_LP_4 " Adjust fourth point & Press the button"
#define MSG_LP_5 " Is it ok? Press to end"
#define MSG_LP_6 " BED leveled!"
#define MSG_SET_HOME_OFFSETS "Set home offsets"
#define MSG_SET_ORIGIN "Establir zero"
#define MSG_PREHEAT_PLA "Precalentar PLA"
...
...
@@ -49,9 +56,9 @@
#define MSG_FAN_SPEED "Ixoriador"
#define MSG_FLOW "Fluxo"
#define MSG_CONTROL "Control"
#define MSG_MIN "
\002
Min"
#define MSG_MAX "
\002
Max"
#define MSG_FACTOR "
\002
Fact"
#define MSG_MIN "
" STR_THERMOMETER "
Min"
#define MSG_MAX "
" STR_THERMOMETER "
Max"
#define MSG_FACTOR "
" STR_THERMOMETER "
Fact"
#define MSG_AUTOTEMP "Autotemp"
#define MSG_ON "On"
#define MSG_OFF "Off"
...
...
@@ -82,7 +89,7 @@
#define MSG_TEMPERATURE "Temperatura"
#define MSG_MOTION "Movimiento"
#define MSG_VOLUMETRIC "Filament"
#define MSG_VOLUMETRIC_ENABLED "E in mm
3"
#define MSG_VOLUMETRIC_ENABLED "E in mm
" STR_h3
#define MSG_FILAMENT_SIZE_EXTRUDER "Fil. Dia."
#define MSG_CONTRAST "Contrast"
#define MSG_STORE_EPROM "Alzar Memoria"
...
...
MarlinKimbra/language_ca.h
View file @
86d3dd96
...
...
@@ -16,6 +16,13 @@
#define MSG_DISABLE_STEPPERS "Apagar motors"
#define MSG_AUTO_HOME "Home global"
#define MSG_BED_SETTING "Bed Setting"
#define MSG_LP_INTRO " Leveling bed... Press to start "
#define MSG_LP_1 " Adjust first point & Press the button"
#define MSG_LP_2 " Adjust second point & Press the button"
#define MSG_LP_3 " Adjust third point & Press the button"
#define MSG_LP_4 " Adjust fourth point & Press the button"
#define MSG_LP_5 " Is it ok? Press to end"
#define MSG_LP_6 " BED leveled!"
#define MSG_SET_HOME_OFFSETS "Set home offsets"
#define MSG_SET_ORIGIN "Establir origen"
#define MSG_PREHEAT_PLA "Preescalfar PLA"
...
...
MarlinKimbra/language_de.h
View file @
86d3dd96
...
...
@@ -16,6 +16,13 @@
#define MSG_DISABLE_STEPPERS "Stepper abschalt."
#define MSG_AUTO_HOME "Auto Nullpunkt"
#define MSG_BED_SETTING "Bed Setting"
#define MSG_LP_INTRO " Leveling bed... Press to start "
#define MSG_LP_1 " Adjust first point & Press the button"
#define MSG_LP_2 " Adjust second point & Press the button"
#define MSG_LP_3 " Adjust third point & Press the button"
#define MSG_LP_4 " Adjust fourth point & Press the button"
#define MSG_LP_5 " Is it ok? Press to end"
#define MSG_LP_6 " BED leveled!"
#define MSG_SET_HOME_OFFSETS "Set home offsets"
#define MSG_SET_ORIGIN "Setze Nullpunkt"
#define MSG_PREHEAT_PLA "Vorwärmen PLA"
...
...
MarlinKimbra/language_en.h
View file @
86d3dd96
...
...
@@ -16,6 +16,13 @@
#define MSG_DISABLE_STEPPERS "Disable steppers"
#define MSG_AUTO_HOME "Auto home"
#define MSG_BED_SETTING "Bed Setting"
#define MSG_LP_INTRO " Leveling bed... Press to start "
#define MSG_LP_1 " Adjust first point & Press the button"
#define MSG_LP_2 " Adjust second point & Press the button"
#define MSG_LP_3 " Adjust third point & Press the button"
#define MSG_LP_4 " Adjust fourth point & Press the button"
#define MSG_LP_5 " Is it ok? Press to end"
#define MSG_LP_6 " BED leveled!"
#define MSG_SET_HOME_OFFSETS "Set home offsets"
#define MSG_SET_ORIGIN "Set origin"
#define MSG_PREHEAT_PLA "Preheat PLA"
...
...
MarlinKimbra/language_es.h
View file @
86d3dd96
...
...
@@ -16,6 +16,13 @@
#define MSG_DISABLE_STEPPERS "Apagar motores"
#define MSG_AUTO_HOME "Llevar al origen"
#define MSG_BED_SETTING "Bed Setting"
#define MSG_LP_INTRO " Leveling bed... Press to start "
#define MSG_LP_1 " Adjust first point & Press the button"
#define MSG_LP_2 " Adjust second point & Press the button"
#define MSG_LP_3 " Adjust third point & Press the button"
#define MSG_LP_4 " Adjust fourth point & Press the button"
#define MSG_LP_5 " Is it ok? Press to end"
#define MSG_LP_6 " BED leveled!"
#define MSG_SET_HOME_OFFSETS "Ajustar offsets"
#define MSG_SET_ORIGIN "Establecer cero"
#define MSG_PREHEAT_PLA "Precalentar PLA"
...
...
MarlinKimbra/language_eu.h
View file @
86d3dd96
...
...
@@ -16,6 +16,13 @@
#define MSG_DISABLE_STEPPERS "Itzali motoreak"
#define MSG_AUTO_HOME "Hasierara joan"
#define MSG_BED_SETTING "Bed Setting"
#define MSG_LP_INTRO " Leveling bed... Press to start "
#define MSG_LP_1 " Adjust first point & Press the button"
#define MSG_LP_2 " Adjust second point & Press the button"
#define MSG_LP_3 " Adjust third point & Press the button"
#define MSG_LP_4 " Adjust fourth point & Press the button"
#define MSG_LP_5 " Is it ok? Press to end"
#define MSG_LP_6 " BED leveled!"
#define MSG_SET_HOME_OFFSETS "Set home offsets"
#define MSG_SET_ORIGIN "Hasiera ipini"
#define MSG_PREHEAT_PLA "Aurreberotu PLA"
...
...
MarlinKimbra/language_fi.h
View file @
86d3dd96
...
...
@@ -16,6 +16,13 @@
#define MSG_DISABLE_STEPPERS "Vapauta moottorit"
#define MSG_AUTO_HOME "Aja referenssiin"
#define MSG_BED_SETTING "Bed Setting"
#define MSG_LP_INTRO " Leveling bed... Press to start "
#define MSG_LP_1 " Adjust first point & Press the button"
#define MSG_LP_2 " Adjust second point & Press the button"
#define MSG_LP_3 " Adjust third point & Press the button"
#define MSG_LP_4 " Adjust fourth point & Press the button"
#define MSG_LP_5 " Is it ok? Press to end"
#define MSG_LP_6 " BED leveled!"
#define MSG_SET_HOME_OFFSETS "Set home offsets"
#define MSG_SET_ORIGIN "Aseta origo"
#define MSG_PREHEAT_PLA "Esil" STR_ae "mmit" STR_ae " PLA"
...
...
MarlinKimbra/language_fr.h
View file @
86d3dd96
...
...
@@ -16,6 +16,13 @@
#define MSG_DISABLE_STEPPERS "Arreter moteurs"
#define MSG_AUTO_HOME "Home auto."
#define MSG_BED_SETTING "Bed Setting"
#define MSG_LP_INTRO " Leveling bed... Press to start "
#define MSG_LP_1 " Adjust first point & Press the button"
#define MSG_LP_2 " Adjust second point & Press the button"
#define MSG_LP_3 " Adjust third point & Press the button"
#define MSG_LP_4 " Adjust fourth point & Press the button"
#define MSG_LP_5 " Is it ok? Press to end"
#define MSG_LP_6 " BED leveled!"
#define MSG_SET_HOME_OFFSETS "Set home offsets"
#define MSG_SET_ORIGIN "Regler origine"
#define MSG_PREHEAT_PLA "Prechauffage PLA"
...
...
MarlinKimbra/language_it.h
View file @
86d3dd96
...
...
@@ -16,6 +16,13 @@
#define MSG_DISABLE_STEPPERS "Disabilita Motori"
#define MSG_AUTO_HOME "Auto Home"
#define MSG_BED_SETTING "Bed Setting"
#define MSG_LP_INTRO " Leveling bed... Press to start "
#define MSG_LP_1 " Adjust first point & Press the button"
#define MSG_LP_2 " Adjust second point & Press the button"
#define MSG_LP_3 " Adjust third point & Press the button"
#define MSG_LP_4 " Adjust fourth point & Press the button"
#define MSG_LP_5 " Is it ok? Press to end"
#define MSG_LP_6 " BED leveled!"
#define MSG_SET_HOME_OFFSETS "Setta offset home"
#define MSG_SET_ORIGIN "Imposta Origine"
#define MSG_PREHEAT_PLA "Preriscalda PLA"
...
...
MarlinKimbra/language_nl.h
View file @
86d3dd96
...
...
@@ -16,6 +16,13 @@
#define MSG_DISABLE_STEPPERS "Motoren uit"
#define MSG_AUTO_HOME "Auto home"
#define MSG_BED_SETTING "Bed Setting"
#define MSG_LP_INTRO " Leveling bed... Press to start "
#define MSG_LP_1 " Adjust first point & Press the button"
#define MSG_LP_2 " Adjust second point & Press the button"
#define MSG_LP_3 " Adjust third point & Press the button"
#define MSG_LP_4 " Adjust fourth point & Press the button"
#define MSG_LP_5 " Is it ok? Press to end"
#define MSG_LP_6 " BED leveled!"
#define MSG_SET_HOME_OFFSETS "Set home offsets"
#define MSG_SET_ORIGIN "Nulpunt instellen"
#define MSG_PREHEAT_PLA "PLA voorverwarmen"
...
...
MarlinKimbra/language_pl.h
View file @
86d3dd96
...
...
@@ -16,6 +16,13 @@
#define MSG_DISABLE_STEPPERS "Wylacz silniki"
#define MSG_AUTO_HOME "Auto. poz. zerowa"
#define MSG_BED_SETTING "Bed Setting"
#define MSG_LP_INTRO " Leveling bed... Press to start "
#define MSG_LP_1 " Adjust first point & Press the button"
#define MSG_LP_2 " Adjust second point & Press the button"
#define MSG_LP_3 " Adjust third point & Press the button"
#define MSG_LP_4 " Adjust fourth point & Press the button"
#define MSG_LP_5 " Is it ok? Press to end"
#define MSG_LP_6 " BED leveled!"
#define MSG_SET_HOME_OFFSETS "Set home offsets"
#define MSG_SET_ORIGIN "Ustaw punkt zero"
#define MSG_PREHEAT_PLA "Rozgrzej PLA"
...
...
MarlinKimbra/language_pt-br.h
View file @
86d3dd96
...
...
@@ -16,6 +16,13 @@
#define MSG_DISABLE_STEPPERS " Apagar motores"
#define MSG_AUTO_HOME "Ir para origen"
#define MSG_BED_SETTING "Bed Setting"
#define MSG_LP_INTRO " Leveling bed... Press to start "
#define MSG_LP_1 " Adjust first point & Press the button"
#define MSG_LP_2 " Adjust second point & Press the button"
#define MSG_LP_3 " Adjust third point & Press the button"
#define MSG_LP_4 " Adjust fourth point & Press the button"
#define MSG_LP_5 " Is it ok? Press to end"
#define MSG_LP_6 " BED leveled!"
#define MSG_SET_HOME_OFFSETS "Set home offsets"
#define MSG_SET_ORIGIN "Estabelecer orig."
#define MSG_PREHEAT_PLA "Pre-aquecer PLA"
...
...
MarlinKimbra/language_pt.h
View file @
86d3dd96
...
...
@@ -16,6 +16,13 @@
#define MSG_DISABLE_STEPPERS " Desligar motores"
#define MSG_AUTO_HOME "Ir para home"
#define MSG_BED_SETTING "Bed Setting"
#define MSG_LP_INTRO " Leveling bed... Press to start "
#define MSG_LP_1 " Adjust first point & Press the button"
#define MSG_LP_2 " Adjust second point & Press the button"
#define MSG_LP_3 " Adjust third point & Press the button"
#define MSG_LP_4 " Adjust fourth point & Press the button"
#define MSG_LP_5 " Is it ok? Press to end"
#define MSG_LP_6 " BED leveled!"
#define MSG_SET_HOME_OFFSETS "Def. home offsets"
#define MSG_SET_ORIGIN "Estabelecer orig."
#define MSG_PREHEAT_PLA "Pre-aquecer PLA"
...
...
@@ -44,14 +51,14 @@
#define MSG_MOVE_1MM "Mover 1mm"
#define MSG_MOVE_10MM "Mover 10mm"
#define MSG_SPEED "Velocidade"
#define MSG_NOZZLE "
\002
Bico"
#define MSG_BED "
\002
Base"
#define MSG_NOZZLE "Bico"
#define MSG_BED "Base"
#define MSG_FAN_SPEED "Velocidade do ar."
#define MSG_FLOW "Fluxo"
#define MSG_CONTROL "Control
o \003
"
#define MSG_MIN "
\002
Min"
#define MSG_MAX "
\002
Max"
#define MSG_FACTOR "
\002
Fact"
#define MSG_CONTROL "Control"
#define MSG_MIN "
" STR_THERMOMETER "
Min"
#define MSG_MAX "
" STR_THERMOMETER "
Max"
#define MSG_FACTOR "
" STR_THERMOMETER "
Fact"
#define MSG_AUTOTEMP "Autotemp"
#define MSG_ON "On "
#define MSG_OFF "Off"
...
...
MarlinKimbra/language_ru.h
View file @
86d3dd96
...
...
@@ -16,6 +16,13 @@
#define MSG_DISABLE_STEPPERS "Выкл. двигатели"
#define MSG_AUTO_HOME "Парковка"
#define MSG_BED_SETTING "Bed Setting"
#define MSG_LP_INTRO " Leveling bed... Press to start "
#define MSG_LP_1 " Adjust first point & Press the button"
#define MSG_LP_2 " Adjust second point & Press the button"
#define MSG_LP_3 " Adjust third point & Press the button"
#define MSG_LP_4 " Adjust fourth point & Press the button"
#define MSG_LP_5 " Is it ok? Press to end"
#define MSG_LP_6 " BED leveled!"
#define MSG_SET_HOME_OFFSETS "Set home offsets"
#define MSG_SET_ORIGIN "Запомнить ноль"
#define MSG_PREHEAT_PLA "Преднагрев PLA"
...
...
MarlinKimbra/pins.h
View file @
86d3dd96
...
...
@@ -4363,6 +4363,8 @@ DaveX plan for Teensylu/printrboard-type pinouts (ref teensylu & sprinter) for a
#endif // 99
/****************************************************************************************/
/****************************************************************************************
********************************* END MOTHERBOARD ***************************************
/****************************************************************************************/
...
...
@@ -4371,52 +4373,6 @@ DaveX plan for Teensylu/printrboard-type pinouts (ref teensylu & sprinter) for a
#error Unknown MOTHERBOARD value in configuration.h
#endif
/****************************************************************************************
************************************* FEATURE *******************************************
/****************************************************************************************/
#ifdef SINGLENOZZLE
#undef HEATER_1_PIN
#undef HEATER_2_PIN
#undef HEATER_3_PIN
#define HEATER_1_PIN -1
#define HEATER_2_PIN -1
#define HEATER_3_PIN -1
#undef TEMP_1_PIN
#undef TEMP_2_PIN
#undef TEMP_3_PIN
#define TEMP_1_PIN -1
#define TEMP_2_PIN -1
#define TEMP_3_PIN -1
#endif //SINGLENOZZLE
#ifdef MKR4
#if (EXTRUDERS == 2) && (DRIVER_EXTRUDERS==1) // Use this for one driver and two extruder
#define E0E1_CHOICE_PIN 5
#elif (EXTRUDERS == 3) && (DRIVER_EXTRUDERS==2) // Use this for two driver and 3 extruder
#define E0E2_CHOICE_PIN 5
#elif (EXTRUDERS == 4) && (DRIVER_EXTRUDERS==2) // Use this for two driver and 4 extruder
#define E0E2_CHOICE_PIN 5
#define E1E3_CHOICE_PIN 6
#endif //EXTRUDERS
#endif //MKR4
#ifdef NPR2
#define E_MIN_PIN 19
#endif //NPR2
#ifdef LASERBEAM
#define LASER_PWR_PIN 42
#define LASER_TTL_PIN 44
#endif
#ifdef FILAMENT_END_SWITCH
#define PAUSE_PIN 19
#endif
/****************************************************************************************/
#ifndef HEATER_1_PIN
#define HEATER_1_PIN -1
#endif
...
...
@@ -4485,6 +4441,54 @@ DaveX plan for Teensylu/printrboard-type pinouts (ref teensylu & sprinter) for a
#define Z_MAX_PIN -1
#endif //Z_HOME_DIR > 0
#endif //!DELTA
/****************************************************************************************/
/****************************************************************************************
************************************* FEATURE *******************************************
/****************************************************************************************/
#ifdef SINGLENOZZLE
#undef HEATER_1_PIN
#undef HEATER_2_PIN
#undef HEATER_3_PIN
#define HEATER_1_PIN -1
#define HEATER_2_PIN -1
#define HEATER_3_PIN -1
#undef TEMP_1_PIN
#undef TEMP_2_PIN
#undef TEMP_3_PIN
#define TEMP_1_PIN -1
#define TEMP_2_PIN -1
#define TEMP_3_PIN -1
#endif //SINGLENOZZLE
#ifdef MKR4
#if (EXTRUDERS == 2) && (DRIVER_EXTRUDERS==1) // Use this for one driver and two extruder
#define E0E1_CHOICE_PIN 5
#elif (EXTRUDERS == 3) && (DRIVER_EXTRUDERS==2) // Use this for two driver and 3 extruder
#define E0E2_CHOICE_PIN 5
#elif (EXTRUDERS == 4) && (DRIVER_EXTRUDERS==2) // Use this for two driver and 4 extruder
#define E0E2_CHOICE_PIN 5
#define E1E3_CHOICE_PIN 6
#endif //EXTRUDERS
#endif //MKR4
#ifdef NPR2
#define E_MIN_PIN 19
#endif //NPR2
#ifdef LASERBEAM
#define LASER_PWR_PIN 42
#define LASER_TTL_PIN 44
#endif
#ifdef FILAMENT_END_SWITCH
#define PAUSE_PIN 19
#endif
/****************************************************************************************/
#include "pins2tool.h"
...
...
MarlinKimbra/pins2tool.h
View file @
86d3dd96
...
...
@@ -40,4 +40,4 @@
//============================================================================
\ No newline at end of file
//============================================================================
MarlinKimbra/planner.cpp
View file @
86d3dd96
...
...
@@ -664,37 +664,37 @@ block->steps_y = labs((target[X_AXIS]-position[X_AXIS]) - (target[Y_AXIS]-positi
#ifndef COREXY
if
(
target
[
X_AXIS
]
<
position
[
X_AXIS
])
{
block
->
direction_bits
|=
(
1
<<
X_AXIS
);
block
->
direction_bits
|=
BIT
(
X_AXIS
);
}
if
(
target
[
Y_AXIS
]
<
position
[
Y_AXIS
])
{
block
->
direction_bits
|=
(
1
<<
Y_AXIS
);
block
->
direction_bits
|=
BIT
(
Y_AXIS
);
}
#else //COREXY
if
(
target
[
X_AXIS
]
<
position
[
X_AXIS
])
{
block
->
direction_bits
|=
(
1
<<
X_HEAD
);
block
->
direction_bits
|=
BIT
(
X_HEAD
);
}
if
(
target
[
Y_AXIS
]
<
position
[
Y_AXIS
])
{
block
->
direction_bits
|=
(
1
<<
Y_HEAD
);
block
->
direction_bits
|=
BIT
(
Y_HEAD
);
}
if
((
target
[
X_AXIS
]
-
position
[
X_AXIS
])
+
(
target
[
Y_AXIS
]
-
position
[
Y_AXIS
])
<
0
)
{
block
->
direction_bits
|=
(
1
<<
X_AXIS
);
block
->
direction_bits
|=
BIT
(
X_AXIS
);
}
if
((
target
[
X_AXIS
]
-
position
[
X_AXIS
])
-
(
target
[
Y_AXIS
]
-
position
[
Y_AXIS
])
<
0
)
{
block
->
direction_bits
|=
(
1
<<
Y_AXIS
);
block
->
direction_bits
|=
BIT
(
Y_AXIS
);
}
#endif //COREXY
if
(
target
[
Z_AXIS
]
<
position
[
Z_AXIS
])
{
block
->
direction_bits
|=
(
1
<<
Z_AXIS
);
block
->
direction_bits
|=
BIT
(
Z_AXIS
);
}
if
(
target
[
E_AXIS
]
<
position
[
E_AXIS
])
{
block
->
direction_bits
|=
(
1
<<
E_AXIS
);
block
->
direction_bits
|=
BIT
(
E_AXIS
);
}
block
->
active_driver
=
driver
;
...
...
@@ -934,7 +934,7 @@ Having the real displacement of the head, we can calculate the total movement le
old_direction_bits
=
block
->
direction_bits
;
segment_time
=
lround
((
float
)
segment_time
/
speed_factor
);
if
((
direction_change
&
(
1
<<
X_AXIS
))
==
0
)
if
((
direction_change
&
BIT
(
X_AXIS
))
==
0
)
{
x_segment_time
[
0
]
+=
segment_time
;
}
...
...
@@ -944,7 +944,7 @@ Having the real displacement of the head, we can calculate the total movement le
x_segment_time
[
1
]
=
x_segment_time
[
0
];
x_segment_time
[
0
]
=
segment_time
;
}
if
((
direction_change
&
(
1
<<
Y_AXIS
))
==
0
)
if
((
direction_change
&
BIT
(
Y_AXIS
))
==
0
)
{
y_segment_time
[
0
]
+=
segment_time
;
}
...
...
@@ -1185,7 +1185,8 @@ void set_extrude_min_temp(float temp) { extrude_min_temp = temp; }
#endif
// Calculate the steps/s^2 acceleration rates, based on the mm/s^s
void
reset_acceleration_rates
()
{
void
reset_acceleration_rates
()
{
for
(
int8_t
i
=
0
;
i
<
3
+
EXTRUDERS
;
i
++
)
{
axis_steps_per_sqr_second
[
i
]
=
max_acceleration_units_per_sq_second
[
i
]
*
axis_steps_per_unit
[
i
];
}
...
...
MarlinKimbra/stepper.cpp
View file @
86d3dd96
...
...
@@ -29,46 +29,47 @@
#include "language.h"
#include "cardreader.h"
#include "speed_lookuptable.h"
#if
defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1
#include <SPI.h>
#if
HAS_DIGIPOTSS
#include <SPI.h>
#endif
//===========================================================================
//=============================
public variables
============================
//=============================
public variables
============================
//===========================================================================
block_t
*
current_block
;
// A pointer to the block currently being traced
//===========================================================================
//=============================
private variables =
===========================
//=============================
private variables
===========================
//===========================================================================
//static makes it impossible to be called from outside of this file by extern.!
// Variables used by The Stepper Driver Interrupt
static
unsigned
char
out_bits
;
// The next stepping-bits to be output
static
long
counter_x
,
// Counter variables for the bresenham line tracer
counter_y
,
counter_z
,
counter_e
;
// Counter variables for the bresenham line tracer
static
long
counter_x
,
counter_y
,
counter_z
,
counter_e
;
volatile
static
unsigned
long
step_events_completed
;
// The number of step events executed in the current block
#ifdef ADVANCE
static
long
advance_rate
,
advance
,
final_advance
=
0
;
static
long
old_advance
=
0
;
static
long
e_steps
[
4
];
#endif
static
long
acceleration_time
,
deceleration_time
;
//static unsigned long accelerate_until, decelerate_after, acceleration_rate, initial_rate, final_rate, nominal_rate;
static
unsigned
short
acc_step_rate
;
// needed for dec
ele
ration start point
static
unsigned
short
acc_step_rate
;
// needed for dec
cela
ration start point
static
char
step_loops
;
static
unsigned
short
OCR1A_nominal
;
static
unsigned
short
step_loops_nominal
;
volatile
long
endstops_trigsteps
[
3
]
=
{
0
,
0
,
0
};
volatile
long
endstops_stepsTotal
,
endstops_stepsDone
;
static
volatile
bool
endstop_x_hit
=
false
;
static
volatile
bool
endstop_y_hit
=
false
;
static
volatile
bool
endstop_z_hit
=
false
;
volatile
long
endstops_trigsteps
[
3
]
=
{
0
};
volatile
long
endstops_stepsTotal
,
endstops_stepsDone
;
static
volatile
bool
endstop_x_hit
=
false
;
static
volatile
bool
endstop_y_hit
=
false
;
static
volatile
bool
endstop_z_hit
=
false
;
#ifdef NPR2
static
volatile
bool
endstop_e_hit
=
false
;
...
...
@@ -82,201 +83,232 @@ static volatile bool endstop_z_hit=false;
int
motor_current_setting
[
3
]
=
DEFAULT_PWM_MOTOR_CURRENT
;
#endif
static
bool
old_x_min_endstop
=
false
;
static
bool
old_x_max_endstop
=
false
;
static
bool
old_y_min_endstop
=
false
;
static
bool
old_y_max_endstop
=
false
;
static
bool
old_z_min_endstop
=
false
;
static
bool
old_z_max_endstop
=
false
;
static
bool
old_x_min_endstop
=
false
,
old_x_max_endstop
=
false
,
old_y_min_endstop
=
false
,
old_y_max_endstop
=
false
,
old_z_min_endstop
=
false
,
old_z_max_endstop
=
false
;
static
bool
check_endstops
=
true
;
volatile
long
count_position
[
NUM_AXIS
]
=
{
0
,
0
,
0
,
0
};
volatile
signed
char
count_direction
[
NUM_AXIS
]
=
{
1
,
1
,
1
,
1
};
volatile
long
count_position
[
NUM_AXIS
]
=
{
0
};
volatile
signed
char
count_direction
[
NUM_AXIS
]
=
{
1
};
//===========================================================================
//============================
Functions ====
================================
//============================
==== functions
================================
//===========================================================================
#define CHECK_ENDSTOPS if(check_endstops)
#ifdef DUAL_X_CARRIAGE
#define X_APPLY_DIR(v,ALWAYS) \
if (extruder_duplication_enabled || ALWAYS) { \
X_DIR_WRITE(v); \
X2_DIR_WRITE(v); \
} \
else{ \
if (current_block->active_driver) \
X2_DIR_WRITE(v); \
else \
X_DIR_WRITE(v); \
}
#define X_APPLY_STEP(v,ALWAYS) \
if (extruder_duplication_enabled || ALWAYS) { \
X_STEP_WRITE(v); \
X2_STEP_WRITE(v); \
} \
else { \
if (current_block->active_driver != 0) \
X2_STEP_WRITE(v); \
else \
X_STEP_WRITE(v); \
}
#else
#define X_APPLY_DIR(v,Q) X_DIR_WRITE(v)
#define X_APPLY_STEP(v,Q) X_STEP_WRITE(v)
#endif
#ifdef Y_DUAL_STEPPER_DRIVERS
#define Y_APPLY_DIR(v,Q) Y_DIR_WRITE(v), Y2_DIR_WRITE((v) != INVERT_Y2_VS_Y_DIR)
#define Y_APPLY_STEP(v,Q) Y_STEP_WRITE(v), Y2_STEP_WRITE(v)
#else
#define Y_APPLY_DIR(v,Q) Y_DIR_WRITE(v)
#define Y_APPLY_STEP(v,Q) Y_STEP_WRITE(v)
#endif
#ifdef Z_DUAL_STEPPER_DRIVERS
#define Z_APPLY_DIR(v,Q) Z_DIR_WRITE(v), Z2_DIR_WRITE(v)
#define Z_APPLY_STEP(v,Q) Z_STEP_WRITE(v), Z2_STEP_WRITE(v)
#else
#define Z_APPLY_DIR(v,Q) Z_DIR_WRITE(v)
#define Z_APPLY_STEP(v,Q) Z_STEP_WRITE(v)
#endif
#define E_APPLY_STEP(v,Q) E_STEP_WRITE(v)
// intRes = intIn1 * intIn2 >> 16
// uses:
// r26 to store 0
// r27 to store the byte 1 of the 24 bit result
#define MultiU16X8toH16(intRes, charIn1, intIn2) \
asm volatile ( \
"clr r26 \n\t" \
"mul %A1, %B2 \n\t" \
"movw %A0, r0 \n\t" \
"mul %A1, %A2 \n\t" \
"add %A0, r1 \n\t" \
"adc %B0, r26 \n\t" \
"lsr r0 \n\t" \
"adc %A0, r26 \n\t" \
"adc %B0, r26 \n\t" \
"clr r1 \n\t" \
: \
"=&r" (intRes) \
: \
"d" (charIn1), \
"d" (intIn2) \
: \
"r26" \
)
asm volatile ( \
"clr r26 \n\t" \
"mul %A1, %B2 \n\t" \
"movw %A0, r0 \n\t" \
"mul %A1, %A2 \n\t" \
"add %A0, r1 \n\t" \
"adc %B0, r26 \n\t" \
"lsr r0 \n\t" \
"adc %A0, r26 \n\t" \
"adc %B0, r26 \n\t" \
"clr r1 \n\t" \
: \
"=&r" (intRes) \
: \
"d" (charIn1), \
"d" (intIn2) \
: \
"r26" \
)
// intRes = longIn1 * longIn2 >> 24
// uses:
// r26 to store 0
// r27 to store the byte 1 of the 48bit result
#define MultiU24X24toH16(intRes, longIn1, longIn2) \
asm volatile ( \
"clr r26 \n\t" \
"mul %A1, %B2 \n\t" \
"mov r27, r1 \n\t" \
"mul %B1, %C2 \n\t" \
"movw %A0, r0 \n\t" \
"mul %C1, %C2 \n\t" \
"add %B0, r0 \n\t" \
"mul %C1, %B2 \n\t" \
"add %A0, r0 \n\t" \
"adc %B0, r1 \n\t" \
"mul %A1, %C2 \n\t" \
"add r27, r0 \n\t" \
"adc %A0, r1 \n\t" \
"adc %B0, r26 \n\t" \
"mul %B1, %B2 \n\t" \
"add r27, r0 \n\t" \
"adc %A0, r1 \n\t" \
"adc %B0, r26 \n\t" \
"mul %C1, %A2 \n\t" \
"add r27, r0 \n\t" \
"adc %A0, r1 \n\t" \
"adc %B0, r26 \n\t" \
"mul %B1, %A2 \n\t" \
"add r27, r1 \n\t" \
"adc %A0, r26 \n\t" \
"adc %B0, r26 \n\t" \
"lsr r27 \n\t" \
"adc %A0, r26 \n\t" \
"adc %B0, r26 \n\t" \
"clr r1 \n\t" \
: \
"=&r" (intRes) \
: \
"d" (longIn1), \
"d" (longIn2) \
: \
"r26" , "r27" \
)
asm volatile ( \
"clr r26 \n\t" \
"mul %A1, %B2 \n\t" \
"mov r27, r1 \n\t" \
"mul %B1, %C2 \n\t" \
"movw %A0, r0 \n\t" \
"mul %C1, %C2 \n\t" \
"add %B0, r0 \n\t" \
"mul %C1, %B2 \n\t" \
"add %A0, r0 \n\t" \
"adc %B0, r1 \n\t" \
"mul %A1, %C2 \n\t" \
"add r27, r0 \n\t" \
"adc %A0, r1 \n\t" \
"adc %B0, r26 \n\t" \
"mul %B1, %B2 \n\t" \
"add r27, r0 \n\t" \
"adc %A0, r1 \n\t" \
"adc %B0, r26 \n\t" \
"mul %C1, %A2 \n\t" \
"add r27, r0 \n\t" \
"adc %A0, r1 \n\t" \
"adc %B0, r26 \n\t" \
"mul %B1, %A2 \n\t" \
"add r27, r1 \n\t" \
"adc %A0, r26 \n\t" \
"adc %B0, r26 \n\t" \
"lsr r27 \n\t" \
"adc %A0, r26 \n\t" \
"adc %B0, r26 \n\t" \
"clr r1 \n\t" \
: \
"=&r" (intRes) \
: \
"d" (longIn1), \
"d" (longIn2) \
: \
"r26" , "r27" \
)
// Some useful constants
#define ENABLE_STEPPER_DRIVER_INTERRUPT() TIMSK1 |=
(1<<
OCIE1A)
#define DISABLE_STEPPER_DRIVER_INTERRUPT() TIMSK1 &= ~
(1<<
OCIE1A)
#define ENABLE_STEPPER_DRIVER_INTERRUPT() TIMSK1 |=
BIT(
OCIE1A)
#define DISABLE_STEPPER_DRIVER_INTERRUPT() TIMSK1 &= ~
BIT(
OCIE1A)
#ifdef NPR2
void
checkHitEndstops
()
{
if
(
endstop_x_hit
||
endstop_y_hit
||
endstop_z_hit
||
endstop_e_hit
)
{
SERIAL_ECHO_START
;
SERIAL_ECHOPGM
(
MSG_ENDSTOPS_HIT
);
if
(
endstop_x_hit
)
{
SERIAL_ECHOPAIR
(
" X:"
,(
float
)
endstops_trigsteps
[
X_AXIS
]
/
axis_steps_per_unit
[
X_AXIS
]);
LCD_MESSAGEPGM
(
MSG_ENDSTOPS_HIT
"X"
);
}
if
(
endstop_y_hit
)
{
SERIAL_ECHOPAIR
(
" Y:"
,(
float
)
endstops_trigsteps
[
Y_AXIS
]
/
axis_steps_per_unit
[
Y_AXIS
]);
LCD_MESSAGEPGM
(
MSG_ENDSTOPS_HIT
"Y"
);
}
if
(
endstop_z_hit
)
{
SERIAL_ECHOPAIR
(
" Z:"
,(
float
)
endstops_trigsteps
[
Z_AXIS
]
/
axis_steps_per_unit
[
Z_AXIS
]);
LCD_MESSAGEPGM
(
MSG_ENDSTOPS_HIT
"Z"
);
}
if
(
endstop_e_hit
)
{
SERIAL_ECHOPAIR
(
" E:"
,(
float
)
endstops_trigsteps
[
E_AXIS
]
/
axis_steps_per_unit
[
E_AXIS
]);
LCD_MESSAGEPGM
(
MSG_ENDSTOPS_HIT
"E"
);
}
SERIAL_ECHOLN
(
""
);
endstop_x_hit
=
false
;
endstop_y_hit
=
false
;
endstop_z_hit
=
false
;
endstop_e_hit
=
false
;
#if defined(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) && defined(SDSUPPORT)
if
(
abort_on_endstop_hit
)
{
card
.
sdprinting
=
false
;
card
.
closefile
();
quickStop
();
setTargetHotend0
(
0
);
setTargetHotend1
(
0
);
setTargetHotend2
(
0
);
setTargetHotend3
(
0
);
setTargetBed
(
0
);
}
#endif
}
void
endstops_hit_on_purpose
()
{
endstop_x_hit
=
endstop_y_hit
=
endstop_z_hit
=
endstop_e_hit
=
false
;
}
void
endstops_hit_on_purpose
()
{
endstop_x_hit
=
false
;
endstop_y_hit
=
false
;
endstop_z_hit
=
false
;
endstop_e_hit
=
false
;
void
checkHitEndstops
()
{
if
(
endstop_x_hit
||
endstop_y_hit
||
endstop_z_hit
||
endstop_e_hit
)
{
SERIAL_ECHO_START
;
SERIAL_ECHOPGM
(
MSG_ENDSTOPS_HIT
);
if
(
endstop_x_hit
)
{
SERIAL_ECHOPAIR
(
" X:"
,
(
float
)
endstops_trigsteps
[
X_AXIS
]
/
axis_steps_per_unit
[
X_AXIS
]);
LCD_MESSAGEPGM
(
MSG_ENDSTOPS_HIT
"X"
);
}
if
(
endstop_y_hit
)
{
SERIAL_ECHOPAIR
(
" Y:"
,
(
float
)
endstops_trigsteps
[
Y_AXIS
]
/
axis_steps_per_unit
[
Y_AXIS
]);
LCD_MESSAGEPGM
(
MSG_ENDSTOPS_HIT
"Y"
);
}
if
(
endstop_z_hit
)
{
SERIAL_ECHOPAIR
(
" Z:"
,
(
float
)
endstops_trigsteps
[
Z_AXIS
]
/
axis_steps_per_unit
[
Z_AXIS
]);
LCD_MESSAGEPGM
(
MSG_ENDSTOPS_HIT
"Z"
);
}
if
(
endstop_e_hit
)
{
SERIAL_ECHOPAIR
(
" E:"
,
(
float
)
endstops_trigsteps
[
E_AXIS
]
/
axis_steps_per_unit
[
E_AXIS
]);
LCD_MESSAGEPGM
(
MSG_ENDSTOPS_HIT
"E"
);
}
SERIAL_ECHOLN
(
""
);
endstops_hit_on_purpose
();
#if defined(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) && defined(SDSUPPORT)
if
(
abort_on_endstop_hit
)
{
card
.
sdprinting
=
false
;
card
.
closefile
();
quickStop
();
setTargetHotend0
(
0
);
setTargetHotend1
(
0
);
setTargetHotend2
(
0
);
setTargetHotend3
(
0
);
setTargetBed
(
0
);
}
#endif
}
}
#else // NOT NPR2
void
checkHitEndstops
()
{
if
(
endstop_x_hit
||
endstop_y_hit
||
endstop_z_hit
)
{
SERIAL_ECHO_START
;
SERIAL_ECHOPGM
(
MSG_ENDSTOPS_HIT
);
if
(
endstop_x_hit
)
{
SERIAL_ECHOPAIR
(
" X:"
,(
float
)
endstops_trigsteps
[
X_AXIS
]
/
axis_steps_per_unit
[
X_AXIS
]);
LCD_MESSAGEPGM
(
MSG_ENDSTOPS_HIT
"X"
);
}
if
(
endstop_y_hit
)
{
SERIAL_ECHOPAIR
(
" Y:"
,(
float
)
endstops_trigsteps
[
Y_AXIS
]
/
axis_steps_per_unit
[
Y_AXIS
]);
LCD_MESSAGEPGM
(
MSG_ENDSTOPS_HIT
"Y"
);
}
if
(
endstop_z_hit
)
{
SERIAL_ECHOPAIR
(
" Z:"
,(
float
)
endstops_trigsteps
[
Z_AXIS
]
/
axis_steps_per_unit
[
Z_AXIS
]);
LCD_MESSAGEPGM
(
MSG_ENDSTOPS_HIT
"Z"
);
}
SERIAL_EOL
;
endstop_x_hit
=
false
;
endstop_y_hit
=
false
;
endstop_z_hit
=
false
;
#if defined(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) && defined(SDSUPPORT)
if
(
abort_on_endstop_hit
)
{
card
.
sdprinting
=
false
;
card
.
closefile
();
quickStop
();
setTargetHotend0
(
0
);
setTargetHotend1
(
0
);
setTargetHotend2
(
0
);
setTargetHotend3
(
0
);
setTargetBed
(
0
);
}
#endif
}
void
endstops_hit_on_purpose
()
{
endstop_x_hit
=
endstop_y_hit
=
endstop_z_hit
=
false
;
}
void
endstops_hit_on_purpose
()
{
endstop_x_hit
=
false
;
endstop_y_hit
=
false
;
endstop_z_hit
=
false
;
void
checkHitEndstops
()
{
if
(
endstop_x_hit
||
endstop_y_hit
||
endstop_z_hit
)
{
SERIAL_ECHO_START
;
SERIAL_ECHOPGM
(
MSG_ENDSTOPS_HIT
);
if
(
endstop_x_hit
)
{
SERIAL_ECHOPAIR
(
" X:"
,
(
float
)
endstops_trigsteps
[
X_AXIS
]
/
axis_steps_per_unit
[
X_AXIS
]);
LCD_MESSAGEPGM
(
MSG_ENDSTOPS_HIT
"X"
);
}
if
(
endstop_y_hit
)
{
SERIAL_ECHOPAIR
(
" Y:"
,
(
float
)
endstops_trigsteps
[
Y_AXIS
]
/
axis_steps_per_unit
[
Y_AXIS
]);
LCD_MESSAGEPGM
(
MSG_ENDSTOPS_HIT
"Y"
);
}
if
(
endstop_z_hit
)
{
SERIAL_ECHOPAIR
(
" Z:"
,
(
float
)
endstops_trigsteps
[
Z_AXIS
]
/
axis_steps_per_unit
[
Z_AXIS
]);
LCD_MESSAGEPGM
(
MSG_ENDSTOPS_HIT
"Z"
);
}
SERIAL_EOL
;
endstops_hit_on_purpose
();
#if defined(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) && defined(SDSUPPORT)
if
(
abort_on_endstop_hit
)
{
card
.
sdprinting
=
false
;
card
.
closefile
();
quickStop
();
setTargetHotend0
(
0
);
setTargetHotend1
(
0
);
setTargetHotend2
(
0
);
setTargetHotend3
(
0
);
setTargetBed
(
0
);
}
#endif
}
}
#endif // NOT NPR2
void
enable_endstops
(
bool
check
)
{
check_endstops
=
check
;
}
void
enable_endstops
(
bool
check
)
{
check_endstops
=
check
;
}
// __________________________
// /| |\ _________________ ^
...
...
@@ -301,23 +333,23 @@ void st_wake_up() {
FORCE_INLINE
unsigned
short
calc_timer
(
unsigned
short
step_rate
)
{
unsigned
short
timer
;
if
(
step_rate
>
MAX_STEP_FREQUENCY
)
step_rate
=
MAX_STEP_FREQUENCY
;
if
(
step_rate
>
MAX_STEP_FREQUENCY
)
step_rate
=
MAX_STEP_FREQUENCY
;
if
(
step_rate
>
20000
)
{
// If steprate > 20kHz >> step 4 times
step_rate
=
(
step_rate
>>
2
)
&
0x3fff
;
if
(
step_rate
>
20000
)
{
// If steprate > 20kHz >> step 4 times
step_rate
=
(
step_rate
>>
2
)
&
0x3fff
;
step_loops
=
4
;
}
else
if
(
step_rate
>
10000
)
{
// If steprate > 10kHz >> step 2 times
step_rate
=
(
step_rate
>>
1
)
&
0x7fff
;
else
if
(
step_rate
>
10000
)
{
// If steprate > 10kHz >> step 2 times
step_rate
=
(
step_rate
>>
1
)
&
0x7fff
;
step_loops
=
2
;
}
else
{
step_loops
=
1
;
}
if
(
step_rate
<
(
F_CPU
/
500000
))
step_rate
=
(
F_CPU
/
500000
);
step_rate
-=
(
F_CPU
/
500000
);
// Correct for minimal speed
if
(
step_rate
>=
(
8
*
256
))
{
// higher step rate
if
(
step_rate
<
(
F_CPU
/
500000
))
step_rate
=
(
F_CPU
/
500000
);
step_rate
-=
(
F_CPU
/
500000
);
// Correct for minimal speed
if
(
step_rate
>=
(
8
*
256
))
{
// higher step rate
unsigned
short
table_address
=
(
unsigned
short
)
&
speed_lookuptable_fast
[(
unsigned
char
)(
step_rate
>>
8
)][
0
];
unsigned
char
tmp_step_rate
=
(
step_rate
&
0x00ff
);
unsigned
short
gain
=
(
unsigned
short
)
pgm_read_word_near
(
table_address
+
2
);
...
...
@@ -330,7 +362,7 @@ FORCE_INLINE unsigned short calc_timer(unsigned short step_rate) {
timer
=
(
unsigned
short
)
pgm_read_word_near
(
table_address
);
timer
-=
(((
unsigned
short
)
pgm_read_word_near
(
table_address
+
2
)
*
(
unsigned
char
)(
step_rate
&
0x0007
))
>>
3
);
}
if
(
timer
<
100
)
{
timer
=
100
;
MYSERIAL
.
print
(
MSG_STEPPER_TOO_HIGH
);
MYSERIAL
.
println
(
step_rate
);
}
//(20kHz this should never happen)
if
(
timer
<
100
)
{
timer
=
100
;
MYSERIAL
.
print
(
MSG_STEPPER_TOO_HIGH
);
MYSERIAL
.
println
(
step_rate
);
}
//(20kHz this should never happen)
return
timer
;
}
...
...
@@ -353,49 +385,45 @@ FORCE_INLINE void trapezoid_generator_reset() {
acceleration_time
=
calc_timer
(
acc_step_rate
);
OCR1A
=
acceleration_time
;
// SERIAL_ECHO_START;
// SERIAL_ECHOPGM("advance :");
// SERIAL_ECHO(current_block->advance/256.0);
// SERIAL_ECHOPGM("advance rate :");
// SERIAL_ECHO(current_block->advance_rate/256.0);
// SERIAL_ECHOPGM("initial advance :");
// SERIAL_ECHO(current_block->initial_advance/256.0);
// SERIAL_ECHOPGM("final advance :");
// SERIAL_ECHOLN(current_block->final_advance/256.0);
// SERIAL_ECHO_START;
// SERIAL_ECHOPGM("advance :");
// SERIAL_ECHO(current_block->advance/256.0);
// SERIAL_ECHOPGM("advance rate :");
// SERIAL_ECHO(current_block->advance_rate/256.0);
// SERIAL_ECHOPGM("initial advance :");
// SERIAL_ECHO(current_block->initial_advance/256.0);
// SERIAL_ECHOPGM("final advance :");
// SERIAL_ECHOLN(current_block->final_advance/256.0);
}
// "The Stepper Driver Interrupt" - This timer interrupt is the workhorse.
// It pops blocks from the block_buffer and executes them by pulsing the stepper pins appropriately.
ISR
(
TIMER1_COMPA_vect
)
{
ISR
(
TIMER1_COMPA_vect
)
{
// If there is no current block, attempt to pop one from the buffer
if
(
current_block
==
NULL
)
{
if
(
!
current_block
)
{
// Anything in the buffer?
current_block
=
plan_get_current_block
();
if
(
current_block
!=
NULL
)
{
if
(
current_block
)
{
current_block
->
busy
=
true
;
trapezoid_generator_reset
();
counter_x
=
-
(
current_block
->
step_event_count
>>
1
);
counter_y
=
counter_x
;
counter_z
=
counter_x
;
counter_e
=
counter_x
;
counter_y
=
counter_z
=
counter_e
=
counter_x
;
step_events_completed
=
0
;
#ifdef Z_LATE_ENABLE
if
(
current_block
->
steps_z
>
0
)
{
if
(
current_block
->
steps_z
>
0
)
{
enable_z
();
OCR1A
=
2000
;
//1ms wait
return
;
}
#endif
//
#ifdef ADVANCE
//
e_steps[current_block->active_driver] = 0;
//
#endif
//
#ifdef ADVANCE
//
e_steps[current_block->active_driver] = 0;
//
#endif
}
else
{
OCR1A
=
2000
;
// 1kHz.
OCR1A
=
2000
;
// 1kHz.
}
}
...
...
@@ -404,147 +432,96 @@ ISR(TIMER1_COMPA_vect)
out_bits
=
current_block
->
direction_bits
;
// Set the direction bits (X_AXIS=A_AXIS and Y_AXIS=B_AXIS for COREXY)
if
((
out_bits
&
(
1
<<
X_AXIS
))
!=
0
)
{
#ifdef DUAL_X_CARRIAGE
if
(
extruder_duplication_enabled
){
X_DIR_WRITE
(
INVERT_X_DIR
);
X2_DIR_WRITE
(
INVERT_X_DIR
);
}
else
{
if
(
current_block
->
active_extruder
!=
0
)
X2_DIR_WRITE
(
INVERT_X_DIR
);
else
X_DIR_WRITE
(
INVERT_X_DIR
);
}
#else
X_DIR_WRITE
(
INVERT_X_DIR
);
#endif
count_direction
[
X_AXIS
]
=-
1
;
if
(
TEST
(
out_bits
,
X_AXIS
))
{
X_APPLY_DIR
(
INVERT_X_DIR
,
0
);
count_direction
[
X_AXIS
]
=
-
1
;
}
else
{
#ifdef DUAL_X_CARRIAGE
if
(
extruder_duplication_enabled
){
X_DIR_WRITE
(
!
INVERT_X_DIR
);
X2_DIR_WRITE
(
!
INVERT_X_DIR
);
}
else
{
if
(
current_block
->
active_extruder
!=
0
)
X2_DIR_WRITE
(
!
INVERT_X_DIR
);
else
X_DIR_WRITE
(
!
INVERT_X_DIR
);
}
#else
X_DIR_WRITE
(
!
INVERT_X_DIR
);
#endif
count_direction
[
X_AXIS
]
=
1
;
X_APPLY_DIR
(
!
INVERT_X_DIR
,
0
);
count_direction
[
X_AXIS
]
=
1
;
}
if
((
out_bits
&
(
1
<<
Y_AXIS
))
!=
0
){
Y_DIR_WRITE
(
INVERT_Y_DIR
);
#ifdef Y_DUAL_STEPPER_DRIVERS
Y2_DIR_WRITE
(
!
(
INVERT_Y_DIR
==
INVERT_Y2_VS_Y_DIR
));
#endif
count_direction
[
Y_AXIS
]
=-
1
;
}
else
{
Y_DIR_WRITE
(
!
INVERT_Y_DIR
);
#ifdef Y_DUAL_STEPPER_DRIVERS
Y2_DIR_WRITE
((
INVERT_Y_DIR
==
INVERT_Y2_VS_Y_DIR
));
#endif
count_direction
[
Y_AXIS
]
=
1
;
if
(
TEST
(
out_bits
,
Y_AXIS
))
{
Y_APPLY_DIR
(
INVERT_Y_DIR
,
0
);
count_direction
[
Y_AXIS
]
=
-
1
;
}
else
{
Y_APPLY_DIR
(
!
INVERT_Y_DIR
,
0
);
count_direction
[
Y_AXIS
]
=
1
;
}
CHECK_ENDSTOPS
{
// check X and Y Endstops
#define UPDATE_ENDSTOP(axis,AXIS,minmax,MINMAX) \
bool axis ##_## minmax ##_endstop = (READ(AXIS ##_## MINMAX ##_PIN) != AXIS ##_## MINMAX ##_ENDSTOP_INVERTING); \
if (axis ##_## minmax ##_endstop && old_## axis ##_## minmax ##_endstop && (current_block->steps_## axis > 0)) { \
endstops_trigsteps[AXIS ##_AXIS] = count_position[AXIS ##_AXIS]; \
endstop_## axis ##_hit = true; \
step_events_completed = current_block->step_event_count; \
} \
old_## axis ##_## minmax ##_endstop = axis ##_## minmax ##_endstop;
// Check X and Y endstops
if
(
check_endstops
)
{
#ifndef COREXY
if
(
(
out_bits
&
(
1
<<
X_AXIS
))
!=
0
)
if
(
TEST
(
out_bits
,
X_AXIS
))
// stepping along -X axis (regular cartesians bot
)
#else
if
(
!
((
current_block
->
steps_x
==
current_block
->
steps_y
)
&&
((
out_bits
&
(
1
<<
X_AXIS
))
>>
X_AXIS
!=
(
out_bits
&
(
1
<<
Y_AXIS
))
>>
Y_AXIS
)))
if
((
out_bits
&
(
1
<<
X_HEAD
))
!=
0
)
// Head direction in -X axis for CoreXY bots.
// If DeltaX == -DeltaY, the movement is only in Y axis
if
(
current_block
->
steps_x
!=
current_block
->
steps_y
||
(
TEST
(
out_bits
,
X_AXIS
)
==
TEST
(
out_bits
,
Y_AXIS
)))
if
(
TEST
(
out_bits
,
X_HEAD
))
#endif
{
// -direction
#ifdef DUAL_X_CARRIAGE
// with 2 x-carriages, endstops are only checked in the homing direction for the active extruder
if
((
current_block
->
active_extruder
==
0
&&
X_HOME_DIR
==
-
1
)
||
(
current_block
->
active_extruder
!=
0
&&
X2_HOME_DIR
==
-
1
))
#endif
{
#if defined(X_MIN_PIN) && X_MIN_PIN > -1
bool
x_min_endstop
=
(
READ
(
X_MIN_PIN
)
!=
X_MIN_ENDSTOP_INVERTING
);
if
(
x_min_endstop
&&
old_x_min_endstop
&&
(
current_block
->
steps_x
>
0
))
{
endstops_trigsteps
[
X_AXIS
]
=
count_position
[
X_AXIS
];
endstop_x_hit
=
true
;
step_events_completed
=
current_block
->
step_event_count
;
{
// -direction
#ifdef DUAL_X_CARRIAGE
// with 2 x-carriages, endstops are only checked in the homing direction for the active extruder
if
((
current_block
->
active_extruder
==
0
&&
X_HOME_DIR
==
-
1
)
||
(
current_block
->
active_extruder
!=
0
&&
X2_HOME_DIR
==
-
1
))
#endif
{
#if defined(X_MIN_PIN) && X_MIN_PIN >= 0
UPDATE_ENDSTOP
(
x
,
X
,
min
,
MIN
);
#endif
}
old_x_min_endstop
=
x_min_endstop
;
#endif
}
}
else
{
// +direction
#ifdef DUAL_X_CARRIAGE
// with 2 x-carriages, endstops are only checked in the homing direction for the active extruder
if
((
current_block
->
active_extruder
==
0
&&
X_HOME_DIR
==
1
)
||
(
current_block
->
active_extruder
!=
0
&&
X2_HOME_DIR
==
1
))
#endif
{
#if defined(X_MAX_PIN) && X_MAX_PIN > -1
bool
x_max_endstop
=
(
READ
(
X_MAX_PIN
)
!=
X_MAX_ENDSTOP_INVERTING
);
if
(
x_max_endstop
&&
old_x_max_endstop
&&
(
current_block
->
steps_x
>
0
))
{
endstops_trigsteps
[
X_AXIS
]
=
count_position
[
X_AXIS
];
endstop_x_hit
=
true
;
step_events_completed
=
current_block
->
step_event_count
;
}
old_x_max_endstop
=
x_max_endstop
;
else
{
// +direction
#ifdef DUAL_X_CARRIAGE
// with 2 x-carriages, endstops are only checked in the homing direction for the active extruder
if
((
current_block
->
active_driver
==
0
&&
X_HOME_DIR
==
1
)
||
(
current_block
->
active_extruder
!=
0
&&
X2_HOME_DIR
==
1
))
#endif
{
#if defined(X_MAX_PIN) && X_MAX_PIN >= 0
UPDATE_ENDSTOP
(
x
,
X
,
max
,
MAX
);
#endif
}
}
}
#ifndef COREXY
if
((
out_bits
&
(
1
<<
Y_AXIS
))
!=
0
)
// -direction
#else
if
(
!
((
current_block
->
steps_x
==
current_block
->
steps_y
)
&&
((
out_bits
&
(
1
<<
X_AXIS
))
>>
X_AXIS
==
(
out_bits
&
(
1
<<
Y_AXIS
))
>>
Y_AXIS
)))
if
((
out_bits
&
(
1
<<
Y_HEAD
))
!=
0
)
#endif
{
// -direction
#if defined(Y_MIN_PIN) && Y_MIN_PIN > -1
bool
y_min_endstop
=
(
READ
(
Y_MIN_PIN
)
!=
Y_MIN_ENDSTOP_INVERTING
);
if
(
y_min_endstop
&&
old_y_min_endstop
&&
(
current_block
->
steps_y
>
0
))
{
endstops_trigsteps
[
Y_AXIS
]
=
count_position
[
Y_AXIS
];
endstop_y_hit
=
true
;
step_events_completed
=
current_block
->
step_event_count
;
}
old_y_min_endstop
=
y_min_endstop
;
#endif
}
else
{
// +direction
#if defined(Y_MAX_PIN) && Y_MAX_PIN > -1
bool
y_max_endstop
=
(
READ
(
Y_MAX_PIN
)
!=
Y_MAX_ENDSTOP_INVERTING
);
if
(
y_max_endstop
&&
old_y_max_endstop
&&
(
current_block
->
steps_y
>
0
))
{
endstops_trigsteps
[
Y_AXIS
]
=
count_position
[
Y_AXIS
];
endstop_y_hit
=
true
;
step_events_completed
=
current_block
->
step_event_count
;
}
old_y_max_endstop
=
y_max_endstop
;
#ifndef COREXY
if
(
TEST
(
out_bits
,
Y_AXIS
))
// -direction
#else
// Head direction in -Y axis for CoreXY bots.
// If DeltaX == DeltaY, the movement is only in X axis
if
(
current_block
->
steps_x
!=
current_block
->
steps_y
||
(
TEST
(
out_bits
,
X_AXIS
)
!=
TEST
(
out_bits
,
Y_AXIS
)))
if
(
TEST
(
out_bits
,
Y_HEAD
))
#endif
}
{
// -direction
#if defined(Y_MIN_PIN) && Y_MIN_PIN >= 0
UPDATE_ENDSTOP
(
y
,
Y
,
min
,
MIN
);
#endif
}
else
{
// +direction
#if defined(Y_MAX_PIN) && Y_MAX_PIN >= 0
UPDATE_ENDSTOP
(
y
,
Y
,
max
,
MAX
);
#endif
}
}
if
(
(
out_bits
&
(
1
<<
Z_AXIS
))
!=
0
)
{
// -direction
if
(
TEST
(
out_bits
,
Z_AXIS
)
)
{
// -direction
Z_DIR_WRITE
(
INVERT_Z_DIR
);
#ifdef Z_DUAL_STEPPER_DRIVERS
Z2_DIR_WRITE
(
INVERT_Z_DIR
);
#endif
count_direction
[
Z_AXIS
]
=-
1
;
CHECK_ENDSTOPS
{
#if defined(Z_MIN_PIN) && Z_MIN_PIN > -1
bool
z_min_endstop
=
(
READ
(
Z_MIN_PIN
)
!=
Z_MIN_ENDSTOP_INVERTING
);
if
(
z_min_endstop
&&
old_z_min_endstop
&&
(
current_block
->
steps_z
>
0
))
{
endstops_trigsteps
[
Z_AXIS
]
=
count_position
[
Z_AXIS
];
endstop_z_hit
=
true
;
step_events_completed
=
current_block
->
step_event_count
;
}
old_z_min_endstop
=
z_min_endstop
;
count_direction
[
Z_AXIS
]
=
-
1
;
if
(
check_endstops
)
{
#if defined(Z_MIN_PIN) && Z_MIN_PIN >= 0
UPDATE_ENDSTOP
(
z
,
Z
,
min
,
MIN
);
#endif
}
}
...
...
@@ -554,26 +531,20 @@ ISR(TIMER1_COMPA_vect)
Z2_DIR_WRITE
(
!
INVERT_Z_DIR
);
#endif
count_direction
[
Z_AXIS
]
=
1
;
CHECK_ENDSTOPS
{
#if defined(Z_MAX_PIN) && Z_MAX_PIN > -1
bool
z_max_endstop
=
(
READ
(
Z_MAX_PIN
)
!=
Z_MAX_ENDSTOP_INVERTING
);
if
(
z_max_endstop
&&
old_z_max_endstop
&&
(
current_block
->
steps_z
>
0
))
{
endstops_trigsteps
[
Z_AXIS
]
=
count_position
[
Z_AXIS
];
endstop_z_hit
=
true
;
step_events_completed
=
current_block
->
step_event_count
;
}
old_z_max_endstop
=
z_max_endstop
;
count_direction
[
Z_AXIS
]
=
1
;
if
(
check_endstops
)
{
#if defined(Z_MAX_PIN) && Z_MAX_PIN >= 0
UPDATE_ENDSTOP
(
z
,
Z
,
max
,
MAX
);
#endif
}
}
#ifndef ADVANCE
if
(
(
out_bits
&
(
1
<<
E_AXIS
))
!=
0
)
{
// -direction
if
(
TEST
(
out_bits
,
E_AXIS
)
)
{
// -direction
REV_E_DIR
();
count_direction
[
E_AXIS
]
=-
1
;
#ifdef NPR2
CHECK_ENDSTOPS
{
if
(
check_endstops
)
{
#if defined(E_MIN_PIN) && E_MIN_PIN > -1
bool
e_min_endstop
=
(
READ
(
E_MIN_PIN
)
!=
E_MIN_ENDSTOP_INVERTING
);
if
(
e_min_endstop
&&
old_e_min_endstop
&&
(
current_block
->
steps_e
>
0
))
{
...
...
@@ -592,7 +563,8 @@ ISR(TIMER1_COMPA_vect)
}
#endif //!ADVANCE
for
(
int8_t
i
=
0
;
i
<
step_loops
;
i
++
)
{
// Take multiple steps per interrupt (For high speed moves)
// Take multiple steps per interrupt (For high speed moves)
for
(
int8_t
i
=
0
;
i
<
step_loops
;
i
++
)
{
#ifndef AT90USB
MSerial
.
checkRx
();
// Check for serial chars.
#endif
...
...
@@ -601,140 +573,63 @@ ISR(TIMER1_COMPA_vect)
counter_e
+=
current_block
->
steps_e
;
if
(
counter_e
>
0
)
{
counter_e
-=
current_block
->
step_event_count
;
if
((
out_bits
&
(
1
<<
E_AXIS
))
!=
0
)
{
// - direction
e_steps
[
current_block
->
active_driver
]
--
;
}
else
{
e_steps
[
current_block
->
active_driver
]
++
;
}
e_steps
[
current_block
->
active_driver
]
+=
TEST
(
out_bits
,
E_AXIS
)
?
-
1
:
1
;
}
#endif //ADVANCE
#ifdef CONFIG_STEPPERS_TOSHIBA
/* The toshiba stepper controller require much longer pulses
* tjerfore we 'stage' decompose the pulses between high, and
* low instead of doing each in turn. The extra tests add enough
* lag to allow it work with without needing NOPs
*/
counter_x
+=
current_block
->
steps_x
;
if
(
counter_x
>
0
)
X_STEP_WRITE
(
HIGH
);
counter_y
+=
current_block
->
steps_y
;
if
(
counter_y
>
0
)
Y_STEP_WRITE
(
HIGH
);
counter_z
+=
current_block
->
steps_z
;
if
(
counter_z
>
0
)
Z_STEP_WRITE
(
HIGH
);
#ifndef ADVANCE
counter_e
+=
current_block
->
steps_e
;
if
(
counter_e
>
0
)
WRITE_E_STEP
(
HIGH
);
#endif //!ADVANCE
if
(
counter_x
>
0
)
{
counter_x
-=
current_block
->
step_event_count
;
count_position
[
X_AXIS
]
+=
count_direction
[
X_AXIS
];
X_STEP_WRITE
(
LOW
);
}
if
(
counter_y
>
0
)
{
counter_y
-=
current_block
->
step_event_count
;
count_position
[
Y_AXIS
]
+=
count_direction
[
Y_AXIS
];
Y_STEP_WRITE
(
LOW
);
}
if
(
counter_z
>
0
)
{
counter_z
-=
current_block
->
step_event_count
;
count_position
[
Z_AXIS
]
+=
count_direction
[
Z_AXIS
];
Z_STEP_WRITE
(
LOW
);
}
#ifdef CONFIG_STEPPERS_TOSHIBA
/**
* The Toshiba stepper controller require much longer pulses.
* So we 'stage' decompose the pulses between high and low
* instead of doing each in turn. The extra tests add enough
* lag to allow it work with without needing NOPs
*/
counter_x
+=
current_block
->
steps_x
;
if
(
counter_x
>
0
)
X_STEP_WRITE
(
HIGH
);
counter_y
+=
current_block
->
steps_y
;
if
(
counter_y
>
0
)
Y_STEP_WRITE
(
HIGH
);
counter_z
+=
current_block
->
steps_z
;
if
(
counter_z
>
0
)
Z_STEP_WRITE
(
HIGH
);
#ifndef ADVANCE
counter_e
+=
current_block
->
steps_e
;
if
(
counter_e
>
0
)
E_STEP_WRITE
(
HIGH
);
#endif
#ifndef ADVANCE
if
(
counter_e
>
0
)
{
counter_e
-=
current_block
->
step_event_count
;
count_position
[
E_AXIS
]
+=
count_direction
[
E_AXIS
];
WRITE_E_STEP
(
LOW
);
}
#endif //!ADVANCE
#else
counter_x
+=
current_block
->
steps_x
;
if
(
counter_x
>
0
)
{
#ifdef DUAL_X_CARRIAGE
if
(
extruder_duplication_enabled
){
X_STEP_WRITE
(
!
INVERT_X_STEP_PIN
);
X2_STEP_WRITE
(
!
INVERT_X_STEP_PIN
);
}
else
{
if
(
current_block
->
active_driver
!=
0
)
X2_STEP_WRITE
(
!
INVERT_X_STEP_PIN
);
else
X_STEP_WRITE
(
!
INVERT_X_STEP_PIN
);
}
#else
X_STEP_WRITE
(
!
INVERT_X_STEP_PIN
);
#endif
counter_x
-=
current_block
->
step_event_count
;
count_position
[
X_AXIS
]
+=
count_direction
[
X_AXIS
];
#ifdef DUAL_X_CARRIAGE
if
(
extruder_duplication_enabled
){
X_STEP_WRITE
(
INVERT_X_STEP_PIN
);
X2_STEP_WRITE
(
INVERT_X_STEP_PIN
);
}
else
{
if
(
current_block
->
active_driver
!=
0
)
X2_STEP_WRITE
(
INVERT_X_STEP_PIN
);
else
X_STEP_WRITE
(
INVERT_X_STEP_PIN
);
#define STEP_IF_COUNTER(axis, AXIS) \
if (counter_## axis > 0) {
counter_
##
axis
-=
current_block
->
step_event_count
;
\
count_position
[
AXIS
##
_AXIS
]
+=
count_direction
[
AXIS
##
_AXIS
];
\
AXIS
##
_STEP_WRITE
(
LOW
);
}
#else
X_STEP_WRITE
(
INVERT_X_STEP_PIN
);
#endif
}
counter_y
+=
current_block
->
steps_y
;
if
(
counter_y
>
0
)
{
Y_STEP_WRITE
(
!
INVERT_Y_STEP_PIN
);
#ifdef Y_DUAL_STEPPER_DRIVERS
Y2_STEP_WRITE
(
!
INVERT_Y_STEP_PIN
);
STEP_IF_COUNTER
(
x
,
X
);
STEP_IF_COUNTER
(
y
,
Y
);
STEP_IF_COUNTER
(
z
,
Z
);
#ifndef ADVANCE
STEP_IF_COUNTER
(
e
,
E
);
#endif
counter_y
-=
current_block
->
step_event_count
;
count_position
[
Y_AXIS
]
+=
count_direction
[
Y_AXIS
];
Y_STEP_WRITE
(
INVERT_Y_STEP_PIN
);
#ifdef Y_DUAL_STEPPER_DRIVERS
Y2_STEP_WRITE
(
INVERT_Y_STEP_PIN
);
#endif
}
counter_z
+=
current_block
->
steps_z
;
if
(
counter_z
>
0
)
{
Z_STEP_WRITE
(
!
INVERT_Z_STEP_PIN
);
#ifdef Z_DUAL_STEPPER_DRIVERS
Z2_STEP_WRITE
(
!
INVERT_Z_STEP_PIN
);
#endif
#else // !CONFIG_STEPPERS_TOSHIBA
counter_z
-=
current_block
->
step_event_count
;
count_position
[
Z_AXIS
]
+=
count_direction
[
Z_AXIS
];
Z_STEP_WRITE
(
INVERT_Z_STEP_PIN
);
#define APPLY_MOVEMENT(axis, AXIS) \
counter_## axis += current_block->steps_## axis; \
if (counter_## axis > 0) { \
AXIS ##_APPLY_STEP(!INVERT_## AXIS ##_STEP_PIN,0); \
counter_## axis -= current_block->step_event_count; \
count_position[AXIS ##_AXIS] += count_direction[AXIS ##_AXIS]; \
AXIS ##_APPLY_STEP(INVERT_## AXIS ##_STEP_PIN,0); \
}
#ifdef Z_DUAL_STEPPER_DRIVERS
Z2_STEP_WRITE
(
INVERT_Z_STEP_PIN
);
APPLY_MOVEMENT
(
x
,
X
);
APPLY_MOVEMENT
(
y
,
Y
);
APPLY_MOVEMENT
(
z
,
Z
);
#ifndef ADVANCE
APPLY_MOVEMENT
(
e
,
E
);
#endif
}
#ifndef ADVANCE
counter_e
+=
current_block
->
steps_e
;
if
(
counter_e
>
0
)
{
WRITE_E_STEP
(
!
INVERT_E_STEP_PIN
);
counter_e
-=
current_block
->
step_event_count
;
count_position
[
E_AXIS
]
+=
count_direction
[
E_AXIS
];
WRITE_E_STEP
(
INVERT_E_STEP_PIN
);
}
#endif //!ADVANCE
#endif // CONFIG_STEPPERS_TOSHIBA
step_events_completed
+=
1
;
if
(
step_events_completed
>=
current_block
->
step_event_count
)
break
;
#endif // CONFIG_STEPPERS_TOSHIBA
step_events_completed
++
;
if
(
step_events_completed
>=
current_block
->
step_event_count
)
break
;
}
// Calculare new timer value
unsigned
short
timer
;
...
...
@@ -745,7 +640,7 @@ ISR(TIMER1_COMPA_vect)
acc_step_rate
+=
current_block
->
initial_rate
;
// upper limit
if
(
acc_step_rate
>
current_block
->
nominal_rate
)
if
(
acc_step_rate
>
current_block
->
nominal_rate
)
acc_step_rate
=
current_block
->
nominal_rate
;
// step_rate to timer interval
...
...
@@ -756,16 +651,17 @@ ISR(TIMER1_COMPA_vect)
for
(
int8_t
i
=
0
;
i
<
step_loops
;
i
++
)
{
advance
+=
advance_rate
;
}
//if(advance > current_block->advance) advance = current_block->advance;
//if
(advance > current_block->advance) advance = current_block->advance;
// Do E steps + advance steps
e_steps
[
current_block
->
active_driver
]
+=
((
advance
>>
8
)
-
old_advance
);
old_advance
=
advance
>>
8
;
#endif
}
else
if
(
step_events_completed
>
(
unsigned
long
int
)
current_block
->
decelerate_after
)
{
MultiU24X24toH16
(
step_rate
,
deceleration_time
,
current_block
->
acceleration_rate
);
if
(
step_rate
>
acc_step_rate
)
{
// Check step_rate stays positive
if
(
step_rate
>
acc_step_rate
)
{
// Check step_rate stays positive
step_rate
=
current_block
->
final_rate
;
}
else
{
...
...
@@ -773,7 +669,7 @@ ISR(TIMER1_COMPA_vect)
}
// lower limit
if
(
step_rate
<
current_block
->
final_rate
)
if
(
step_rate
<
current_block
->
final_rate
)
step_rate
=
current_block
->
final_rate
;
// step_rate to timer interval
...
...
@@ -784,7 +680,7 @@ ISR(TIMER1_COMPA_vect)
for
(
int8_t
i
=
0
;
i
<
step_loops
;
i
++
)
{
advance
-=
advance_rate
;
}
if
(
advance
<
final_advance
)
advance
=
final_advance
;
if
(
advance
<
final_advance
)
advance
=
final_advance
;
// Do E steps + advance steps
e_steps
[
current_block
->
active_driver
]
+=
((
advance
>>
8
)
-
old_advance
);
old_advance
=
advance
>>
8
;
...
...
@@ -877,216 +773,205 @@ ISR(TIMER1_COMPA_vect)
}
#endif // ADVANCE
void
st_init
()
{
void
st_init
()
{
digipot_init
();
//Initialize Digipot Motor Current
microstep_init
();
//Initialize Microstepping Pins
// initialise TMC Steppers
#ifdef HAVE_TMCDRIVER
tmc_init
();
tmc_init
();
#endif
// initialise L6470 Steppers
#ifdef HAVE_L6470DRIVER
L6470_init
();
L6470_init
();
#endif
//Initialize Dir Pins
#if defined(X_DIR_PIN) && X_DIR_PIN >
-1
//
Initialize Dir Pins
#if defined(X_DIR_PIN) && X_DIR_PIN >
= 0
X_DIR_INIT
;
#endif
#if defined(X2_DIR_PIN) && X2_DIR_PIN >
-1
#if defined(X2_DIR_PIN) && X2_DIR_PIN >
= 0
X2_DIR_INIT
;
#endif
#if defined(Y_DIR_PIN) && Y_DIR_PIN >
-1
#if defined(Y_DIR_PIN) && Y_DIR_PIN >
= 0
Y_DIR_INIT
;
#if defined(Y_DUAL_STEPPER_DRIVERS) && defined(Y2_DIR_PIN) && (Y2_DIR_PIN > -1)
Y2_DIR_INIT
;
#endif
#if defined(Y_DUAL_STEPPER_DRIVERS) && defined(Y2_DIR_PIN) && Y2_DIR_PIN >= 0
Y2_DIR_INIT
;
#endif
#endif
#if defined(Z_DIR_PIN) && Z_DIR_PIN >
-1
#if defined(Z_DIR_PIN) && Z_DIR_PIN >
= 0
Z_DIR_INIT
;
#if defined(Z_DUAL_STEPPER_DRIVERS) && defined(Z2_DIR_PIN) &&
(Z2_DIR_PIN > -1)
#if defined(Z_DUAL_STEPPER_DRIVERS) && defined(Z2_DIR_PIN) &&
Z2_DIR_PIN >= 0
Z2_DIR_INIT
;
#endif
#endif
#if defined(E0_DIR_PIN) && E0_DIR_PIN >
-1
#if defined(E0_DIR_PIN) && E0_DIR_PIN >
= 0
E0_DIR_INIT
;
#endif
#if defined(E1_DIR_PIN) &&
(E1_DIR_PIN > -1)
#if defined(E1_DIR_PIN) &&
E1_DIR_PIN >= 0
E1_DIR_INIT
;
#endif
#if defined(E2_DIR_PIN) &&
(E2_DIR_PIN > -1)
#if defined(E2_DIR_PIN) &&
E2_DIR_PIN >= 0
E2_DIR_INIT
;
#endif
#if defined(E3_DIR_PIN) &&
(E3_DIR_PIN > -1)
#if defined(E3_DIR_PIN) &&
E3_DIR_PIN >= 0
E3_DIR_INIT
;
#endif
//Initialize Enable Pins - steppers default to disabled.
#if defined(X_ENABLE_PIN) && X_ENABLE_PIN >
-1
#if defined(X_ENABLE_PIN) && X_ENABLE_PIN >
= 0
X_ENABLE_INIT
;
if
(
!
X_ENABLE_ON
)
X_ENABLE_WRITE
(
HIGH
);
if
(
!
X_ENABLE_ON
)
X_ENABLE_WRITE
(
HIGH
);
#endif
#if defined(X2_ENABLE_PIN) && X2_ENABLE_PIN >
-1
#if defined(X2_ENABLE_PIN) && X2_ENABLE_PIN >
= 0
X2_ENABLE_INIT
;
if
(
!
X_ENABLE_ON
)
X2_ENABLE_WRITE
(
HIGH
);
if
(
!
X_ENABLE_ON
)
X2_ENABLE_WRITE
(
HIGH
);
#endif
#if defined(Y_ENABLE_PIN) && Y_ENABLE_PIN >
-1
#if defined(Y_ENABLE_PIN) && Y_ENABLE_PIN >
= 0
Y_ENABLE_INIT
;
if
(
!
Y_ENABLE_ON
)
Y_ENABLE_WRITE
(
HIGH
);
if
(
!
Y_ENABLE_ON
)
Y_ENABLE_WRITE
(
HIGH
);
#if defined(Y_DUAL_STEPPER_DRIVERS) && defined(Y2_ENABLE_PIN) &&
(Y2_ENABLE_PIN > -1)
#if defined(Y_DUAL_STEPPER_DRIVERS) && defined(Y2_ENABLE_PIN) &&
Y2_ENABLE_PIN >= 0
Y2_ENABLE_INIT
;
if
(
!
Y_ENABLE_ON
)
Y2_ENABLE_WRITE
(
HIGH
);
if
(
!
Y_ENABLE_ON
)
Y2_ENABLE_WRITE
(
HIGH
);
#endif
#endif
#if defined(Z_ENABLE_PIN) && Z_ENABLE_PIN >
-1
#if defined(Z_ENABLE_PIN) && Z_ENABLE_PIN >
= 0
Z_ENABLE_INIT
;
if
(
!
Z_ENABLE_ON
)
Z_ENABLE_WRITE
(
HIGH
);
#if defined(Z_DUAL_STEPPER_DRIVERS) && defined(Z2_ENABLE_PIN) && (Z2_ENABLE_PIN > -1)
if
(
!
Z_ENABLE_ON
)
Z_ENABLE_WRITE
(
HIGH
);
#if defined(Z_DUAL_STEPPER_DRIVERS) && defined(Z2_ENABLE_PIN) && Z2_ENABLE_PIN >= 0
Z2_ENABLE_INIT
;
if
(
!
Z_ENABLE_ON
)
Z2_ENABLE_WRITE
(
HIGH
);
if
(
!
Z_ENABLE_ON
)
Z2_ENABLE_WRITE
(
HIGH
);
#endif
#endif
#if defined(E0_ENABLE_PIN) &&
(E0_ENABLE_PIN > -1)
#if defined(E0_ENABLE_PIN) &&
E0_ENABLE_PIN >= 0
E0_ENABLE_INIT
;
if
(
!
E_ENABLE_ON
)
E0_ENABLE_WRITE
(
HIGH
);
if
(
!
E_ENABLE_ON
)
E0_ENABLE_WRITE
(
HIGH
);
#endif
#if defined(E1_ENABLE_PIN) &&
(E1_ENABLE_PIN > -1)
#if defined(E1_ENABLE_PIN) &&
E1_ENABLE_PIN >= 0
E1_ENABLE_INIT
;
if
(
!
E_ENABLE_ON
)
E1_ENABLE_WRITE
(
HIGH
);
if
(
!
E_ENABLE_ON
)
E1_ENABLE_WRITE
(
HIGH
);
#endif
#if defined(E2_ENABLE_PIN) &&
(E2_ENABLE_PIN > -1)
#if defined(E2_ENABLE_PIN) &&
E2_ENABLE_PIN >= 0
E2_ENABLE_INIT
;
if
(
!
E_ENABLE_ON
)
E2_ENABLE_WRITE
(
HIGH
);
if
(
!
E_ENABLE_ON
)
E2_ENABLE_WRITE
(
HIGH
);
#endif
#if defined(E3_ENABLE_PIN) &&
(E3_ENABLE_PIN > -1)
#if defined(E3_ENABLE_PIN) &&
E3_ENABLE_PIN >= 0
E3_ENABLE_INIT
;
if
(
!
E_ENABLE_ON
)
E3_ENABLE_WRITE
(
HIGH
);
if
(
!
E_ENABLE_ON
)
E3_ENABLE_WRITE
(
HIGH
);
#endif
//Choice E0-E1 or E0-E2 or E1-E3 pin
#if defined(E0E1_CHOICE_PIN) && (E0E1_CHOICE_PIN >
-1
)
#if defined(E0E1_CHOICE_PIN) && (E0E1_CHOICE_PIN >
= 0
)
OUT_WRITE
(
E0E1_CHOICE_PIN
,
LOW
);
#endif
#if defined(E0E2_CHOICE_PIN) && (E0E2_CHOICE_PIN >
-1
)
#if defined(E0E2_CHOICE_PIN) && (E0E2_CHOICE_PIN >
= 0
)
OUT_WRITE
(
E0E2_CHOICE_PIN
,
LOW
);
#endif
#if defined(E1E3_CHOICE_PIN) && (E1E3_CHOICE_PIN >
-1
)
#if defined(E1E3_CHOICE_PIN) && (E1E3_CHOICE_PIN >
= 0
)
OUT_WRITE
(
E1E3_CHOICE_PIN
,
LOW
);
#endif
//endstops and pullups
#if defined(X_MIN_PIN) && X_MIN_PIN >
-1
#if defined(X_MIN_PIN) && X_MIN_PIN >
= 0
SET_INPUT
(
X_MIN_PIN
);
#ifdef ENDSTOPPULLUP_XMIN
WRITE
(
X_MIN_PIN
,
HIGH
);
#endif
#endif
#if defined(Y_MIN_PIN) && Y_MIN_PIN >
-1
#if defined(Y_MIN_PIN) && Y_MIN_PIN >
= 0
SET_INPUT
(
Y_MIN_PIN
);
#ifdef ENDSTOPPULLUP_YMIN
WRITE
(
Y_MIN_PIN
,
HIGH
);
#endif
#endif
#if defined(Z_MIN_PIN) && Z_MIN_PIN >
-1
#if defined(Z_MIN_PIN) && Z_MIN_PIN >
= 0
SET_INPUT
(
Z_MIN_PIN
);
#ifdef ENDSTOPPULLUP_ZMIN
WRITE
(
Z_MIN_PIN
,
HIGH
);
#endif
#endif
#if defined(E_MIN_PIN) && E_MIN_PIN >
-1
#if defined(E_MIN_PIN) && E_MIN_PIN >
= 0
SET_INPUT
(
E_MIN_PIN
);
#ifdef ENDSTOPPULLUP_EMIN
WRITE
(
E_MIN_PIN
,
HIGH
);
#endif
#endif
#if defined(X_MAX_PIN) && X_MAX_PIN >
-1
#if defined(X_MAX_PIN) && X_MAX_PIN >
= 0
SET_INPUT
(
X_MAX_PIN
);
#ifdef ENDSTOPPULLUP_XMAX
WRITE
(
X_MAX_PIN
,
HIGH
);
#endif
#endif
#if defined(Y_MAX_PIN) && Y_MAX_PIN >
-1
#if defined(Y_MAX_PIN) && Y_MAX_PIN >
= 0
SET_INPUT
(
Y_MAX_PIN
);
#ifdef ENDSTOPPULLUP_YMAX
WRITE
(
Y_MAX_PIN
,
HIGH
);
#endif
#endif
#if defined(Z_MAX_PIN) && Z_MAX_PIN >
-1
#if defined(Z_MAX_PIN) && Z_MAX_PIN >
= 0
SET_INPUT
(
Z_MAX_PIN
);
#ifdef ENDSTOPPULLUP_ZMAX
WRITE
(
Z_MAX_PIN
,
HIGH
);
#endif
#endif
#define AXIS_INIT(axis, AXIS, PIN) \
AXIS ##_STEP_INIT; \
AXIS ##_STEP_WRITE(INVERT_## PIN ##_STEP_PIN); \
disable_## axis()
//Initialize Step Pins
#if defined(X_STEP_PIN) && (X_STEP_PIN > -1)
X_STEP_INIT
;
X_STEP_WRITE
(
INVERT_X_STEP_PIN
);
disable_x
(
);
#define E_AXIS_INIT(NUM) AXIS_INIT(e## NUM, E## NUM, E)
// Initialize Step Pins
#if defined(X_STEP_PIN) && X_STEP_PIN >= 0
AXIS_INIT
(
x
,
X
,
X
);
#endif
#if defined(X2_STEP_PIN) && (X2_STEP_PIN > -1)
X2_STEP_INIT
;
X2_STEP_WRITE
(
INVERT_X_STEP_PIN
);
disable_x
();
#if defined(X2_STEP_PIN) && X2_STEP_PIN >= 0
AXIS_INIT
(
x
,
X2
,
X
);
#endif
#if defined(Y_STEP_PIN) && (Y_STEP_PIN > -1)
Y_STEP_INIT
;
Y_STEP_WRITE
(
INVERT_Y_STEP_PIN
);
#if defined(Y_DUAL_STEPPER_DRIVERS) && defined(Y2_STEP_PIN) && (Y2_STEP_PIN > -1)
#if defined(Y_STEP_PIN) && Y_STEP_PIN >= 0
#if defined(Y_DUAL_STEPPER_DRIVERS) && defined(Y2_STEP_PIN) && Y2_STEP_PIN >= 0
Y2_STEP_INIT
;
Y2_STEP_WRITE
(
INVERT_Y_STEP_PIN
);
#endif
disable_y
(
);
AXIS_INIT
(
y
,
Y
,
Y
);
#endif
#if defined(Z_STEP_PIN) && (Z_STEP_PIN > -1)
Z_STEP_INIT
;
Z_STEP_WRITE
(
INVERT_Z_STEP_PIN
);
#if defined(Z_DUAL_STEPPER_DRIVERS) && defined(Z2_STEP_PIN) && (Z2_STEP_PIN > -1)
#if defined(Z_STEP_PIN) && Z_STEP_PIN >= 0
#if defined(Z_DUAL_STEPPER_DRIVERS) && defined(Z2_STEP_PIN) && Z2_STEP_PIN >= 0
Z2_STEP_INIT
;
Z2_STEP_WRITE
(
INVERT_Z_STEP_PIN
);
#endif
disable_z
(
);
AXIS_INIT
(
z
,
Z
,
Z
);
#endif
#if defined(E0_STEP_PIN) && (E0_STEP_PIN > -1)
E0_STEP_INIT
;
E0_STEP_WRITE
(
INVERT_E_STEP_PIN
);
disable_e0
();
#if defined(E0_STEP_PIN) && E0_STEP_PIN >= 0
E_AXIS_INIT
(
0
);
#endif
#if defined(E1_STEP_PIN) && (E1_STEP_PIN > -1)
E1_STEP_INIT
;
E1_STEP_WRITE
(
INVERT_E_STEP_PIN
);
disable_e1
();
#if defined(E1_STEP_PIN) && E1_STEP_PIN >= 0
E_AXIS_INIT
(
1
);
#endif
#if defined(E2_STEP_PIN) && (E2_STEP_PIN > -1)
E2_STEP_INIT
;
E2_STEP_WRITE
(
INVERT_E_STEP_PIN
);
disable_e2
();
#if defined(E2_STEP_PIN) && E2_STEP_PIN >= 0
E_AXIS_INIT
(
2
);
#endif
#if defined(E3_STEP_PIN) && (E3_STEP_PIN > -1)
E3_STEP_INIT
;
E3_STEP_WRITE
(
INVERT_E_STEP_PIN
);
disable_e3
();
#if defined(E3_STEP_PIN) && E3_STEP_PIN >= 0
E_AXIS_INIT
(
3
);
#endif
// waveform generation = 0100 = CTC
TCCR1B
&=
~
(
1
<<
WGM13
);
TCCR1B
|=
(
1
<<
WGM12
);
TCCR1A
&=
~
(
1
<<
WGM11
);
TCCR1A
&=
~
(
1
<<
WGM10
);
TCCR1B
&=
~
BIT
(
WGM13
);
TCCR1B
|=
BIT
(
WGM12
);
TCCR1A
&=
~
BIT
(
WGM11
);
TCCR1A
&=
~
BIT
(
WGM10
);
// output mode = 00 (disconnected)
TCCR1A
&=
~
(
3
<<
COM1A0
);
...
...
@@ -1104,15 +989,15 @@ void st_init()
ENABLE_STEPPER_DRIVER_INTERRUPT
();
#ifdef ADVANCE
#if defined(TCCR0A) && defined(WGM01)
TCCR0A
&=
~
(
1
<<
WGM01
);
TCCR0A
&=
~
(
1
<<
WGM00
);
#endif
#if defined(TCCR0A) && defined(WGM01)
TCCR0A
&=
~
BIT
(
WGM01
);
TCCR0A
&=
~
BIT
(
WGM00
);
#endif
e_steps
[
0
]
=
0
;
e_steps
[
1
]
=
0
;
e_steps
[
2
]
=
0
;
e_steps
[
3
]
=
0
;
TIMSK0
|=
(
1
<<
OCIE0A
);
TIMSK0
|=
BIT
(
OCIE0A
);
#endif //ADVANCE
enable_endstops
(
true
);
// Start with endstops active. After homing they can be disabled
...
...
@@ -1121,17 +1006,15 @@ void st_init()
// Block until all buffered steps are executed
void
st_synchronize
()
{
while
(
blocks_queued
())
{
void
st_synchronize
()
{
while
(
blocks_queued
())
{
manage_heater
();
manage_inactivity
();
lcd_update
();
}
}
void
st_set_position
(
const
long
&
x
,
const
long
&
y
,
const
long
&
z
,
const
long
&
e
)
{
void
st_set_position
(
const
long
&
x
,
const
long
&
y
,
const
long
&
z
,
const
long
&
e
)
{
CRITICAL_SECTION_START
;
count_position
[
X_AXIS
]
=
x
;
count_position
[
Y_AXIS
]
=
y
;
...
...
@@ -1140,15 +1023,13 @@ void st_set_position(const long &x, const long &y, const long &z, const long &e)
CRITICAL_SECTION_END
;
}
void
st_set_e_position
(
const
long
&
e
)
{
void
st_set_e_position
(
const
long
&
e
)
{
CRITICAL_SECTION_START
;
count_position
[
E_AXIS
]
=
e
;
CRITICAL_SECTION_END
;
}
long
st_get_position
(
uint8_t
axis
)
{
long
st_get_position
(
uint8_t
axis
)
{
long
count_pos
;
CRITICAL_SECTION_START
;
count_pos
=
count_position
[
axis
];
...
...
@@ -1157,15 +1038,15 @@ long st_get_position(uint8_t axis)
}
#ifdef ENABLE_AUTO_BED_LEVELING
float
st_get_position_mm
(
uint8_t
axis
)
{
float
steper_position_in_steps
=
st_get_position
(
axis
);
return
steper_position_in_steps
/
axis_steps_per_unit
[
axis
];
}
float
st_get_position_mm
(
uint8_t
axis
)
{
float
steper_position_in_steps
=
st_get_position
(
axis
);
return
steper_position_in_steps
/
axis_steps_per_unit
[
axis
];
}
#endif // ENABLE_AUTO_BED_LEVELING
void
finishAndDisableSteppers
()
{
void
finishAndDisableSteppers
()
{
st_synchronize
();
disable_x
();
disable_y
();
...
...
@@ -1176,17 +1057,15 @@ void finishAndDisableSteppers()
disable_e3
();
}
void
quickStop
()
{
void
quickStop
()
{
DISABLE_STEPPER_DRIVER_INTERRUPT
();
while
(
blocks_queued
())
plan_discard_current_block
();
while
(
blocks_queued
())
plan_discard_current_block
();
current_block
=
NULL
;
ENABLE_STEPPER_DRIVER_INTERRUPT
();
}
#ifdef NPR2
void
colorstep
(
long
csteps
,
const
bool
direction
){
void
colorstep
(
long
csteps
,
const
bool
direction
)
{
enable_e1
();
//setup new step
WRITE
(
E1_DIR_PIN
,(
INVERT_E1_DIR
)
^
direction
);
...
...
@@ -1201,150 +1080,77 @@ void quickStop()
#endif //NPR2
#ifdef BABYSTEPPING
void
babystep
(
const
uint8_t
axis
,
const
bool
direction
)
{
//MUST ONLY BE CALLED BY A ISR, it depends on that no other ISR interrupts this
//store initial pin states
switch
(
axis
)
{
case
X_AXIS
:
{
enable_x
();
uint8_t
old_x_dir_pin
=
X_DIR_READ
;
//if dualzstepper, both point to same direction.
//setup new step
X_DIR_WRITE
((
INVERT_X_DIR
)
^
direction
);
#ifdef DUAL_X_CARRIAGE
X2_DIR_WRITE
((
INVERT_X_DIR
)
^
direction
);
#endif
//perform step
X_STEP_WRITE
(
!
INVERT_X_STEP_PIN
);
#ifdef DUAL_X_CARRIAGE
X2_STEP_WRITE
(
!
INVERT_X_STEP_PIN
);
#endif
_delay_us
(
1U
);
// wait 1 microsecond
X_STEP_WRITE
(
INVERT_X_STEP_PIN
);
#ifdef DUAL_X_CARRIAGE
X2_STEP_WRITE
(
INVERT_X_STEP_PIN
);
#endif
// MUST ONLY BE CALLED BY AN ISR,
// No other ISR should ever interrupt this!
void
babystep
(
const
uint8_t
axis
,
const
bool
direction
)
{
#define BABYSTEP_AXIS(axis, AXIS, INVERT) { \
enable_## axis(); \
uint8_t old_pin = AXIS ##_DIR_READ; \
AXIS ##_APPLY_DIR(INVERT_## AXIS ##_DIR^direction^INVERT, true); \
AXIS ##_APPLY_STEP(!INVERT_## AXIS ##_STEP_PIN, true); \
_delay_us(1U); \
AXIS ##_APPLY_STEP(INVERT_## AXIS ##_STEP_PIN, true); \
AXIS ##_APPLY_DIR(old_pin, true); \
}
//get old pin state back.
X_DIR_WRITE
(
old_x_dir_pin
);
#ifdef DUAL_X_CARRIAGE
X2_DIR_WRITE
(
old_x_dir_pin
);
#endif
switch
(
axis
)
{
}
break
;
case
Y_AXIS
:
{
enable_y
();
uint8_t
old_y_dir_pin
=
Y_DIR_READ
;
//if dualzstepper, both point to same direction.
//setup new step
Y_DIR_WRITE
((
INVERT_Y_DIR
)
^
direction
);
#ifdef DUAL_Y_CARRIAGE
Y2_DIR_WRITE
((
INVERT_Y_DIR
)
^
direction
);
#endif
//perform step
Y_STEP_WRITE
(
!
INVERT_Y_STEP_PIN
);
#ifdef DUAL_Y_CARRIAGE
Y2_STEP_WRITE
(
!
INVERT_Y_STEP_PIN
);
#endif
case
X_AXIS
:
BABYSTEP_AXIS
(
x
,
X
,
false
);
break
;
_delay_us
(
1U
);
// wait 1 microsecond
case
Y_AXIS
:
BABYSTEP_AXIS
(
y
,
Y
,
false
);
break
;
case
Z_AXIS
:
{
Y_STEP_WRITE
(
INVERT_Y_STEP_PIN
);
#ifdef DUAL_Y_CARRIAGE
Y2_STEP_WRITE
(
INVERT_Y_STEP_PIN
);
#endif
#ifndef DELTA
//get old pin state back.
Y_DIR_WRITE
(
old_y_dir_pin
);
#ifdef DUAL_Y_CARRIAGE
Y2_DIR_WRITE
(
old_y_dir_pin
);
#endif
BABYSTEP_AXIS
(
z
,
Z
,
BABYSTEP_INVERT_Z
);
}
break
;
#ifndef DELTA
case
Z_AXIS
:
{
enable_z
();
uint8_t
old_z_dir_pin
=
Z_DIR_READ
;
//if dualzstepper, both point to same direction.
//setup new step
Z_DIR_WRITE
((
INVERT_Z_DIR
)
^
direction
^
BABYSTEP_INVERT_Z
);
#ifdef Z_DUAL_STEPPER_DRIVERS
Z2_DIR_WRITE
((
INVERT_Z_DIR
)
^
direction
^
BABYSTEP_INVERT_Z
);
#endif
//perform step
Z_STEP_WRITE
(
!
INVERT_Z_STEP_PIN
);
#ifdef Z_DUAL_STEPPER_DRIVERS
Z2_STEP_WRITE
(
!
INVERT_Z_STEP_PIN
);
#endif
#else // DELTA
_delay_us
(
1U
);
// wait 1 microsecond
bool
z_direction
=
direction
^
BABYSTEP_INVERT_Z
;
Z_STEP_WRITE
(
INVERT_Z_STEP_PIN
);
#ifdef Z_DUAL_STEPPER_DRIVERS
Z2_STEP_WRITE
(
INVERT_Z_STEP_PIN
);
#endif
enable_x
();
enable_y
();
enable_z
();
uint8_t
old_x_dir_pin
=
X_DIR_READ
,
old_y_dir_pin
=
Y_DIR_READ
,
old_z_dir_pin
=
Z_DIR_READ
;
//setup new step
X_DIR_WRITE
(
INVERT_X_DIR
^
z_direction
);
Y_DIR_WRITE
(
INVERT_Y_DIR
^
z_direction
);
Z_DIR_WRITE
(
INVERT_Z_DIR
^
z_direction
);
//perform step
X_STEP_WRITE
(
!
INVERT_X_STEP_PIN
);
Y_STEP_WRITE
(
!
INVERT_Y_STEP_PIN
);
Z_STEP_WRITE
(
!
INVERT_Z_STEP_PIN
);
_delay_us
(
1U
);
X_STEP_WRITE
(
INVERT_X_STEP_PIN
);
Y_STEP_WRITE
(
INVERT_Y_STEP_PIN
);
Z_STEP_WRITE
(
INVERT_Z_STEP_PIN
);
//get old pin state back.
X_DIR_WRITE
(
old_x_dir_pin
);
Y_DIR_WRITE
(
old_y_dir_pin
);
Z_DIR_WRITE
(
old_z_dir_pin
);
//get old pin state back.
Z_DIR_WRITE
(
old_z_dir_pin
);
#ifdef Z_DUAL_STEPPER_DRIVERS
Z2_DIR_WRITE
(
old_z_dir_pin
);
#endif
#endif
}
break
;
default
:
break
;
}
}
break
;
#else //DELTA
case
Z_AXIS
:
{
enable_x
();
enable_y
();
enable_z
();
uint8_t
old_x_dir_pin
=
X_DIR_READ
;
uint8_t
old_y_dir_pin
=
Y_DIR_READ
;
uint8_t
old_z_dir_pin
=
Z_DIR_READ
;
//setup new step
X_DIR_WRITE
((
INVERT_X_DIR
)
^
direction
^
BABYSTEP_INVERT_Z
);
Y_DIR_WRITE
((
INVERT_Y_DIR
)
^
direction
^
BABYSTEP_INVERT_Z
);
Z_DIR_WRITE
((
INVERT_Z_DIR
)
^
direction
^
BABYSTEP_INVERT_Z
);
//perform step
X_STEP_WRITE
(
!
INVERT_X_STEP_PIN
);
Y_STEP_WRITE
(
!
INVERT_Y_STEP_PIN
);
Z_STEP_WRITE
(
!
INVERT_Z_STEP_PIN
);
_delay_us
(
1U
);
// wait 1 microsecond
X_STEP_WRITE
(
INVERT_X_STEP_PIN
);
Y_STEP_WRITE
(
INVERT_Y_STEP_PIN
);
Z_STEP_WRITE
(
INVERT_Z_STEP_PIN
);
//get old pin state back.
X_DIR_WRITE
(
old_x_dir_pin
);
Y_DIR_WRITE
(
old_y_dir_pin
);
Z_DIR_WRITE
(
old_z_dir_pin
);
}
break
;
#endif
default
:
break
;
}
}
#endif //BABYSTEPPING
void
digitalPotWrite
(
int
address
,
int
value
)
// From Arduino DigitalPotControl example
{
#if
defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1
// From Arduino DigitalPotControl example
void
digitalPotWrite
(
int
address
,
int
value
)
{
#if
HAS_DIGIPOTSS
digitalWrite
(
DIGIPOTSS_PIN
,
LOW
);
// take the SS pin low to select the chip
SPI
.
transfer
(
address
);
// send in the address and value via SPI:
SPI
.
transfer
(
value
);
...
...
@@ -1353,16 +1159,17 @@ void digitalPotWrite(int address, int value) // From Arduino DigitalPotControl e
#endif
}
void
digipot_init
()
//
Initialize Digipot Motor Current
{
#if
defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1
//
Initialize Digipot Motor Current
void
digipot_init
()
{
#if
HAS_DIGIPOTSS
const
uint8_t
digipot_motor_current
[]
=
DIGIPOT_MOTOR_CURRENT
;
SPI
.
begin
();
pinMode
(
DIGIPOTSS_PIN
,
OUTPUT
);
for
(
int
i
=
0
;
i
<=
4
;
i
++
)
for
(
int
i
=
0
;
i
<=
4
;
i
++
)
{
//digitalPotWrite(digipot_ch[i], digipot_motor_current[i]);
digipot_current
(
i
,
digipot_motor_current
[
i
]);
}
#endif
#ifdef MOTOR_CURRENT_PWM_XY_PIN
pinMode
(
MOTOR_CURRENT_PWM_XY_PIN
,
OUTPUT
);
...
...
@@ -1376,69 +1183,64 @@ void digipot_init() //Initialize Digipot Motor Current
#endif
}
void
digipot_current
(
uint8_t
driver
,
int
current
)
{
#if defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1
void
digipot_current
(
uint8_t
driver
,
int
current
)
{
#if HAS_DIGIPOTSS
const
uint8_t
digipot_ch
[]
=
DIGIPOT_CHANNELS
;
digitalPotWrite
(
digipot_ch
[
driver
],
current
);
#endif
#ifdef MOTOR_CURRENT_PWM_XY_PIN
if
(
driver
==
0
)
analogWrite
(
MOTOR_CURRENT_PWM_XY_PIN
,
(
long
)
current
*
255L
/
(
long
)
MOTOR_CURRENT_PWM_RANGE
);
if
(
driver
==
1
)
analogWrite
(
MOTOR_CURRENT_PWM_Z_PIN
,
(
long
)
current
*
255L
/
(
long
)
MOTOR_CURRENT_PWM_RANGE
);
if
(
driver
==
2
)
analogWrite
(
MOTOR_CURRENT_PWM_E_PIN
,
(
long
)
current
*
255L
/
(
long
)
MOTOR_CURRENT_PWM_RANGE
);
switch
(
driver
)
{
case
0
:
analogWrite
(
MOTOR_CURRENT_PWM_XY_PIN
,
255L
*
current
/
MOTOR_CURRENT_PWM_RANGE
);
break
;
case
1
:
analogWrite
(
MOTOR_CURRENT_PWM_Z_PIN
,
255L
*
current
/
MOTOR_CURRENT_PWM_RANGE
);
break
;
case
2
:
analogWrite
(
MOTOR_CURRENT_PWM_E_PIN
,
255L
*
current
/
MOTOR_CURRENT_PWM_RANGE
);
break
;
}
#endif
}
void
microstep_init
()
{
void
microstep_init
()
{
const
uint8_t
microstep_modes
[]
=
MICROSTEP_MODES
;
#if defined(E1_MS1_PIN) && E1_MS1_PIN >
-1
pinMode
(
E1_MS1_PIN
,
OUTPUT
);
pinMode
(
E1_MS2_PIN
,
OUTPUT
);
#if defined(E1_MS1_PIN) && E1_MS1_PIN >
= 0
pinMode
(
E1_MS1_PIN
,
OUTPUT
);
pinMode
(
E1_MS2_PIN
,
OUTPUT
);
#endif
#if defined(X_MS1_PIN) && X_MS1_PIN >
-1
pinMode
(
X_MS1_PIN
,
OUTPUT
);
pinMode
(
X_MS2_PIN
,
OUTPUT
);
pinMode
(
Y_MS1_PIN
,
OUTPUT
);
pinMode
(
Y_MS2_PIN
,
OUTPUT
);
pinMode
(
Z_MS1_PIN
,
OUTPUT
);
pinMode
(
Z_MS2_PIN
,
OUTPUT
);
pinMode
(
E0_MS1_PIN
,
OUTPUT
);
pinMode
(
E0_MS2_PIN
,
OUTPUT
);
for
(
int
i
=
0
;
i
<=
4
;
i
++
)
microstep_mode
(
i
,
microstep_modes
[
i
]);
#if defined(X_MS1_PIN) && X_MS1_PIN >
= 0
pinMode
(
X_MS1_PIN
,
OUTPUT
);
pinMode
(
X_MS2_PIN
,
OUTPUT
);
pinMode
(
Y_MS1_PIN
,
OUTPUT
);
pinMode
(
Y_MS2_PIN
,
OUTPUT
);
pinMode
(
Z_MS1_PIN
,
OUTPUT
);
pinMode
(
Z_MS2_PIN
,
OUTPUT
);
pinMode
(
E0_MS1_PIN
,
OUTPUT
);
pinMode
(
E0_MS2_PIN
,
OUTPUT
);
for
(
int
i
=
0
;
i
<=
4
;
i
++
)
microstep_mode
(
i
,
microstep_modes
[
i
]);
#endif
}
void
microstep_ms
(
uint8_t
driver
,
int8_t
ms1
,
int8_t
ms2
)
{
if
(
ms1
>
-
1
)
switch
(
driver
)
{
case
0
:
digitalWrite
(
X_MS1_PIN
,
ms1
);
break
;
case
1
:
digitalWrite
(
Y_MS1_PIN
,
ms1
);
break
;
case
2
:
digitalWrite
(
Z_MS1_PIN
,
ms1
);
break
;
case
3
:
digitalWrite
(
E0_MS1_PIN
,
ms1
);
break
;
#if defined(E1_MS1_PIN) && E1_MS1_PIN > -1
case
4
:
digitalWrite
(
E1_MS1_PIN
,
ms1
);
break
;
void
microstep_ms
(
uint8_t
driver
,
int8_t
ms1
,
int8_t
ms2
)
{
if
(
ms1
>=
0
)
switch
(
driver
)
{
case
0
:
digitalWrite
(
X_MS1_PIN
,
ms1
);
break
;
case
1
:
digitalWrite
(
Y_MS1_PIN
,
ms1
);
break
;
case
2
:
digitalWrite
(
Z_MS1_PIN
,
ms1
);
break
;
case
3
:
digitalWrite
(
E0_MS1_PIN
,
ms1
);
break
;
#if defined(E1_MS1_PIN) && E1_MS1_PIN >= 0
case
4
:
digitalWrite
(
E1_MS1_PIN
,
ms1
);
break
;
#endif
}
if
(
ms2
>
-
1
)
switch
(
driver
)
{
case
0
:
digitalWrite
(
X_MS2_PIN
,
ms2
);
break
;
case
1
:
digitalWrite
(
Y_MS2_PIN
,
ms2
);
break
;
case
2
:
digitalWrite
(
Z_MS2_PIN
,
ms2
);
break
;
case
3
:
digitalWrite
(
E0_MS2_PIN
,
ms2
);
break
;
#if defined(E1_MS2_PIN) && E1_MS2_PIN > -1
case
4
:
digitalWrite
(
E1_MS2_PIN
,
ms2
);
break
;
if
(
ms2
>=
0
)
switch
(
driver
)
{
case
0
:
digitalWrite
(
X_MS2_PIN
,
ms2
);
break
;
case
1
:
digitalWrite
(
Y_MS2_PIN
,
ms2
);
break
;
case
2
:
digitalWrite
(
Z_MS2_PIN
,
ms2
);
break
;
case
3
:
digitalWrite
(
E0_MS2_PIN
,
ms2
);
break
;
#if defined(E1_MS2_PIN) && E1_MS2_PIN >= 0
case
4
:
digitalWrite
(
E1_MS2_PIN
,
ms2
);
break
;
#endif
}
}
void
microstep_mode
(
uint8_t
driver
,
uint8_t
stepping_mode
)
{
switch
(
stepping_mode
)
{
void
microstep_mode
(
uint8_t
driver
,
uint8_t
stepping_mode
)
{
switch
(
stepping_mode
)
{
case
1
:
microstep_ms
(
driver
,
MICROSTEP1
);
break
;
case
2
:
microstep_ms
(
driver
,
MICROSTEP2
);
break
;
case
4
:
microstep_ms
(
driver
,
MICROSTEP4
);
break
;
...
...
@@ -1447,25 +1249,23 @@ void microstep_mode(uint8_t driver, uint8_t stepping_mode)
}
}
void
microstep_readings
()
{
void
microstep_readings
()
{
SERIAL_PROTOCOLPGM
(
"MS1,MS2 Pins
\n
"
);
SERIAL_PROTOCOLPGM
(
"X: "
);
SERIAL_PROTOCOL
(
digitalRead
(
X_MS1_PIN
));
SERIAL_PROTOCOLLN
(
digitalRead
(
X_MS2_PIN
));
SERIAL_PROTOCOL
(
digitalRead
(
X_MS1_PIN
));
SERIAL_PROTOCOLLN
(
digitalRead
(
X_MS2_PIN
));
SERIAL_PROTOCOLPGM
(
"Y: "
);
SERIAL_PROTOCOL
(
digitalRead
(
Y_MS1_PIN
));
SERIAL_PROTOCOLLN
(
digitalRead
(
Y_MS2_PIN
));
SERIAL_PROTOCOL
(
digitalRead
(
Y_MS1_PIN
));
SERIAL_PROTOCOLLN
(
digitalRead
(
Y_MS2_PIN
));
SERIAL_PROTOCOLPGM
(
"Z: "
);
SERIAL_PROTOCOL
(
digitalRead
(
Z_MS1_PIN
));
SERIAL_PROTOCOLLN
(
digitalRead
(
Z_MS2_PIN
));
SERIAL_PROTOCOL
(
digitalRead
(
Z_MS1_PIN
));
SERIAL_PROTOCOLLN
(
digitalRead
(
Z_MS2_PIN
));
SERIAL_PROTOCOLPGM
(
"E0: "
);
SERIAL_PROTOCOL
(
digitalRead
(
E0_MS1_PIN
));
SERIAL_PROTOCOLLN
(
digitalRead
(
E0_MS2_PIN
));
#if defined(E1_MS1_PIN) && E1_MS1_PIN >
-1
SERIAL_PROTOCOL
(
digitalRead
(
E0_MS1_PIN
));
SERIAL_PROTOCOLLN
(
digitalRead
(
E0_MS2_PIN
));
#if defined(E1_MS1_PIN) && E1_MS1_PIN >
= 0
SERIAL_PROTOCOLPGM
(
"E1: "
);
SERIAL_PROTOCOL
(
digitalRead
(
E1_MS1_PIN
));
SERIAL_PROTOCOLLN
(
digitalRead
(
E1_MS2_PIN
));
SERIAL_PROTOCOL
(
digitalRead
(
E1_MS1_PIN
));
SERIAL_PROTOCOLLN
(
digitalRead
(
E1_MS2_PIN
));
#endif
}
MarlinKimbra/stepper.h
View file @
86d3dd96
...
...
@@ -25,32 +25,32 @@
#include "stepper_indirection.h"
#if DRIVER_EXTRUDERS > 3
#define
WRITE_E_STEP
(v) { if(current_block->active_driver == 3) { E3_STEP_WRITE(v); } else { if(current_block->active_driver == 2) { E2_STEP_WRITE(v); } else { if(current_block->active_driver == 1) { E1_STEP_WRITE(v); } else { E0_STEP_WRITE(v); }}}}
#define
E_STEP_WRITE
(v) { if(current_block->active_driver == 3) { E3_STEP_WRITE(v); } else { if(current_block->active_driver == 2) { E2_STEP_WRITE(v); } else { if(current_block->active_driver == 1) { E1_STEP_WRITE(v); } else { E0_STEP_WRITE(v); }}}}
#define NORM_E_DIR() { if(current_block->active_driver == 3) { E3_DIR_WRITE( !INVERT_E3_DIR); } else { if(current_block->active_driver == 2) { E2_DIR_WRITE(!INVERT_E2_DIR); } else { if(current_block->active_driver == 1) { E1_DIR_WRITE(!INVERT_E1_DIR); } else { E0_DIR_WRITE(!INVERT_E0_DIR); }}}}
#define REV_E_DIR() { if(current_block->active_driver == 3) { E3_DIR_WRITE(INVERT_E3_DIR); } else { if(current_block->active_driver == 2) { E2_DIR_WRITE(INVERT_E2_DIR); } else { if(current_block->active_driver == 1) { E1_DIR_WRITE(INVERT_E1_DIR); } else { E0_DIR_WRITE(INVERT_E0_DIR); }}}}
#elif DRIVER_EXTRUDERS > 2
#define
WRITE_E_STEP
(v) { if(current_block->active_driver == 2) { E2_STEP_WRITE(v); } else { if(current_block->active_driver == 1) { E1_STEP_WRITE(v); } else { E0_STEP_WRITE(v); }}}
#define
E_STEP_WRITE
(v) { if(current_block->active_driver == 2) { E2_STEP_WRITE(v); } else { if(current_block->active_driver == 1) { E1_STEP_WRITE(v); } else { E0_STEP_WRITE(v); }}}
#define NORM_E_DIR() { if(current_block->active_driver == 2) { E2_DIR_WRITE(!INVERT_E2_DIR); } else { if(current_block->active_driver == 1) { E1_DIR_WRITE(!INVERT_E1_DIR); } else { E0_DIR_WRITE(!INVERT_E0_DIR); }}}
#define REV_E_DIR() { if(current_block->active_driver == 2) { E2_DIR_WRITE(INVERT_E2_DIR); } else { if(current_block->active_driver == 1) { E1_DIR_WRITE(INVERT_E1_DIR); } else { E0_DIR_WRITE(INVERT_E0_DIR); }}}
#elif DRIVER_EXTRUDERS > 1
#ifndef DUAL_X_CARRIAGE
#define
WRITE_E_STEP
(v) { if(current_block->active_driver == 1) { E1_STEP_WRITE(v); } else { E0_STEP_WRITE(v); }}
#define
E_STEP_WRITE
(v) { if(current_block->active_driver == 1) { E1_STEP_WRITE(v); } else { E0_STEP_WRITE(v); }}
#define NORM_E_DIR() { if(current_block->active_driver == 1) { E1_DIR_WRITE(!INVERT_E1_DIR); } else { E0_DIR_WRITE(!INVERT_E0_DIR); }}
#define REV_E_DIR() { if(current_block->active_driver == 1) { E1_DIR_WRITE(INVERT_E1_DIR); } else { E0_DIR_WRITE(INVERT_E0_DIR); }}
#else
extern
bool
extruder_duplication_enabled
;
#define
WRITE_E_STEP
(v) { if(extruder_duplication_enabled) { E0_STEP_WRITE(v); E1_STEP_WRITE(v); } else if(current_block->active_driver == 1) { E1_STEP_WRITE(v); } else { E0_STEP_WRITE(v); }}
#define
E_STEP_WRITE
(v) { if(extruder_duplication_enabled) { E0_STEP_WRITE(v); E1_STEP_WRITE(v); } else if(current_block->active_driver == 1) { E1_STEP_WRITE(v); } else { E0_STEP_WRITE(v); }}
#define NORM_E_DIR() { if(extruder_duplication_enabled) { E0_DIR_WRITE(!INVERT_E0_DIR); E1_DIR_WRITE(!INVERT_E1_DIR); } else if(current_block->active_driver == 1) { E1_DIR_WRITE(!INVERT_E1_DIR); } else { E0_DIR_WRITE(!INVERT_E0_DIR); }}
#define REV_E_DIR() { if(extruder_duplication_enabled) { E0_DIR_WRITE(INVERT_E0_DIR); E1_DIR_WRITE(INVERT_E1_DIR); } else if(current_block->active_driver == 1) { E1_DIR_WRITE(INVERT_E1_DIR); } else { E0_DIR_WRITE(INVERT_E0_DIR); }}
#endif
#else
#define
WRITE_E_STEP
(v) E0_STEP_WRITE(v)
#define
E_STEP_WRITE
(v) E0_STEP_WRITE(v)
#define NORM_E_DIR() E0_DIR_WRITE(!INVERT_E0_DIR)
#define REV_E_DIR() E0_DIR_WRITE(INVERT_E0_DIR)
#endif //DRIVER_EXTRUDERS
#ifdef ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
extern
bool
abort_on_endstop_hit
;
extern
bool
abort_on_endstop_hit
;
#endif
// Initialize and start the stepper motor subsystem
...
...
@@ -67,8 +67,8 @@ void st_set_e_position(const long &e);
long
st_get_position
(
uint8_t
axis
);
#ifdef ENABLE_AUTO_BED_LEVELING
// Get current position in mm
float
st_get_position_mm
(
uint8_t
axis
);
// Get current position in mm
float
st_get_position_mm
(
uint8_t
axis
);
#endif //ENABLE_AUTO_BED_LEVELING
// The stepper subsystem goes to sleep when it runs out of things to execute. Call this
...
...
MarlinKimbra/temperature.cpp
View file @
86d3dd96
...
...
@@ -574,17 +574,17 @@ inline void _temp_error(int e, const char *msg1, const char *msg2) {
void
max_temp_error
(
uint8_t
e
)
{
disable_heater
();
_temp_error
(
e
,
MSG_MAXTEMP_EXTRUDER_OFF
,
MSG_ERR_MAXTEMP
);
_temp_error
(
e
,
PSTR
(
MSG_MAXTEMP_EXTRUDER_OFF
),
PSTR
(
MSG_ERR_MAXTEMP
)
);
}
void
min_temp_error
(
uint8_t
e
)
{
disable_heater
();
_temp_error
(
e
,
MSG_MINTEMP_EXTRUDER_OFF
,
MSG_ERR_MINTEMP
);
_temp_error
(
e
,
PSTR
(
MSG_MINTEMP_EXTRUDER_OFF
),
PSTR
(
MSG_ERR_MINTEMP
)
);
}
void
bed_max_temp_error
(
void
)
{
#if HAS_HEATER_BED
WRITE_HEATER_BED
(
0
);
#endif
_temp_error
(
-
1
,
MSG_MAXTEMP_BED_OFF
,
MSG_ERR_MAXTEMP_BED
);
_temp_error
(
-
1
,
PSTR
(
MSG_MAXTEMP_BED_OFF
),
PSTR
(
MSG_ERR_MAXTEMP_BED
)
);
}
void
manage_heater
()
{
...
...
@@ -939,8 +939,8 @@ void tp_init()
{
#if MB(RUMBA) && ((TEMP_SENSOR_0==-1)||(TEMP_SENSOR_1==-1)||(TEMP_SENSOR_2==-1)||(TEMP_SENSOR_BED==-1))
//disable RUMBA JTAG in case the thermocouple extension is plugged on top of JTAG connector
MCUCR
=
(
1
<<
JTD
);
MCUCR
=
(
1
<<
JTD
);
MCUCR
=
BIT
(
JTD
);
MCUCR
=
BIT
(
JTD
);
#endif
// Finish init of mult extruder arrays
...
...
@@ -1003,13 +1003,13 @@ void tp_init()
#endif //HEATER_0_USES_MAX6675
#ifdef DIDR2
#define ANALOG_SELECT(pin) do{ if (pin < 8) DIDR0 |=
1 << pin; else DIDR2 |= 1 <<
(pin - 8); }while(0)
#define ANALOG_SELECT(pin) do{ if (pin < 8) DIDR0 |=
BIT(pin); else DIDR2 |= BIT
(pin - 8); }while(0)
#else
#define ANALOG_SELECT(pin) do{ DIDR0 |=
1 << pin
; }while(0)
#define ANALOG_SELECT(pin) do{ DIDR0 |=
BIT(pin)
; }while(0)
#endif
// Set analog inputs
ADCSRA
=
1
<<
ADEN
|
1
<<
ADSC
|
1
<<
ADIF
|
0x07
;
ADCSRA
=
BIT
(
ADEN
)
|
BIT
(
ADSC
)
|
BIT
(
ADIF
)
|
0x07
;
DIDR0
=
0
;
#ifdef DIDR2
DIDR2
=
0
;
...
...
@@ -1036,7 +1036,7 @@ void tp_init()
// Use timer0 for temperature measurement
// Interleave temperature interrupt with millies interrupt
OCR0B
=
128
;
TIMSK0
|=
(
1
<<
OCIE0B
);
TIMSK0
|=
BIT
(
OCIE0B
);
// Wait for temperature measurement to settle
delay
(
250
);
...
...
@@ -1252,12 +1252,12 @@ void disable_heater() {
max6675_temp
=
0
;
#ifdef PRR
PRR
&=
~
(
1
<<
PRSPI
);
PRR
&=
~
BIT
(
PRSPI
);
#elif defined(PRR0)
PRR0
&=
~
(
1
<<
PRSPI
);
PRR0
&=
~
BIT
(
PRSPI
);
#endif
SPCR
=
(
1
<<
MSTR
)
|
(
1
<<
SPE
)
|
(
1
<<
SPR0
);
SPCR
=
BIT
(
MSTR
)
|
BIT
(
SPE
)
|
BIT
(
SPR0
);
// enable TT_MAX6675
WRITE
(
MAX6675_SS
,
0
);
...
...
@@ -1268,13 +1268,13 @@ void disable_heater() {
// read MSB
SPDR
=
0
;
for
(;(
SPSR
&
(
1
<<
SPIF
))
==
0
;);
for
(;(
SPSR
&
BIT
(
SPIF
))
==
0
;);
max6675_temp
=
SPDR
;
max6675_temp
<<=
8
;
// read LSB
SPDR
=
0
;
for
(;(
SPSR
&
(
1
<<
SPIF
))
==
0
;);
for
(;(
SPSR
&
BIT
(
SPIF
))
==
0
;);
max6675_temp
|=
SPDR
;
// disable TT_MAX6675
...
...
@@ -1319,7 +1319,7 @@ ISR(TIMER0_COMPB_vect) {
static
unsigned
long
raw_temp_3_value
=
0
;
static
unsigned
long
raw_temp_bed_value
=
0
;
static
TempState
temp_state
=
StartupDelay
;
static
unsigned
char
pwm_count
=
(
1
<<
SOFT_PWM_SCALE
);
static
unsigned
char
pwm_count
=
BIT
(
SOFT_PWM_SCALE
);
// Static members for each heater
#ifdef SLOW_PWM_HEATERS
...
...
@@ -1407,7 +1407,7 @@ ISR(TIMER0_COMPB_vect) {
if
(
soft_pwm_fan
<
pwm_count
)
WRITE_FAN
(
0
);
#endif
pwm_count
+=
(
1
<<
SOFT_PWM_SCALE
);
pwm_count
+=
BIT
(
SOFT_PWM_SCALE
);
pwm_count
&=
0x7f
;
#else // SLOW_PWM_HEATERS
...
...
@@ -1492,7 +1492,7 @@ ISR(TIMER0_COMPB_vect) {
if
(
soft_pwm_fan
<
pwm_count
)
WRITE_FAN
(
0
);
#endif //FAN_SOFT_PWM
pwm_count
+=
(
1
<<
SOFT_PWM_SCALE
);
pwm_count
+=
BIT
(
SOFT_PWM_SCALE
);
pwm_count
&=
0x7f
;
// increment slow_pwm_count only every 64 pwm_count circa 65.5ms
...
...
@@ -1520,9 +1520,9 @@ ISR(TIMER0_COMPB_vect) {
#endif // SLOW_PWM_HEATERS
#define SET_ADMUX_ADCSRA(pin) ADMUX =
(1 << REFS0) | (pin & 0x07); ADCSRA |= 1<<ADSC
#define SET_ADMUX_ADCSRA(pin) ADMUX =
BIT(REFS0) | (pin & 0x07); ADCSRA |= BIT(ADSC)
#ifdef MUX5
#define START_ADC(pin) if (pin > 7) ADCSRB =
1 << MUX5
; else ADCSRB = 0; SET_ADMUX_ADCSRA(pin)
#define START_ADC(pin) if (pin > 7) ADCSRB =
BIT(MUX5)
; else ADCSRB = 0; SET_ADMUX_ADCSRA(pin)
#else
#define START_ADC(pin) ADCSRB = 0; SET_ADMUX_ADCSRA(pin)
#endif
...
...
MarlinKimbra/temperature.h
View file @
86d3dd96
...
...
@@ -146,7 +146,7 @@ FORCE_INLINE bool isCoolingHotend(uint8_t extruder) {
#else
return
target_temperature
[
0
]
<
current_temperature
[
0
];
#endif
}
;
}
FORCE_INLINE
bool
isCoolingBed
()
{
return
target_temperature_bed
<
current_temperature_bed
;
}
...
...
MarlinKimbra/ultralcd.cpp
View file @
86d3dd96
...
...
@@ -13,6 +13,11 @@ int8_t encoderDiff; /* encoderDiff is updated from interrupt context and added t
bool
encoderRateMultiplierEnabled
;
int32_t
lastEncoderMovementMillis
;
int
pageShowInfo
=
0
;
boolean
ChangeScreen
=
false
;
void
set_pageShowInfo
(
int
value
){
pageShowInfo
=
value
;
}
void
set_ChangeScreen
(
boolean
state
)
{
ChangeScreen
=
state
;
}
/* Configuration settings */
int
plaPreheatHotendTemp
;
int
plaPreheatHPBTemp
;
...
...
@@ -651,6 +656,99 @@ void lcd_cooldown() {
lcd_return_to_status
();
}
void
config_lcd_level_bed
()
{
setTargetHotend
(
0
,
0
);
SERIAL_ECHOLN
(
"Leveling..."
);
currentMenu
=
lcd_level_bed
;
enquecommands_P
(
PSTR
(
"G28 M"
));
pageShowInfo
=
0
;
}
void
lcd_level_bed
()
{
if
(
ChangeScreen
){
lcd
.
clear
();
switch
(
pageShowInfo
){
case
0
:
{
lcd
.
setCursor
(
0
,
1
);
lcd_printPGM
(
PSTR
(
MSG_LP_INTRO
));
currentMenu
=
lcd_level_bed
;
ChangeScreen
=
false
;
}
break
;
case
1
:
{
lcd
.
setCursor
(
0
,
1
);
lcd_printPGM
(
PSTR
(
MSG_LP_1
));
currentMenu
=
lcd_level_bed
;
ChangeScreen
=
false
;
}
break
;
case
2
:
{
lcd
.
setCursor
(
0
,
1
);
lcd_printPGM
(
PSTR
(
MSG_LP_2
));
currentMenu
=
lcd_level_bed
;
ChangeScreen
=
false
;
}
break
;
case
3
:
{
lcd
.
setCursor
(
0
,
1
);
lcd_printPGM
(
PSTR
(
MSG_LP_3
));
currentMenu
=
lcd_level_bed
;
ChangeScreen
=
false
;
}
break
;
case
4
:
{
lcd
.
setCursor
(
0
,
1
);
lcd_printPGM
(
PSTR
(
MSG_LP_4
));
currentMenu
=
lcd_level_bed
;
ChangeScreen
=
false
;
}
break
;
case
5
:
{
lcd
.
setCursor
(
0
,
1
);
lcd_printPGM
(
PSTR
(
MSG_LP_5
));
currentMenu
=
lcd_level_bed
;
ChangeScreen
=
false
;
}
break
;
case
6
:
{
lcd
.
setCursor
(
2
,
2
);
lcd_printPGM
(
PSTR
(
MSG_LP_6
));
ChangeScreen
=
false
;
delay
(
1200
);
encoderPosition
=
0
;
lcd
.
clear
();
currentMenu
=
lcd_status_screen
;
lcd_status_screen
();
pageShowInfo
=
0
;
}
break
;
}
}
}
static
void
lcd_prepare_menu
()
{
START_MENU
();
MENU_ITEM
(
back
,
MSG_MAIN
,
lcd_main_menu
);
...
...
@@ -662,7 +760,7 @@ static void lcd_prepare_menu() {
MENU_ITEM
(
gcode
,
MSG_DISABLE_STEPPERS
,
PSTR
(
"M84"
));
MENU_ITEM
(
gcode
,
MSG_AUTO_HOME
,
PSTR
(
"G28"
));
#ifndef DELTA
MENU_ITEM
(
gcode
,
MSG_BED_SETTING
,
PSTR
(
"G28 M"
)
);
MENU_ITEM
(
function
,
MSG_BED_SETTING
,
config_lcd_level_bed
);
#endif
MENU_ITEM
(
function
,
MSG_SET_HOME_OFFSETS
,
lcd_set_home_offsets
);
//MENU_ITEM(gcode, MSG_SET_ORIGIN, PSTR("G92 X0 Y0 Z0"));
...
...
@@ -1531,7 +1629,7 @@ void lcd_buttons_update() {
WRITE
(
SHIFT_LD
,
HIGH
);
for
(
int8_t
i
=
0
;
i
<
8
;
i
++
)
{
newbutton_reprapworld_keypad
>>=
1
;
if
(
READ
(
SHIFT_OUT
))
newbutton_reprapworld_keypad
|=
(
1
<<
7
);
if
(
READ
(
SHIFT_OUT
))
newbutton_reprapworld_keypad
|=
BIT
(
7
);
WRITE
(
SHIFT_CLK
,
HIGH
);
WRITE
(
SHIFT_CLK
,
LOW
);
}
...
...
@@ -1544,7 +1642,7 @@ void lcd_buttons_update() {
unsigned
char
tmp_buttons
=
0
;
for
(
int8_t
i
=
0
;
i
<
8
;
i
++
)
{
newbutton
>>=
1
;
if
(
READ
(
SHIFT_OUT
))
newbutton
|=
(
1
<<
7
);
if
(
READ
(
SHIFT_OUT
))
newbutton
|=
BIT
(
7
);
WRITE
(
SHIFT_CLK
,
HIGH
);
WRITE
(
SHIFT_CLK
,
LOW
);
}
...
...
MarlinKimbra/ultralcd.h
View file @
86d3dd96
...
...
@@ -19,6 +19,11 @@
void
lcd_setcontrast
(
uint8_t
value
);
#endif
void
set_pageShowInfo
(
int
value
);
void
set_ChangeScreen
(
boolean
state
);
void
config_lcd_level_bed
(
void
);
void
lcd_level_bed
(
void
);
static
unsigned
char
blink
=
0
;
// Variable for visualization of fan rotation in GLCD
#define LCD_MESSAGEPGM(x) lcd_setstatuspgm(PSTR(x))
...
...
MarlinKimbra/ultralcd_implementation_hitachi_HD44780.h
View file @
86d3dd96
...
...
@@ -24,13 +24,13 @@
#define BLEN_B 1
#define BLEN_A 0
#define EN_B
(1<<
BLEN_B) // The two encoder pins are connected through BTN_EN1 and BTN_EN2
#define EN_A
(1<<
BLEN_A)
#define EN_B
BIT(
BLEN_B) // The two encoder pins are connected through BTN_EN1 and BTN_EN2
#define EN_A
BIT(
BLEN_A)
#if defined(BTN_ENC) && BTN_ENC > -1
// encoder click is directly connected
#define BLEN_C 2
#define EN_C
(1<<
BLEN_C)
#define EN_C
BIT(
BLEN_C)
#endif
//
...
...
@@ -85,14 +85,14 @@
#define REPRAPWORLD_BTN_OFFSET 3 // bit offset into buttons for shift register values
#define EN_REPRAPWORLD_KEYPAD_F3
(1<<
(BLEN_REPRAPWORLD_KEYPAD_F3+REPRAPWORLD_BTN_OFFSET))
#define EN_REPRAPWORLD_KEYPAD_F2
(1<<
(BLEN_REPRAPWORLD_KEYPAD_F2+REPRAPWORLD_BTN_OFFSET))
#define EN_REPRAPWORLD_KEYPAD_F1
(1<<
(BLEN_REPRAPWORLD_KEYPAD_F1+REPRAPWORLD_BTN_OFFSET))
#define EN_REPRAPWORLD_KEYPAD_UP
(1<<
(BLEN_REPRAPWORLD_KEYPAD_UP+REPRAPWORLD_BTN_OFFSET))
#define EN_REPRAPWORLD_KEYPAD_RIGHT
(1<<
(BLEN_REPRAPWORLD_KEYPAD_RIGHT+REPRAPWORLD_BTN_OFFSET))
#define EN_REPRAPWORLD_KEYPAD_MIDDLE
(1<<
(BLEN_REPRAPWORLD_KEYPAD_MIDDLE+REPRAPWORLD_BTN_OFFSET))
#define EN_REPRAPWORLD_KEYPAD_DOWN
(1<<
(BLEN_REPRAPWORLD_KEYPAD_DOWN+REPRAPWORLD_BTN_OFFSET))
#define EN_REPRAPWORLD_KEYPAD_LEFT
(1<<
(BLEN_REPRAPWORLD_KEYPAD_LEFT+REPRAPWORLD_BTN_OFFSET))
#define EN_REPRAPWORLD_KEYPAD_F3
BIT(
(BLEN_REPRAPWORLD_KEYPAD_F3+REPRAPWORLD_BTN_OFFSET))
#define EN_REPRAPWORLD_KEYPAD_F2
BIT(
(BLEN_REPRAPWORLD_KEYPAD_F2+REPRAPWORLD_BTN_OFFSET))
#define EN_REPRAPWORLD_KEYPAD_F1
BIT(
(BLEN_REPRAPWORLD_KEYPAD_F1+REPRAPWORLD_BTN_OFFSET))
#define EN_REPRAPWORLD_KEYPAD_UP
BIT(
(BLEN_REPRAPWORLD_KEYPAD_UP+REPRAPWORLD_BTN_OFFSET))
#define EN_REPRAPWORLD_KEYPAD_RIGHT
BIT(
(BLEN_REPRAPWORLD_KEYPAD_RIGHT+REPRAPWORLD_BTN_OFFSET))
#define EN_REPRAPWORLD_KEYPAD_MIDDLE
BIT(
(BLEN_REPRAPWORLD_KEYPAD_MIDDLE+REPRAPWORLD_BTN_OFFSET))
#define EN_REPRAPWORLD_KEYPAD_DOWN
BIT(
(BLEN_REPRAPWORLD_KEYPAD_DOWN+REPRAPWORLD_BTN_OFFSET))
#define EN_REPRAPWORLD_KEYPAD_LEFT
BIT(
(BLEN_REPRAPWORLD_KEYPAD_LEFT+REPRAPWORLD_BTN_OFFSET))
#define LCD_CLICKED ((buttons&EN_C) || (buttons&EN_REPRAPWORLD_KEYPAD_F1))
#define REPRAPWORLD_KEYPAD_MOVE_Y_DOWN (buttons&EN_REPRAPWORLD_KEYPAD_DOWN)
...
...
@@ -113,12 +113,12 @@
#define BL_ST 2
//automatic, do not change
#define B_LE
(1<<
BL_LE)
#define B_UP
(1<<
BL_UP)
#define B_MI
(1<<
BL_MI)
#define B_DW
(1<<
BL_DW)
#define B_RI
(1<<
BL_RI)
#define B_ST
(1<<
BL_ST)
#define B_LE
BIT(
BL_LE)
#define B_UP
BIT(
BL_UP)
#define B_MI
BIT(
BL_MI)
#define B_DW
BIT(
BL_DW)
#define B_RI
BIT(
BL_RI)
#define B_ST
BIT(
BL_ST)
#define LCD_CLICKED (buttons&(B_MI|B_ST))
#endif
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment