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
|
/*
*
* RepRap, The Replicating Rapid Prototyper Project
*
* http://reprap.org/
*
* RepRap is copyright (C) 2005-6 University of Bath, the RepRap
* researchers (see the project's People webpage), and other contributors.
*
* RepRap is free; you can redistribute it and/or modify it under the
* terms of the GNU Library General Public Licence as published by the
* Free Software Foundation; either version 2 of the Licence, or (at your
* option) any later version.
*
* RepRap 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 Library General Public
* Licence for more details.
*
* For this purpose the words "software" and "library" in the GNU Library
* General Public Licence are taken to mean any and all computer programs
* computer files data results documents and other copyright information
* available from the RepRap project.
*
* You should have received a copy of the GNU Library General Public
* Licence along with RepRap (in reports, it will be one of the
* appendices, for example); if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or see
*
* http://www.gnu.org/
*
*/
#include "stepmotor.h"
#include "serial.h"
typedef unsigned int config;
config at 0x2007 __CONFIG = _CP_OFF &
_WDT_OFF &
_BODEN_OFF &
_PWRTE_ON &
_INTRC_OSC_NOCLKOUT &
_MCLRE_OFF &
_LVP_OFF;
byte deviceAddress = PORT;
static void isr() interrupt 0 {
serialInterruptHandler();
if (TMR1IF) {
timerTick();
TMR1IF = 0;
}
}
void init1()
{
OPTION_REG = BIN(01011111); // Disable TMR0 on RA4, 1:128 WDT, pullups on
CMCON = 0xff; // Comparator module defaults
#ifdef UNIVERSAL_PCB
TRISA = BIN(00101010); // Port A outputs except 1,3 (sync) and 5 (Max)
// RA0 is L298 4
// RA1 is Sync
// RA2 is L298 3
// RA3 is Sync
// RA4 is the indicator LED
// RA5 is Max sensor
// RA6 is not used for the stepper
// RA7 is not used for the stepper
TRISB = BIN(00000011); // Port B 0,1 input, 2-7 outputs
// RB0 is Min sensor
// RB1 is Rx
// RB2 is Tx
// RB3 is PWM output to L298
// RB4 is L298 2
// RB5 is L298 1
// RB6 is not used
// RB7 is not used
#else
TRISA = BIN(00101100); // Port A outputs except 2,3 (sync)
// RA3 is input for max limit sensor
// RA4 is the indicator LED
// RA5 can only be used as an input
TRISB = BIN(00000111); // Port B 0-2 input, 3-7 outputs
// Port B3 is PWM output
#endif
PIE1 = BIN(00000000); // All peripheral interrupts initially disabled
INTCON = BIN(00000000); // Interrupts disabled
PIR1 = 0; // Clear peripheral interrupt flags
SPBRG = 12; // 12 = 19200 (actually 19230) baud @ 4MHz
TXSTA = BIN(00000100); // 8 bit high speed
RCSTA = BIN(10000000); // Enable port for 8 bit receive
PORTB = PULLUPS; // Turn on pullups for B0,3
RCIE = 1; // Enable receive interrupts
CREN = 1; // Start reception
TXEN = 1; // Enable transmit
PEIE = 1; // Peripheral interrupts on
GIE = 1; // Now turn on interrupts
PORTB = 0;
PORTA = 0;
TMR1IE = 0;
TMR2 = 0;
CCPR1L = 4; // Default power-up current limiting (25%)
PR2 = 16;
CCP1CON = BIN(00001100); // PWM mode
T2CON = BIN(00000100); // Start timer 1:1 prescale, 1:1 postscale
T1CON = BIN(00000000); // Timer 1 in clock mode with 1:1 scale
TMR1IE = 1; // Enable timer interrupt
}
void main() {
byte syncEnabled = 0;
init1();
init2();
serial_init();
// Clear up any boot noise from the TSR
uartTransmit(0);
if (SYNCA) // Only enable if SYNCA is by default high
syncEnabled = 1;
for(;;) {
if (packetReady()) {
processCommand();
releaseLock();
}
if (syncEnabled && !SYNCA) {
// Sync line has dropped
// Spin until it goes high again (we trigger on the rising edge)
while(!SYNCA)
;
syncStrobe();
}
clearwdt();
}
}
|