forked from bqlabs/horus-fw
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.c
202 lines (166 loc) · 5.39 KB
/
main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
/*
main.c - Firmware for 3D Scanners using g-codes
Part of Horus Firmware
Copyright (c) 2014-2015 Mundo Reader S.L.
Horus Firmware is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Horus Firmware is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Horus Firmware. If not, see <http://www.gnu.org/licenses/>.
*/
/*
This file is based on work from Grbl v0.9, distributed under the
terms of the GPLv3. See COPYING for more details.
Copyright (c) 2009-2011 Simen Svale Skogsrud
Copyright (c) 2011-2014 Sungeun K. Jeon
*/
#include "system.h"
#include "serial.h"
#include "settings.h"
#include "protocol.h"
#include "gcode.h"
#include "planner.h"
#include "stepper.h"
#include "motion_control.h"
#include "probe.h"
#include "report.h"
#include "ldr.h"
#include "limits.h"
// ----------- WAVGAT boards support ---------
/* For WAVGAT boards the manufacturer/seller provide the URL to download board specific files
* after installing this files you can select the right board in Arduino IDE (WAVGAT UNO R3) and use it normally
*
* But to compile Horus-FW you should edit
* hardware\wavgat\WAV8F\cores\lgt8f\wiring.c
* and comment out (disable) following functions:
* ISR(TIMER0_OVF_vect)
* unsigned long millis()
* unsigned long micros()
* void delay(unsigned long ms)
*/
#if defined(ARDUINO_AVR_LARDU_328E)
#include "lgtx8p.h"
#define NO_TIM0
#define INT_OSC 0
#define EXT_OSC 1
void sysClock(uint8_t mode)
{
if(mode == EXT_OSC) {
// enable external crystal
GPIOR0 = PMCR | 0x04;
PMCR = 0x80;
PMCR = GPIOR0;
// waiting for crystal stable
delay(20);
// switch to external crystal
GPIOR0 = (PMCR & 0x9f) | 0x20;
PMCR = 0x80;
PMCR = GPIOR0;
// set to right prescale
CLKPR = 0x80;
CLKPR = 0x00;
} else if(mode == INT_OSC) {
// prescaler settings
CLKPR = 0x80;
CLKPR = 0x01;
// switch to internal crystal
GPIOR0 = PMCR & 0x9f;
PMCR = 0x80;
PMCR = GPIOR0;
// disable external crystal
GPIOR0 = PMCR & 0xfb;
PMCR = 0x80;
PMCR = GPIOR0;
}
}
void lgt8fx8x_init()
{
#if defined(__LGT8FX8E__)
// store ivref calibration
GPIOR1 = VCAL1;
GPIOR2 = VCAL2;
#if defined(__LGT8F_SSOP20__)
GPIOR0 = PMXCR | 0x07;
PMXCR = 0x80;
PMXCR = GPIOR0;
#endif
// enable 1KB E2PROM
ECCR = 0x80;
ECCR = 0x40;
// clock source settings
if((VDTCR & 0x0C) == 0x0C) {
// switch to external crystal
sysClock(EXT_OSC);
} else {
CLKPR = 0x80;
CLKPR = 0x01;
}
#else
// enable 32KRC for WDT
GPIOR0 = PMCR | 0x10;
PMCR = 0x80;
PMCR = GPIOR0;
// clock scalar to 16MHz
CLKPR = 0x80;
CLKPR = 0x01;
#endif
}
#endif
// Declare system global variable structure
system_t sys;
int main(void)
{
#if defined(ARDUINO_AVR_LARDU_328E)
lgt8fx8x_init();
#endif
// Initialize system upon power-up.
serial_init(); // Setup serial baud rate and interrupts
settings_init(); // Load grbl settings from EEPROM
stepper_init(); // Configure stepper pins and interrupt timers
system_init(); // Configure pinout pins and pin-change interrupt
ldr_init(); //Setup the ADC
memset(&sys, 0, sizeof(sys)); // Clear all system variables
sys.abort = true; // Set abort to complete initialization
sei(); // Enable interrupts
// Check for power-up and set system alarm if homing is enabled to force homing cycle
// by setting Grbl's alarm state. Alarm locks out all g-code commands, including the
// startup scripts, but allows access to settings and internal commands. Only a homing
// cycle '$H' or kill alarm locks '$X' will disable the alarm.
// NOTE: The startup script will run after successful completion of the homing cycle, but
// not after disabling the alarm locks. Prevents motion startup blocks from crashing into
// things uncontrollably. Very bad.
#ifdef HOMING_INIT_LOCK
if (bit_istrue(settings.flags,BITFLAG_HOMING_ENABLE)) { sys.state = STATE_ALARM; }
#endif
// Grbl initialization loop upon power-up or a system abort. For the latter, all processes
// will return to this loop to be cleanly re-initialized.
for(;;) {
// TODO: Separate configure task that require interrupts to be disabled, especially upon
// a system abort and ensuring any active interrupts are cleanly reset.
// Reset Grbl primary systems.
serial_reset_read_buffer(); // Clear serial read buffer
gc_init(); // Set g-code parser to default state
laser_init();
limits_init();
probe_init();
plan_reset(); // Clear block buffer and planner variables
st_reset(); // Clear stepper subsystem variables.
// Sync cleared gcode and planner positions to current system position.
plan_sync_position();
gc_sync_position();
// Reset system variables.
sys.abort = false;
sys.execute = 0;
if (bit_istrue(settings.flags,BITFLAG_AUTO_START)) { sys.auto_start = true; }
else { sys.auto_start = false; }
// sys.soft_limit = false;
// Start Grbl main loop. Processes program inputs and executes them.
protocol_main_loop();
}
return 0; /* Never reached */
}