Browse Source

Merge pull request #1674 from thinkyhead/fix_temperature_minmax

Cleanup temperature code
Scott Lahteine 10 years ago
parent
commit
e2576b1ac5
1 changed files with 46 additions and 41 deletions
  1. 46
    41
      Marlin/temperature.cpp

+ 46
- 41
Marlin/temperature.cpp View File

177
 // Init min and max temp with extreme values to prevent false errors during startup
177
 // Init min and max temp with extreme values to prevent false errors during startup
178
 static int minttemp_raw[EXTRUDERS] = ARRAY_BY_EXTRUDERS( HEATER_0_RAW_LO_TEMP , HEATER_1_RAW_LO_TEMP , HEATER_2_RAW_LO_TEMP, HEATER_3_RAW_LO_TEMP);
178
 static int minttemp_raw[EXTRUDERS] = ARRAY_BY_EXTRUDERS( HEATER_0_RAW_LO_TEMP , HEATER_1_RAW_LO_TEMP , HEATER_2_RAW_LO_TEMP, HEATER_3_RAW_LO_TEMP);
179
 static int maxttemp_raw[EXTRUDERS] = ARRAY_BY_EXTRUDERS( HEATER_0_RAW_HI_TEMP , HEATER_1_RAW_HI_TEMP , HEATER_2_RAW_HI_TEMP, HEATER_3_RAW_HI_TEMP);
179
 static int maxttemp_raw[EXTRUDERS] = ARRAY_BY_EXTRUDERS( HEATER_0_RAW_HI_TEMP , HEATER_1_RAW_HI_TEMP , HEATER_2_RAW_HI_TEMP, HEATER_3_RAW_HI_TEMP);
180
-static int minttemp[EXTRUDERS] = ARRAY_BY_EXTRUDERS( 0, 0, 0, 0 );
180
+static int minttemp[EXTRUDERS] = { 0 };
181
 static int maxttemp[EXTRUDERS] = ARRAY_BY_EXTRUDERS( 16383, 16383, 16383, 16383 );
181
 static int maxttemp[EXTRUDERS] = ARRAY_BY_EXTRUDERS( 16383, 16383, 16383, 16383 );
182
 //static int bed_minttemp_raw = HEATER_BED_RAW_LO_TEMP; /* No bed mintemp error implemented?!? */
182
 //static int bed_minttemp_raw = HEATER_BED_RAW_LO_TEMP; /* No bed mintemp error implemented?!? */
183
 #ifdef BED_MAXTEMP
183
 #ifdef BED_MAXTEMP
197
 static void updateTemperaturesFromRawValues();
197
 static void updateTemperaturesFromRawValues();
198
 
198
 
199
 #ifdef WATCH_TEMP_PERIOD
199
 #ifdef WATCH_TEMP_PERIOD
200
-  int watch_start_temp[EXTRUDERS] = ARRAY_BY_EXTRUDERS(0,0,0,0);
201
-  unsigned long watchmillis[EXTRUDERS] = ARRAY_BY_EXTRUDERS(0,0,0,0);
200
+  int watch_start_temp[EXTRUDERS] = { 0 };
201
+  unsigned long watchmillis[EXTRUDERS] = { 0 };
202
 #endif //WATCH_TEMP_PERIOD
202
 #endif //WATCH_TEMP_PERIOD
203
 
203
 
204
 #ifndef SOFT_PWM_SCALE
204
 #ifndef SOFT_PWM_SCALE
661
 
661
 
662
   updateTemperaturesFromRawValues();
662
   updateTemperaturesFromRawValues();
663
 
663
 
664
-  #ifdef HEATER_0_USES_MAX6675
665
-    float ct = current_temperature[0];
666
-    if (ct > min(HEATER_0_MAXTEMP, 1023)) max_temp_error(0);
667
-    if (ct < max(HEATER_0_MINTEMP, 0.01)) min_temp_error(0);
668
-  #endif //HEATER_0_USES_MAX6675
669
-
670
   unsigned long ms = millis();
664
   unsigned long ms = millis();
671
 
665
 
672
   // Loop through all extruders
666
   // Loop through all extruders
1145
   for (int i=0; i<EXTRUDERS; i++) setTargetHotend(0, i);
1139
   for (int i=0; i<EXTRUDERS; i++) setTargetHotend(0, i);
1146
   setTargetBed(0);
1140
   setTargetBed(0);
1147
 
1141
 
1142
+  #define DISABLE_HEATER(NR) { \
1143
+    target_temperature[NR] = 0; \
1144
+    soft_pwm[NR] = 0; \
1145
+    WRITE_HEATER_ ## NR (LOW); \
1146
+  }
1147
+
1148
   #if HAS_TEMP_0
