summaryrefslogtreecommitdiff
path: root/trunk/darwin/firmware/PIC/devices/extruder_1/extruder1.c
blob: 66133e600138e2d6fd94254c1410f3c062054d42 (plain)
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
/*
 *
 * 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 "extruder.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 (RBIF)
    motorTick();

  if (TMR1IF) {
    timerTick();
    TMR1IF = 0;
  }

}

void init1()
{
  byte v = 0;

  OPTION_REG = BIN(01011111); // Disable TMR0 on RA4, 1:128 WDT, pullups on
  CMCON = BIN(00000010);      // Comparator: compare RA0 to int. ref.
  TRISA = BIN(11111111);      // Port A all inputs for now
// RB0 is Extrude speed sensor
// RB1 is Rx
// RB2 is Tx 
// RB3 is PWM output to L298                                                                                       
// RB4 is L298 2 (Extrude)
// RB5 is L298 1 (Extrude)
// RB6 is not used
// RB7 is not used
#ifdef UNIVERSAL_PCB
  TRISB = BIN(11000111);
#else 
  TRISB = BIN(11000110);      // Port B outputs, except 1/2 for serial and
                              // RB7 for optointerrupter input
                              // RB6 for material out detector
                              // RB0 for heater controller output
#endif
  // Note port B3 will be used for PWM output (CCP1)
  PIE1 = BIN(00000000);       // All peripheral interrupts initially disabled
  INTCON = BIN(00000000);     // Interrupts disabled
  PIR1 = 0;                   // Clear peripheral interrupt flags
  SPBRG = 12;                 // 12 = ~19200 baud @ 4MHz

  TXSTA = BIN(00000100);      // 8 bit high speed 
  RCSTA = BIN(10000000);      // Enable port for 8 bit receive

  RCIE = 1;  // Enable receive interrupts
  CREN = 1;  // Start reception

  TXEN = 1;  // Enable transmit
  RBIE = 1;  // Enable RB port change interrupt

  PEIE = 1;  // Peripheral interrupts on
  GIE = 1;   // Now turn on interrupts
#ifdef UNIVERSAL_PCB
  PORTB = BIN(11000001);
  TRISA = BIN(11000010) | PORTATRIS;  // Turn off A/D lines,
                                      // but set others as required  
  PORTA = 0;
#else
  PORTB = BIN(11000000);  // Pullup on RB6,RB7 for opto-inputs
  TRISA = BIN(11000010) | PORTATRIS;  // Turn off A/D lines,
                                      // but set others as required  
  PORTA = 0;
#endif


  TMR1IE = 0;
  T1CON = BIN(00000000);  // Timer 1 in clock mode with 1:1 scale
  TMR1IE = 1;  // Enable timer interrupt
  TMR1ON = 1;

  PR2 = PWMPeriod;          // Initial PWM period
  CCP1CON = BIN(00001100);  // Enable PWM mode
  CCPR1L = 0;               // Start turned off
  
  T2CON = BIN(00000100);    // Enable timer 2 and set prescale to 1
}

void main() {
  init2();  // Order is important here, otherwise interrupts will occur
            // before initialisation.  Once sdcc bugs are fixed, this
            // will not matter.
  init1();
  serial_init();

  // Clear up any boot noise from the TSR
  GIE=0;
  uartTransmit(0);
  GIE=1;

  for(;;) {
    if (packetReady()) {
      processCommand();
      releaseLock();
    }
    checkTemperature();
    delay_10us();
    clearwdt();
  }
}