1148
   #if HAS_TEMP_0
1149
     target_temperature[0] = 0;
1149
     target_temperature[0] = 0;
1150
     soft_pwm[0] = 0;
1150
     soft_pwm[0] = 0;
1151
-    WRITE_HEATER_0P(LOW); // If HEATERS_PARALLEL should apply, change to WRITE_HEATER_0
1151
+    WRITE_HEATER_0P(LOW); // Should HEATERS_PARALLEL apply here? Then change to DISABLE_HEATER(0)
1152
   #endif
1152
   #endif
1153
 
1153
 
1154
   #if EXTRUDERS > 1 && HAS_TEMP_1
1154
   #if EXTRUDERS > 1 && HAS_TEMP_1
1155
-    target_temperature[1] = 0;
1156
-    soft_pwm[1] = 0;
1157
-    WRITE_HEATER_1(LOW);
1155
+    DISABLE_HEATER(1);
1158
   #endif
1156
   #endif
1159
 
1157
 
1160
   #if EXTRUDERS > 2 && HAS_TEMP_2
1158
   #if EXTRUDERS > 2 && HAS_TEMP_2
1161
-    target_temperature[2] = 0;
1162
-    soft_pwm[2] = 0;
1163
-    WRITE_HEATER_2(LOW);
1159
+    DISABLE_HEATER(2);
1164
   #endif
1160
   #endif
1165
 
1161
 
1166
   #if EXTRUDERS > 3 && HAS_TEMP_3
1162
   #if EXTRUDERS > 3 && HAS_TEMP_3
1167
-    target_temperature[3] = 0;
1168
-    soft_pwm[3] = 0;
1169
-    WRITE_HEATER_3(LOW);
1163
+    DISABLE_HEATER(3);
1170
   #endif
1164
   #endif
1171
 
1165
 
1172
   #if HAS_TEMP_BED
1166
   #if HAS_TEMP_BED
1257
 // Timer 0 is shared with millies
1251
 // Timer 0 is shared with millies
1258
 //
1252
 //
1259
 ISR(TIMER0_COMPB_vect) {
1253
 ISR(TIMER0_COMPB_vect) {
1254
+  #ifdef TEMP_SENSOR_1_AS_REDUNDANT
1255
+    #define TEMP_SENSOR_COUNT 2
1256
+  #else 
1257
+    #define TEMP_SENSOR_COUNT EXTRUDERS
1258
+  #endif
1259
+
1260
   //these variables are only accesible from the ISR, but static, so they don't lose their value
1260
   //these variables are only accesible from the ISR, but static, so they don't lose their value
1261
   static unsigned char temp_count = 0;
1261
   static unsigned char temp_count = 0;
1262
-  static unsigned long raw_temp_value[EXTRUDERS] = { 0 };
1262
+  static unsigned long raw_temp_value[TEMP_SENSOR_COUNT] = { 0 };
1263
   static unsigned long raw_temp_bed_value = 0;
1263
   static unsigned long raw_temp_bed_value = 0;
1264
   static TempState temp_state = StartupDelay;
1264
   static TempState temp_state = StartupDelay;
1265
   static unsigned char pwm_count = BIT(SOFT_PWM_SCALE);
1265
   static unsigned char pwm_count = BIT(SOFT_PWM_SCALE);
1475
       #endif
1475
       #endif
1476
       temp_state = PrepareTemp_BED;
1476
       temp_state = PrepareTemp_BED;
1477
       break;
1477
       break;
1478
+
1478
     case PrepareTemp_BED:
1479
     case PrepareTemp_BED:
1479
       #if HAS_TEMP_BED
1480
       #if HAS_TEMP_BED
1480
         START_ADC(TEMP_BED_PIN);
1481
         START_ADC(TEMP_BED_PIN);
1488
       #endif
1489
       #endif
1489
       temp_state = PrepareTemp_1;
1490
       temp_state = PrepareTemp_1;
1490
       break;
1491
       break;
1492
+
1491
     case PrepareTemp_1:
1493
     case PrepareTemp_1:
1492
       #if HAS_TEMP_1
1494
       #if HAS_TEMP_1
1493
         START_ADC(TEMP_1_PIN);
1495
         START_ADC(TEMP_1_PIN);
1501
       #endif
1503
       #endif
1502
       temp_state = PrepareTemp_2;
1504
       temp_state = PrepareTemp_2;
1503
       break;
1505
       break;
1506
+
1504
     case PrepareTemp_2:
1507
     case PrepareTemp_2:
1505
       #if HAS_TEMP_2
1508
       #if HAS_TEMP_2
1506
         START_ADC(TEMP_2_PIN);
1509
         START_ADC(TEMP_2_PIN);
1514
       #endif
1517
       #endif
1515
       temp_state = PrepareTemp_3;
1518
       temp_state = PrepareTemp_3;
1516
       break;
1519
       break;
1520
+
1517
     case PrepareTemp_3:
1521
     case PrepareTemp_3:
1518
       #if HAS_TEMP_3
1522
       #if HAS_TEMP_3
1519
         START_ADC(TEMP_3_PIN);
1523
         START_ADC(TEMP_3_PIN);
1527
       #endif
1531
       #endif
1528
       temp_state = Prepare_FILWIDTH;
1532
       temp_state = Prepare_FILWIDTH;
1529
       break;
1533
       break;
1534
+
1530
     case Prepare_FILWIDTH:
1535
     case Prepare_FILWIDTH:
1531
       #if HAS_FILAMENT_SENSOR
1536
       #if HAS_FILAMENT_SENSOR
1532
         START_ADC(FILWIDTH_PIN);
1537
         START_ADC(FILWIDTH_PIN);
1545
       temp_state = PrepareTemp_0;
1550
       temp_state = PrepareTemp_0;
1546
       temp_count++;
1551
       temp_count++;
1547
       break;
1552
       break;
1553
+
1548
     case StartupDelay:
1554
     case StartupDelay:
1549
       temp_state = PrepareTemp_0;
1555
       temp_state = PrepareTemp_0;
1550
       break;
1556
       break;
1554
     //   SERIAL_ERRORLNPGM("Temp measurement error!");
1560
     //   SERIAL_ERRORLNPGM("Temp measurement error!");
1555
     //   break;
1561
     //   break;
1556
   } // switch(temp_state)
1562
   } // switch(temp_state)
1557
-    
1563
+
1558
   if (temp_count >= OVERSAMPLENR) { // 10 * 16 * 1/(16000000/64/256)  = 164ms.
1564
   if (temp_count >= OVERSAMPLENR) { // 10 * 16 * 1/(16000000/64/256)  = 164ms.
1559
     if (!temp_meas_ready) { //Only update the raw values if they have been read. Else we could be updating them during reading.
1565
     if (!temp_meas_ready) { //Only update the raw values if they have been read. Else we could be updating them during reading.
1560
       #ifndef HEATER_0_USES_MAX6675
1566
       #ifndef HEATER_0_USES_MAX6675
1579
     #if HAS_FILAMENT_SENSOR
1585
     #if HAS_FILAMENT_SENSOR
1580
       current_raw_filwidth = raw_filwidth_value >> 10;  // Divide to get to 0-16384 range since we used 1/128 IIR filter approach
1586
       current_raw_filwidth = raw_filwidth_value >> 10;  // Divide to get to 0-16384 range since we used 1/128 IIR filter approach
1581
     #endif
1587
     #endif
1582
-    
1588
+
1583
     temp_meas_ready = true;
1589
     temp_meas_ready = true;
1584
     temp_count = 0;
1590
     temp_count = 0;
1585
-    for (int i = 0; i < EXTRUDERS; i++) raw_temp_value[i] = 0;
1591
+    for (int i = 0; i < TEMP_SENSOR_COUNT; i++) raw_temp_value[i] = 0;
1586
     raw_temp_bed_value = 0;
1592
     raw_temp_bed_value = 0;
1587
 
1593
 
1588
-    #if HEATER_0_RAW_LO_TEMP > HEATER_0_RAW_HI_TEMP
1589
-      #define GE0 <=
1590
-      #define LE0 >=
1594
+    #ifdef HEATER_0_USES_MAX6675
1595
+      float ct = current_temperature[0];
1596
+      if (ct > min(HEATER_0_MAXTEMP, 1023)) max_temp_error(0);
1597
+      if (ct < max(HEATER_0_MINTEMP, 0.01)) min_temp_error(0);
1591
     #else
1598
     #else
1592
-      #define GE0 >=
1593
-      #define LE0 <=
1599
+      #if HEATER_0_RAW_LO_TEMP > HEATER_0_RAW_HI_TEMP
1600
+        #define GE0 <=
1601
+      #else
1602
+        #define GE0 >=
1603
+      #endif
1604
+      if (current_temperature_raw[0] GE0 maxttemp_raw[0]) max_temp_error(0);
1605
+      if (minttemp_raw[0] GE0 current_temperature_raw[0]) min_temp_error(0);
1594
     #endif
1606
     #endif
1595
-    if (current_temperature_raw[0] GE0 maxttemp_raw[0]) max_temp_error(0);
1596
-    if (current_temperature_raw[0] LE0 minttemp_raw[0]) min_temp_error(0);
1597
 
1607
 
1598
     #if EXTRUDERS > 1
1608
     #if EXTRUDERS > 1
1599
       #if HEATER_1_RAW_LO_TEMP > HEATER_1_RAW_HI_TEMP
1609
       #if HEATER_1_RAW_LO_TEMP > HEATER_1_RAW_HI_TEMP
1600
         #define GE1 <=
1610
         #define GE1 <=
1601
-        #define LE1 >=
1602
       #else
1611
       #else
1603
         #define GE1 >=
1612
         #define GE1 >=
1604
-        #define LE1 <=
1605
       #endif
1613
       #endif
1606
       if (current_temperature_raw[1] GE1 maxttemp_raw[1]) max_temp_error(1);
1614
       if (current_temperature_raw[1] GE1 maxttemp_raw[1]) max_temp_error(1);
1607
-      if (current_temperature_raw[1] LE1 minttemp_raw[1]) min_temp_error(1);
1615
+      if (minttemp_raw[1] GE0 current_temperature_raw[1]) min_temp_error(1);
1616
+
1608
       #if EXTRUDERS > 2
1617
       #if EXTRUDERS > 2
1609
         #if HEATER_2_RAW_LO_TEMP > HEATER_2_RAW_HI_TEMP
1618
         #if HEATER_2_RAW_LO_TEMP > HEATER_2_RAW_HI_TEMP
1610
           #define GE2 <=
1619
           #define GE2 <=
1611
-          #define LE2 >=
1612
         #else
1620
         #else
1613
           #define GE2 >=
1621
           #define GE2 >=
1614
-          #define LE2 <=
1615
         #endif
1622
         #endif
1616
         if (current_temperature_raw[2] GE2 maxttemp_raw[2]) max_temp_error(2);
1623
         if (current_temperature_raw[2] GE2 maxttemp_raw[2]) max_temp_error(2);
1617
-        if (current_temperature_raw[2] LE2 minttemp_raw[2]) min_temp_error(2);
1624
+        if (minttemp_raw[2] GE0 current_temperature_raw[2]) min_temp_error(2);
1625
+
1618
         #if EXTRUDERS > 3
1626
         #if EXTRUDERS > 3
1619
           #if HEATER_3_RAW_LO_TEMP > HEATER_3_RAW_HI_TEMP
1627
           #if HEATER_3_RAW_LO_TEMP > HEATER_3_RAW_HI_TEMP
1620
             #define GE3 <=
1628
             #define GE3 <=
1621
-            #define LE3 >=
1622
           #else
1629
           #else
1623
             #define GE3 >=
1630
             #define GE3 >=
1624
-            #define LE3 <=
1625
           #endif
1631
           #endif
1626
           if (current_temperature_raw[3] GE3 maxttemp_raw[3]) max_temp_error(3);
1632
           if (current_temperature_raw[3] GE3 maxttemp_raw[3]) max_temp_error(3);
1627
-          if (current_temperature_raw[3] LE3 minttemp_raw[3]) min_temp_error(3);
1633
+          if (minttemp_raw[3] GE0 current_temperature_raw[3]) min_temp_error(3);
1634
+
1628
         #endif // EXTRUDERS > 3
1635
         #endif // EXTRUDERS > 3
1629
       #endif // EXTRUDERS > 2
1636
       #endif // EXTRUDERS > 2
1630
     #endif // EXTRUDERS > 1
1637
     #endif // EXTRUDERS > 1
1632
     #if defined(BED_MAXTEMP) && (TEMP_SENSOR_BED != 0)
1639
     #if defined(BED_MAXTEMP) && (TEMP_SENSOR_BED != 0)
1633
       #if HEATER_BED_RAW_LO_TEMP > HEATER_BED_RAW_HI_TEMP
1640
       #if HEATER_BED_RAW_LO_TEMP > HEATER_BED_RAW_HI_TEMP
1634
         #define GEBED <=
1641
         #define GEBED <=
1635
-        #define LEBED >=
1636
       #else
1642
       #else
1637
         #define GEBED >=
1643
         #define GEBED >=
1638
-        #define LEBED <=
1639
       #endif
1644
       #endif
1640
       if (current_temperature_bed_raw GEBED bed_maxttemp_raw) {
1645
       if (current_temperature_bed_raw GEBED bed_maxttemp_raw) {
1641
         target_temperature_bed = 0;
1646
         target_temperature_bed = 0;

Loading…
Cancel
Save