Programmable load compensation method and apparatus for use in a food
CROSS-REFERENCES TO RELATED APPLICATIONS 
     This application is a continuation-in-part of U.S. application Ser. No. 07/746,910 filed Aug. 19, 1991 now U.S. Pat. No. 5,317,130 entitled &#34;PROGRAMMABLE LOAD COMPENSATION METHOD AND APPARATUS FOR USE IN A FOOD OVEN&#34; which is related by subject matter to commonly owned applications entitled &#34;PREHEATING METHOD AND APPARATUS FOR USE IN A FOOD OVEN&#34;, Ser. No. 07/746,760 filed Aug. 19, 1991 now U. S. Pat. No. 5,296,683, and to &#34;METHOD AND APPARATUS FOR OPERATING A FOOD OVEN&#34;, Ser. No. 07/748,200 filed Aug. 19, 1991 now U.S. Pat. No. 5,182,439. This application is related by subject matter to application Ser. No. (TBD), Attorney Docket No. 18853-0153, filed even date herewith, entitled &#34;Rotisserie Oven&#34;. 
    
    
     REFERENCE TO MICROFICHE APPENDIX 
     Source code for the process performed by the present invention in a preferred embodiment is contained in the parent application Ser. No. 07/746,910 in 224 frames on 4 microfiche, in the microfiche appendix. 
     BACKGROUND OF THE INVENTION 
     1. Field of the Invention 
     This invention relates generally to the field of food ovens. More specifically, the present invention is directed to a food oven having at least one heating element whereby control means are provided for controlling heating element and includes a load compensation feature to efficiently cook a particular food item. 
     2. Description of the Relevant Art and Problem 
     Today, restaurants find it increasingly more desirable to efficiently cook food in order to provide fast service and to reduce the labor costs involved in the cooking process. Efficiency means that a particular food item is cooked in a short time and with minimal interaction required from an operator while not sacrificing food quality. 
     Many ovens currently in use contain a single heating element and the user must set the temperature and monitor the food item to determine when to remove it from the oven. Some ovens contain a timer which turns the heating element on and off to allow a food item to cook for a predetermined time. 
     U.S. Pat. No. 4,238,669 to Huntley, is directed to and entitled, an oven Having Dual Heating Means. This invention describes an oven having a base plate which is heated. Food items may be placed directly on the heated base plate. A second heating element, preferably a quartz lamp heating element, is placed above the base plate, in the oven&#39;s cavity. This quartz heater has a greater thermal intensity than the base heater. A timer is provided which allows the quartz heater to be turned on after a predetermined time, and remain on for a second predetermined time. This would allow, for example, the top of a pizza to be browned quickly after the pizza had almost fully cooked. Thus, the brief time but intense heat from the quartz heater permits a pizza to be rapidly cooked and the top browned without sacrificing food quality. 
     However, an operator must select a proper time for when the quartz heater should be operated, and also determine how long the quartz heater should be operated. These two time periods differ depending upon the current temperature of the oven and the type of food being cooked. Only an operator skilled with this type of oven having dual heating elements can accurately determine the most efficient time and method for cooking a particular food item. Consequently, there is a need to provide an automatic means for operating such a dual heating element oven which considers both the current temperature of the oven and the type of food being cooked. 
     Restating the problem, unless the food item is constantly monitored by the operator, it may become overcooked because of previous cooking cycles heating the oven which increases the latent heat stored in the air and oven structure. For example, an oven which uses quartz lamp bulbs as well as conducted and convected heat will overcook pizzas if pizzas are rapidly cooked in sequence. 
     SUMMARY OF THE INVENTION 
     These and other problems of the prior art are solved by the present invention. The present invention is capable of automatically preheating an oven having dual heating means. Additionally, the present invention provides a means of programming the oven to vary the on time of the quartz heating element depending upon the type of food item to be cooked. Furthermore, the present invention allows the oven to automatically adjust these quartz lamp on times depending upon the current temperature of the oven. 
     More specifically, the present invention preferably allows up to three cooking intervals to be programmed: brown, cooked and finish intervals. One cooking cycle may consist of each of these three intervals, each interval being set for a period of 0 to 15 minutes. However, while staying within the scope of the present invention, each interval could just as easily be longer than 15 minutes in length. The quartz lamps within the oven may be programmed to be switched either on or off during each interval. For example, the quartz lamp could be on briefly during the brown interval, off during the lengthier cook interval and on again briefly during the finish interval. 
     To ensure uniform consistency of a cooked food item, the present invention provides a method for programmable load compensation. This method consists of automatically compensating for variations in the temperature of the food product placed in the oven, as well as the amount of stored heat accumulated within the oven from previous use. That is, the effect of the food product temperature on the air temperature is measured by directly measuring the air temperature. Compensation is performed by varying the amount of time during which the quartz lamps are turned on during a specific interval as a function of preferably three factors: the actual air temperature within the oven cavity, the base temperature set point, and a programmable load compensation factor. First, regarding air temperature, when the air temperature increases, the actual on-time of the quartz lamp decreases. Thus, above a certain air temperature, no additional compensation takes place. Conversely, below a certain air temperature no load compensation takes place. 
     Second, the base temperature set point is a temperature value preferably predetermined and stored into non-volatile memory of the present invention. Like setting a thermostat, this value tells the oven at which temperature it should maintain itself. The set point may be set depending upon the particular food item to be cooked. 
     Third, load compensation factors are programmed into non-volatile memory of the present invention. These factors are used in conjunction with a difference between the actual temperature and the set point temperature to control the length of cooking time for different food items. 
     Additionally, the present invention allows for a method of automatically preheating the oven based upon its immediate usage history. This preheat function operates by regulating the base heating elements until they are within a specified temperature range from the program base set point temperature, and then turns the quartz lamps on until the air temperature within the oven cavity reaches a certain fixed preheat &#34;exit&#34; temperature. This preheat exit temperature need not be a fixed value, but can be a function of the base set point temperature or the air temperature before or during the preheat operation. In addition, the preheat function can be performed at various times during the oven&#39;s operation, and not necessarily upon power up of the oven. 
     The above descriptions of the present invention provide only a broad overview of preferred embodiments within the present invention. The details of certain aspects of the present invention will be more fully understood from the following specification and drawings. 
    
    
     BRIEF DESCRIPTION OF THE DRAWINGS 
     FIG. 1 shows a block diagram of the control hardware for the oven in the present invention. 
     FIGS. 2a and 2b show flow charts detailing the operation of the present invention. 
     FIG. 3 shows a flowchart for the overall functioning of the present invention. 
     FIG. 4 shows a flowchart of the timer interrupt handler steps performed by the present invention. 
     FIG. 5 is a flowchart for the &#34;Dostate 100HzTMrs&#34; subroutine. 
     FIG. 6 is a flowchart for the &#34;GetLCadj100s&#34; subroutine. 
     FIG. 7 is a schematic illustration of a control panel which may be used with one or more embodiments of the present invention. 
     FIG. 8 is a flow chart of the PROGRAM mode. 
     FIG. 8A-8E are subroutines performed during PROGRAM mode. 
     FIG. 9 is a flow chart of the AIR HEAT control. 
     FIG. 10 is a flow chart of the RADIANT HEAT control. 
     FIG. 11 is a flow chart of the BLOWER. 
     FIG. 12 is a flow chart of the COOK mode control. 
    
    
     DETAILED DESCRIPTION 
     The present invention preferably embodies a hardware controller which performs various functions on the oven. The hardware for the controller will first be described, with the functions and steps performed by the hardware described thereafter. 
     Hardware Description 
     Referring to FIG. 1, two heating elements 10 and 20 are disposed within an oven having a base and a cavity (not shown). Base heating element 20 is located preferably underneath a base plate, preferably the HTX TRANSITE II™ base by BNZ MATERIALS, INC. However, other base materials such as metal, compressed asbestos, ceramics or other materials on which food may directly be placed and which are able to withstand great temperatures may be used. Base heating element 20 could be a gas heater or other heating means, but preferably is a 3200 watt CALROD electric heating element. 
     Located within the oven&#39;s cavity and above the base plate, preferably near the roof of the cavity, is located the second heating means 10, preferably quartz heat bulbs. The quartz heat bulbs must be able to provide a higher thermal intensity for a substantially brief heating period as opposed to the base heating element 20. Base heating element 20 preferably provides conducting heat whereas the quartz heat bulbs 10 preferably provide radiant heat. Both heating means also have appropriate relays or other circuitry to properly switch or toggle them from a first state (on) or a second state (off). 
     Two temperature probes are provided within the oven to detect temperature within the cavity and base of the oven. Base temperature probe 25 is thus located within or proximate to the base while air temperature probe 15 is located within an air duct immediately outside the oven cavity. Base temperature probe 25 should be placed so as to receive approximately the mean temperature of the base. Similarly, air temperature probe 15 should be placed within the oven cavity, so that it may detect the mean temperature of the air within the oven cavity. Consequently, probes 15 and 25 should not be placed too far, nor too close to heating elements 10 and 20. 
     Microcomputer 30, which preferably is a Motorola MC68705R3L, provides the computing resources for the hardware, and specifically for the control board. This microcomputer includes a microprocessor and also includes a 4-channel, 8-bit A/D converter which is used to convert the temperature voltage signals from temperature probes 15 and 25 to digital values for computing and control. Microcomputer 30&#39;s internal non-volatile memory (ROM or PROM, or preferably EPROM) stores the program code described in detail below. Microcomputer 30 also contains internal random access (RAM) which is used for calculation purposes. 
     Power supply 35, located mainly on the control board in a preferred embodiment, also includes an off-board transformer which converts an AC power input into a proper power supply for the control board and microcomputer 30. Capacitors are provided in power supply 35 to provide EMI/RFI filtering. Additionally, fuses and metal oxide varistors (MOV) are included to provide surge protection. Power supply 35 also preferably includes a diode bridge to fully rectify an AC input voltage into a DC voltage. Additionally, an integrated circuit voltage regulator, as is commonly available in the market, is provided. All of the above elements and construction for power supply 35 are well known in the art. 
     Reset circuit 50 coupled to microcomputer 30 preferably comprises a capacitor. Crystal oscillator circuit 45 forms the system clock oscillator comprised of preferably a capacitor and a crystal oscillator oscillating at 4 megahertz. This results in an internal clock rate of *1 megahertz. Voltage reference circuit 40 establishes the reference voltages for the internal A/D converter. 
     EEPROM 55 is a non-volatile memory, preferably located on an integrated circuit capable of serial communications, for example, TS93C46. EEPROM 55 stores the product parameters: times, temperatures, quartz heating settings, and load compensation factors, all of which will be described in more detail below. Appropriate protection circuitry is preferably also connected with EEPROM 55 to insure that the contents of the non-volatile memory are not inadvertently changed during control power-up and power-down. 
     Microcomputer 30 also contains appropriate inputs 63 for user input located on the exterior of the oven and outputs for display devices described below. Protection circuitry to insure that noise does not generate false interrupts or corrupt control signal operation is included as well known to those in the art. 
     Conditioning circuit 60 provides preferably pull-down resistors which insure that switch input voltages from user input switches 63 do not float when no switch is pressed. Thus, circuit 60 results in preferably an output voltage of approximately 5 volts when a switch is pressed and approximately 0 volts when no switch is pressed. 
     LED status indicator 77 is provided to indicate the following states: ready, temperature, brown time, cook time, finish time, quartz lamp on, quartz lamp off. These states will be describe in more detail below. Signals from microcomputer 30 are coupled to status indicators 77, preferably, LEDS, but could be other indication means. 
     Display driver circuit 70 is preferably an integrated circuit such as MC14489. The display driver circuit 70 preferably is a multiplexing driver circuit to drive time/temperature display 75 and product number/letter display 73. Displays 73 and 75 are preferably seven segment LED displays, but could be other indicating means as are well known in the art. Displays 73 and 75 and indicator 77 are preferably physically located on the control panel on the front panel of the oven. Seven segment display 75 can display both time, numbers and limited alphanumeric messages of up to four characters. Display 73 is used to display the current selected product number from 1 to 9 or a letter from A through F. 
     Buzzer 67 is preferably a piezoelectric buzzer having a main feedback and ground connection. The buzzer is used to provide audible feedback to the operator of various control operation conditions. Output driver circuit 65 preferably is a modified Hartly oscillator which drives buzzer 67 circuit near its resonant frequency for maximum efficiency in terms of sound pressure level. Output driver circuit 65 preferably includes a switch or means to select a desired setting for the buzzer sound pressure level. Associated driver circuitry is also included in driver circuit 65 as is well known in the art. 
     Temperature sensor conditioning circuits 80 and 83 are preferably identical signal conditioning circuits connected to base temperature probe 25 and air temperature probe 15, respectively. Conditioning circuits 80 and 83 also preferably include circuitry to determine probe failure in either &#34;open&#34; or &#34;shorted&#34; failure modes and forward signals to microcomputer 30. Thus, two inputs, a temperature and error inputs, are provided from each conditioning circuit 80 and 83 into the A/D inputs of microcomputer 30. Associated capacitors are provided in conditioning circuits 80 and 83 to provide for EMI and other noise filtering functions, as are well known in the art. 
     Output driver circuits 85 and 87 are preferably two identical output circuits for driving base heating element 20 and quartz heat bulbs 10, respectively. Driver circuits 85 and 87 preferably include optoisolated triac driver integrated circuits such as MOC3041. Appropriate protection circuity is provided to prevent false turn-on as is well known in the art. Control signals are provided from microcomputer 30 into driver circuits 85 and 87 to turn on heating elements 20 and 10 at appropriate times, as will be discussed more fully below. 
     The present invention preferably also includes circuitry to provide for additional heating means in the oven should they be desired to provide even greater flexibility and control as the presently described embodiment. A fan fail circuit may also be provided to detect failure of the of off-board cooling fan and thus warn an operator or shut down the system to prevent further damage. 
     Overall Process Performed 
     The overall operation of the process of the present invention in a preferred embodiment is depicted in the flow diagram of FIG. 3, and will now be described in some detail below. The process is executed by microcomputer 30 (shown in FIG. 1) and resides in the internal non-volatile memory of microcomputer 30 (not specifically shown in FIG. 1). 
     Referring to FIG. 3, the three aspects of the present invention are shown interacting with one another. Specifically. step 301, the ready state/preheat function is performed when the oven&#39;s operation is initially started, and is repeated as needed thereafter. This step generally consists, in part, of heating the base of the oven to a predetermined temperature by means of activating the base heating element (element 20 in FIG. 1) and thereafter heating the air in the oven&#39;s internal cavity to a predetermined temperature by means of the quartz heat bulbs (element 10 in FIG. 1). The automatic preheat steps are described in more detail in copending application entitled &#34;PREHEATING METHOD AND APPARATUS FOR USE IN A FOOD OVEN&#34; by the same inventors and incorporated herein by reference. 
     When a user of the present invention wishes to set the various parameters corresponding to the operation of the oven, he/she may press a &#34;SET&#34; switch (such as the &#34;SET&#34; switch of element 63 of FIG. 1). In a preferred embodiment, the present invention will thereafter prompt the user to enter the various parameters, examples of which are illustrated in steps 303-311. For example, in a preferred embodiment, the user may utilize the increment/decrement switches of element 63 (INC and DEC) to modify the parameters in steps 303-311. In another embodiment, the user may directly enter the desired parameters on a device such as a numeric keypad, etc. 
     Step 303 comprises setting the base setpoint temperature for the oven. This value represents the desired temperature of the base plate of the oven. This value is used during the preheat function (step 301) as well as the actual oven usage intervals as described below with respect to steps 313-317. 
     Steps 305-309 comprise setting the time for the &#34;brown&#34;, &#34;cook&#34; and &#34;finish&#34; intervals as well as switching the quartz lamps to either be on or off during each interval according to one embodiment of the present invention. The selected values are stored in memory. In a preferred embodiment, the operator may select a time duration between 0-15 minutes for each cooking interval, where the total cooking time is the sum of the selected cooking interval times. The time of each interval may be displayed on display 75. After the time for a particular interval is selected, the operator sets heating element 10 to be on or off during that interval. A toggle switch may be provided to set heating element 10. The operator then selects the time for the next interval. However, the order in which the values are selected is not critical. For example, each of the interval times may be selected first, and then the heating element 10 may be set for the individual intervals. In addition, the structure used to select the interval times and to selectably set heating element 10 is not critical. One of skill in the art may recognize a variety of structures to accomplish these functions, including a numeric keyboard with an on/off button, individual buttons, dials, etc. In a preferred embodiment. LED status indicators prompt the operator to select a particular parameter. 
     The selected times and settings are stored within the control system of the present invention, and are thereafter utilized in steps 313-317 to determine the appropriate timing characteristics of the various cooking intervals and the operation of heating element 10. In a preferred embodiment, the first heating element 10 is set on during the &#34;brown&#34; interval, off during the &#34;cook&#34; interval, and on during the &#34;finish&#34; interval. These intervals and cooking steps are described in greater detail in copending application entitled &#34;METHOD AND APPARATUS FOR OPERATING A FOOD OVEN&#34; by the same inventors, incorporated herein by reference. 
     Steps 311 involves setting a load compensation factor. The load compensation factor is utilized by the load compensation aspect of the present invention to account for the type of load being cooked within the oven and the particular temperature within the oven. The load compensation factor is used by steps 313-315 in a preferred embodiment to compensate the timing characteristics of the various operating intervals, and it will be described in further detail below with respect to FIGS. 2a and 2b . After the load compensation factor has been set, execution transfers back to the ready state/preheat function until the user requests another operation. 
     Steps 313-317 involve executing the &#34;brown&#34;, &#34;cook&#34; and &#34;finish&#34; intervals according to a preferred embodiment of the present invention. These steps are executed after the associated characteristics have been set in steps 303-311, and when the user selects, in a preferred embodiment, the &#34;start&#34; function by pressing the &#34;Start/Stop&#34; key (&#34;START/STOP&#34; switch of element 63 of FIG. 1). Steps 313-317 utilize the corresponding temperature, times, load compensation factor, and heating element 10 switch settings selected in steps 303-311. Specifically, the temperature set in step 303 is maintained throughout these steps, the times for the various intervals are kept in conjunction with the load compensation factor, and the quartz lamp operational status is maintained for each of the three intervals in a preferred embodiment. If the time of a particular interval is set to 0, that interval is skipped. Throughout the cooking cycle, status indicators 77 indicate the interval which is being executed. 
     Finally, step 319 corresponds to the end-of-cycle operation performed after the &#34;brown&#34;, &#34;cook&#34; and &#34;finish&#34; intervals are completed. After this step has been reached, execution is transferred back to the ready state/preheat function of step 301. A more detailed description of a preferred embodiment of the present invention follows. 
     Load Compensation Operation 
     As described above, a purpose of the present invention is to ensure a uniformly processed product, regardless of product and environment variations. For example, the temperature of the food product entering the oven may vary depending on whether it is frozen or fresh, and how long it has been unrefrigerated before cooking. The stored heat of the oven will vary depending on the usage of the oven prior to cooking the product. For examples, in the case of a pizza oven, the stored heat of the oven will be greater after several pizzas have been cooked, than it is during cooking the first pizza of the day. A system is needed which compensates for variations in the temperature of the product (load) and the environment--a load compensation. 
     Some experimental results indicate that one of the best ways to perform load compensation in an oven having two heating elements is to vary the on-time of the quartz lamp. The on-time of quartz lamp 10 preferably changes as the function of the actual air temperature in the oven and the base temperature set point measured by air temperature probe 15 and base temperature probe 25 respectively, as well as the load compensation factor. Thus, as the air temperature increases, the quartz on-time is shortened. In a preferred embodiment, the quartz on-time is never lengthened, although such an implementation is certainly possible. 
     Various degrees of load compensation may be programmed into EEPROM 55. Preferably, the load compensation may be set from 0 to 10. Zero is equivalent to no load compensation with 10 equivalent of (100%) load compensation. Load compensation may be programmed by the user from input switches 63 and stored in EEPROM 55. Additionally, the exterior front panel of the oven would preferably include a method of inserting a menu indicating which food item, and corresponding previously programmed load compensation, may be selected by a user. 
     Basically, implementation of the load compensation performs the following steps to determine the on-time of quartz lamp 10. 
     (1) Read the load compensation factor from a non-volatile memory. 
     (2) Set a variable &#34;LcLim&#34; to the difference between the base temperature set point (in A/D bits) and a constant. 
     (3) If &#34;LcLim&#34; is less than zero, then set LcLim to zero: otherwise, set LcLim to the base temperature set point multiplied by a constant minus another constant. 
     (4) During each pass through the main loop: 
     (i) Set &#34;TempErr&#34; to the difference between the oven cavity air temperature and LcLim. 
     (ii) Set a variable &#34;N1&#34; to TempErr multiplied by a load compensation value contained in a table indexed by the load compensation factor previously read from the non-volatile memory. 
     (iii) Determine if variable N1 is less than a constant and if so assign it a value. 
     (iv) Determine if TempErr is less than a constant. If so, assign LcReset a constant value. If not, assign LcReset the value of a constant minus N1 times a constant. 
     (v) When a cooking interval begins, if the quartz lamps have been programmed to be turned on during the interval, then: 
     (i) Set &#34;QClock&#34; to the total number of seconds programmed for the cooking interval. 
     (ii) Set &#34;LcCount&#34; to the value of LcReset, and set &#34;LcSec&#34; to a constant, preferably 10. 
     (iii) During each timer interrupt, decrement LcCount, and when LcCount reaches zero, decrement LcSec. 
     (iv) Decrement QClock&#34; when LcSet reaches zero. 
     (v) Turn quartz lamps off when QClock reaches zero. 
     Referring to FIGS. 2a and 2b, the basic operation described above for the load compensation factor is depicted. Each time an interval starts during the cooking process (i.e. brown, cook or finish), the control program checks to see if the quartz lamps have been programmed on for that interval. If the quartz lamps had been programmed on, then a variable QClock is calculated as: 
     
         QClock=60 (minutes)+seconds 
    
     QClock obviously is then the total time in seconds. QClock is a clock that is run in parallel with the cooking time display 75 which is displayed on the front surface of the oven. QClock does not keeps &#34;real&#34; time but rather a compensated time depending upon the current air temperature of the oven and the load compensation factor. Thus, the higher the air temperature the more quickly QClock will decrement. Referring to FIG. 2a, QClock is set to a predetermined value for the particular cooking interval when the quartz lamps have been programmed on in block 200. 
     A load compensation factor depending on a particular food item is read from EEPROM 55 and stored in the RAM memory of microcomputer 30 as variable LcComp in block 205. The SetPnt temperature is stored as A/D bits and not in degrees. A particular predetermined temperature set point &#34;SetPnt&#34; is read from non-volatile memory in block 210. SetPnt represents a base temperature which is desired for a particular product to be cooked. Thus, a sandwich at room temperature would presumably have a lower predetermined SetPnt temperature while a frozen pizza would have a higher SetPnt value. 
     In block 215, the value LeLim is calculate by the formula: 
     
         LcLim=SetPnt-116 
    
     If LcLim is less than 0 (block 220), then LcLim is set to 0 (block 225). Otherwise, if LcLim is greater than 0, then LcLim is calculated in block 230 as: 
     
         LcLim=1.7608(SetPnt)-202.26 
    
     Next, a temperature error value TempErr is calculate in block 235 by the formula: 
     
         TempErr=AirTemp-LeLim 
    
     where AirTemp is the current actual air temperature in the oven cavity as detected by air temperature probe 15. Temperature from air probe 15 is read in and filtered through conditioning circuit 83 and into A/D channel of microcomputer 30. Additionally, block 230 determines whether an error exists in air temperature probe 15. TempErr is an error value representing the difference between the current actual air temperature and the desired air temperature for the current base temperature SetPnt. 
     Using a lookup table stored in non-volatile memory, a value LcTable is selected in block 240 from the previously read load compensation factor LcComp. The following table shows the entry for valid values of LcComp: 
     
         ______________________________________                                    
LcComp       LcTable Entry                                                
______________________________________                                    
0            0.000                                                        
1            0.102                                                        
2            0.200                                                        
3            0.298                                                        
4            0.400                                                        
5            0.502                                                        
6            0.600                                                        
7            0.702                                                        
8            0.800                                                        
9            0.902                                                        
10           1.000                                                        
______________________________________                                    
 
    
     Note that these table entries step from 0 to 100% in steps of approximately 10%. 
     In block 242, a variable N1 is set by the formula: 
     
         N1=(LcTable) (TempErr) 
    
     If N1 is less than 63 (block 244) then N1 is set to 63 in block 246. This is necessary to establish the maximum amount of load compensation that can occur. Note that the constant 63 could be another number but is preferably set to this value. Referring now to FIG. 2b, if TempErr is less than 0 (block 248), then LcReset is set to 200 (block 250). Otherwise, LcReset is calculated by the following formula in block 252: 
     
         LcReset=200-2(N1) 
    
     Timer interrupts occur 2,000 times a second and are described in FIG. 4. Referring briefly to FIG. 4, block 501 indicates the beginning of the timer interrupt handler subroutine. In block 503, the timer data register is reset. In block 505, load compensation 0.1 second clock is updated. In block 507, the 0.1 second clock is updated. In block 509, the 1 second clock is updated. And in block 511, the subroutine interrupt instruction is returned. 
     FIG. 2b shows that in block 254, LcSec is set to 10. In block 255, LcCount is set to equal LcReset. 
     In block 260 of FIG. 2b, the clock LcCount is decremented. In block 265, if LcCount is equal to 0, then the clock LcSec is decremented in block 270. Otherwise, LcCount is again decremented in block 260. If clock LeSec is equal to 0 (block 275), then QClock is decremented in block 280. Otherwise, the process returns to block 235 and again goes through the above described steps. 
     If QClock equals 0 in block 285, then quartz lamps 10 are turned off in block 290. Otherwise, the process again returns to block 235. 
     From the above we see that the counter LcReset determines the length of a compensated second. 
     To summarize, the clocks involved in load compensation are: 
     LcCount: is initialized to LcReset. LcCount is decremented at each timer interrupt, and times are approximately 0.1 seconds. Actual time is 0.1 &#34;compensated&#34; second. 
     LcSec: is initialized to 10. LcSec is decremented (in UpdQClock routine) each time LcCount reaches 0, and its time approximately equals 1 second. Actual time is 1 &#34;compensated&#34; second. 
     QClock: is initialized to the total seconds in a predetermined and programmed interval (brown, cook or finish). QClock is decremented (in UpdQClock routine), each time LcSec equals 0. Its actual time is the total &#34;compensated&#34; interval time. 
     While the present invention has been disclosed with respect to a preferred embodiment and modifications thereto, further modifications will be apparent to those of ordinary skill in the art within the scope of the claims that follow. For example, although the formulas used to determine load compensation are linear as a function of air temperature and the SetPnt, this is not mandatory. A polynomial or logarithmic function would provide a better approximation to the effects of cooking time and temperature, but would complicate the process. 
     The compensation time could be made a function of the actual base temperature as well as the base SetPnt and other factors, including the air temperature as described above. The compensation could be designed to extend the quartz lamp on-time as well as the above described decrease in quartz on-time. Additionally, the quartz on-time compensation could be designed to work in conjunction with total cooking time compensation rather than on an interval basis. 
     The load compensation factor need not be the same for all intervals, and more intervals than three could be added. Greater details on operation of the steps in the above implementation are described in great detail in the source code attached at Appendix A. These details shown in this Appendix are primarily concerned with underflow, overflow, fractional representations of binary numbers and handling of signs of binary numbers. Refer specifically to the routines &#34;READPROD, AIRSTAT and UPDQCLOCK in this Appendix. All these techniques are obvious and well known to one skilled in the art and may include other techniques known to those skilled in the art. Consequently, it is not intended that the invention be limited by the disclosure, but instead that its scope be determined entirely by reference to the claims which follow. 
     In an alternative embodiment, a load compensation technique is disclosed for use specifically with a rotisserie type cooking oven. An example of a rotisserie cooking device and a control therefor is disclosed in U.S. Pat. Nos. 4,968,515 and 5,044,262 issued to Burkett et al. and assigned to the assignee of the present invention. These patents are hereby incorporated herein by reference. 
     According to one aspect of this embodiment, the actual cooking time of a rotisserie is adjusted based on a load compensation factor and a difference between an actual air temperature and set point temperature. According to this technique, each displayed second of the cooking time is lengthened or shortened based on the difference in temperature between the actual sensed temperature and the set point temperature. 
     According to this embodiment, at the start of each new displayed cook timer &#34;second&#34;, the timer interrupt code accesses a look-up table to obtain a multiplier associated with the current load compensation setting. It then multiplies the temperature difference (Actual air temperature--Setpoint temperature, preferably in degrees F.) by this multiplier to arrive at a time adjustment value. 
     If the actual air temperature is ABOVE the current setpoint temperature, the adjustment value is SUBTRACTED from a nominal value of &#34;100&#34; (i.e., 100/100ths of a second) and reloaded into the 100 Hz countdown component of the cook timer. This results in a &#34;cook timer second&#34; which is &lt;100/100ths of a real second, and therefore results in a cook timer that counts down FASTER than real time. 
     If the actual air temperature is BELOW the current setpoint temperature, the adjustment value is ADDED to a nominal value of &#34;100&#34; and reloaded into the 100 Hz countdown component of the cook timer. This results in a &#34;cook timer second&#34; which is &gt;100/100ths of a real second, and therefore results in a cook timer that counts down MORE SLOWLY than real time. 
     EXAMPLE 
     If the load compensation setting for the current product is &#34;5&#34;, the setpoint temperature is 350 F., and the air temperature in the rotisserie is currently 320 F., then the temperature difference (350-320) is 30 Deg F. BELOW setpoint temperature 
     Since the load compensation setting is 5, then from the look-up table, the multiplier associated with this setting is found, which in one embodiment is 0.5. 
     From this information, the load compensation adjustment can be obtained as follows: 
     
         LCAdjust=30 * 0.5=15 
    
     Since the temperature is BELOW setpoint, the adjustment (15) is ADDED to 100 to EXTEND the length of a &#34;second&#34; of cook time. Therefore, the 100&#39;ths byte of the cook timer (CookTmr. 100s) is loaded with 115/100ths 100+LCAdjust seconds. 
     Therefore, the next &#34;second&#34; (i.e. displayed second) of cook time is 15/100ths seconds longer than a &#34;real&#34; second. 
     According to one embodiment, the temperature difference may be limited to a maximum, (e.g., +/-255 degrees F.) so that the &#34;TmpDif&#34; (temperature difference) can be handled as an 8-bit integer. When it is MORE than 255 degrees F. above or below setpoint, the Load Compensation adjustment will be the same as if it were exactly 255 degrees F. above or below setpoint, though it would rarely be this far from setpoint while cooking. 
     Also, the final 100&#39;s reload value may be limited to the range &#34;LC100Min.&#34; to &#34;LC100Max.&#34;, as a means of restricting the timing to reasonable rates. For example, these constants can be set to limit the minimum 100&#39;s reload value to 50/100ths seconds, and the maximum reload value to 200/100s. This effectively limits the load compensation to at most halving or doubling the cooking time. 
     Preferably, the actual cook timer components--Hours, Minutes, seconds, and 100ths of seconds--actually count down to -1 rather than to 0, so they are reloaded with values 1 less than the item they count. For example, 100ths of seconds is normally reloaded with &#34;99&#34; to count one full second (99..-1=100/100ths of a second), and reloading minutes with 59 will result in a 60 minute countdown (59.-1). This adjustment to the 100ths component of the cook timer is made by simply decrementing the calculated reload value just before saving it into the 100ths byte of the cook timer. Preferably, all of the load compensation calculations are made based on a nominal value of &#34;100&#34;. 
     According to one embodiment, the look-up table, referred to as the &#34;LCPercentTbl,&#34; is represented as 8-bit fractional values, and is indexed by the load compensation setting (0..10). In a preferred embodiment, the table contains the following values. 
     
         ______________________________________                                    
8 bit fractional value (/256)                                             
                 Load Compensation Setting                                
______________________________________                                    
0                0 = 0%                                                   
26               1 = 10% (10% * 256 = 25.6)                               
51               2 = 20% (20% * 256 = 51.2)                               
77               3 = 30% (30% * 256 = 76.8)                               
102              4 = 40% (40% * 256 = 102.4)                              
128              5 = 50% (50% * 256 = 128.0)                              
154              6 = 60% (60% * 256 = 153.6)                              
179              7 = 70% (70% * 256 = 179.2)                              
205              8 = 80% (80% * 256 = 204.8)                              
230              9 = 90% (90% * 256 = 230.4)                              
255              10 = 100% (255/256 - 99.6%)                              
______________________________________                                    
 
    
     The values in this table may be changed based on actual cook testing and analysis. Also, the progression of values need not be linear. 
     The following code excerpts illustrate a preferred way of carrying out this embodiment. 
     
         __________________________________________________________________________
;-------------------------------------------------------------------------
------------------------------------------------------                    
;G e t L C A d j 1 0 0 s (Get Load Compensation Adjusted 100&#39;s)           
Subroutine                                                                
;This routine returns the 100&#39;s reload value for the state variables      
pointed to by [X].                                                        
This ;value may be more or less than 100/100ths of a second, depending on 
the degree                                                                
of ;load compensation selected and the current difference between actual  
air                                                                       
temperature ;and the product&#39;s setpoint temperature.                      
;Input:                                                                   
- points to state variables                                               
;      .sub.-- LoadComp -- load compensation setting                      
;      .sub.-- SetptTmpF$ -- product temperature setpoint                 
       (Sear/Cook/Hold)                                                   
;      AirTmpF$ -- current air temperature                                
;                                                                         
;Output:                                                                  
- 100&#39;s seconds for the next &#34;cook second&#34; (LC100Min.,LC100Max)           
;      Since timer counts down to -1, &#34;99&#34; is exactly one second, and     
;      224 is two and 1/4 seconds, etc.                                   
;Routines Called: None                                                    
- adjusted 100&#39;s (99 = 1 full second)                                     
- unchanged (points to state variables)                                   
;                  [B],CCR -- indeterminate                               
;                                                                         
;-------------------------------------------------------------------------
------------------------------------------------------                    
GetLCAdj100s:                                                             
;On entry here, [X] points to the state variables record and a copy of    
the state vars                                                            
;PSHX                                                                     
;++ [save a copy of the state vars pointer]                               
;First, calculate how far below setpoint we are.                          
;                                                                         
;If Setpt &gt; Actual, (Setpt-Actual &gt; 0), we are lower than we want to be   
; and therefore must stretch out time by adding a little to each second.  
;                                                                         
;If Setpt &lt; Actual, (i.e. Setpt-Actual &lt; 0), we are higher than we want   
to be                                                                     
; and therefore must speed up time by reducing each second a little bit.  
This may be                                                               
; implemented as follows.                                                 
       LDD  .sub.-- SetptTmpF$,X                                          
                     ;Calculate the difference between setpoint           
                     ;temperature and actual temperature (+==&gt;            
                     ;add time, -==&gt; subtract time)                       
       SUBD;                                                              
            AirTmpF$                                                      
       PSHA          ;+(Save top byte of difference -- pos or neg)        
       BPL  GotAbsDif                                                     
                     ;If positive difference, we&#39;re ready . . .           
       COMA          ;Else convert negative number to positive            
       COMB          ;(two&#39;s complement = bit comp, then add 1)           
       ADDD #0001    ;)two&#39;s complement =  bit comp, then add 1)          
;Now have 16-bit absolute value of Setpt-AirTmp in [D]. Clip this to a    
;maximum working value of 255 so we can work with single byte values.     
GotAbsDif:                                                                
       TSTA          ;If top byte is = 0 . . .                            
       BEQ  LE255    ;then [B] is already less than or equal to 255       
       LDAB #255     ;else clip difference in [B] to 255                  
LE255:                                                                    
;At this point, we have 8-bit absolute value of tmp. diff. in [B]         
(0..255).                                                                 
;                                                                         
;Multiply &#34;temperature difference&#34; by the percent appropriate for the     
;current LoadComp setting for this product.                               
       TBA           ;First, transfer dif to [A] so we can use [B]        
       LDAB .sub.--LoadComp,X                                             
                     ;Get the load compensation setting                   
       LDX  #LCPercentsTbl                                                
                     ;Get base address of the Load Comp/Pcnts             
                     ;table                                               
       ABX           ;[X] points to &#34;fractional&#34; byte                     
       LDAB O,X      ;Get the fraction (i.e. 50% = 128, etc.)             
                     ;Difference byte is still in [A]                     
       MUL           ;Multiply by fraction -- 16 bit answer               
       ADCA #0       ; is 8-bit integer and 8-bit fraction                
                     ;(&#34;ADCA #O&#34; rounds integer byte up, if nec.)         
       TAB           ;Transfer result (0..255) into [B]                   
       PULA          ;-[Get original sign -- positive or negative]        
       TSTA          ;Do we need to INCREASE or DECREASE                  
                     ;time?                                               
       BPL  LongerTime                                                    
                     ;(LCPcnt * TmpDif) is still in [B]                   
;Need to reduce cook time seconds                                         
ShorterTime:                                                              
       LDAA #100     ;Start with a &#34;full&#34; second (i.e. 100/100&#39;s)         
       SBA           ;SUBTRACT the calc&#39;d adj value ([B]) from            
                     ;100                                                 
       BCS  ClipToMin                                                     
                     ;If [B] was &gt; [A], clip to min                       
       CMPA #LC100Min.                                                    
                     ;Else are we below minimum value?                    
       BHS  LCAdj100sDone                                                 
                     ;If &gt; = min, we&#39;re all set                           
ClipToMin:                                                                
       LDAA #LC100Min                                                     
                     ;Else clip to minimum value...                       
       BRA  LCAdj100sDone                                                 
;Need to extend cook time seconds                                         
LongerTime:                                                               
       LDAA #100     ;Start with a &#34;full&#34; second (i.e. 100/100&#39;s)         
       ABA           ;Add the calc&#39;d adj value ([B]) to 100               
       BCS  ClipToMax                                                     
                     ;If [B] + [A] &gt; 255, clip to max value               
       CMPA #LC100Max.                                                    
                     ;Else compare result to max:                         
       BLS  LCAdj100sDone                                                 
                     ;If &lt; = max, we&#39;re all set                           
ClipToMax:                                                                
       LDAA #LC100Max.                                                    
                     ;Else clip to maximum allowed value                  
;opt   BRA  LCAdj100sDone                                                 
LCAdj100sDone:       ;Need to return adjusted 100&#39;s value in [A] . . .    
                     ;Subtract 1 -- we count from 99 down to -1 to        
       DECA          ;get one full second, etc                            
       PULX          ;--(Restore the original state vars ptr)             
       RTS           ;(On exit, [X] still points to state vars rec)       
;-------------------------------------------------------------------------
------------------------------------------------------                    
;D o S t a t e 1 0 0 H z T m r s (Do State 100Hz Timers) Subroutine       
;                                                                         
;This routine takes care of the 100 Hz timers and clocks that are         
directly associated with                                                  
;the state variables record.                                              
;                                                                         
;Cooking and Holding timers receive special attention: A Load             
Compensation                                                              
;calculation is used to decide how long a &#34;second&#34; of cook time should    
be, based on                                                              
;whether we are over or under the current product setpoint and what level 
of load                                                                   
;compensation is used.                                                    
;                                                                         
;One second of cook time when no Load Compensation is in effect or when   
we are                                                                    
;currently right on the setpoint temperature, is exactly 100 1/100&#39;s      
(0..99). When Load                                                        
;Compensation is in effect, however, we might tally another second of     
cook time either                                                          
;sooner or later than the normal 100 1/100&#39;s. For example, if we are      
above setpoint, we                                                        
;may tally the next second of cook time after only 95/100&#39;s actual time   
(because the                                                              
;product is cooking a little faster than it would at the setpt            
temperature). If below                                                    
;setpoint, one second may be 110/100&#39;s, for example.                      
;                                                                         
;                                                                         
;Input:                                                                   
       .sub.-- CookTmr                                                    
;                                                                         
;Output:                                                                  
       .sub.-- CookTmr                                                    
;                                                                         
;Routines Called:                                                         
;Exit State: [A], [B], [X], CCR - indeterminate                           
;                                                                         
;-------------------------------------------------------------------------
------------------------------------------------------                    
DoState100HzTmrs:                                                         
;On entry here, [X] points to the state variables record.                 
AlmEoc:                                                                   
       LDD  .sub.-- AlmEoc100s$,X                                         
                        ;Get the Alm/Eoc duration timer                   
       SUBD #0001       ;Subtract 1/100 second                            
       BMI  AlmEocDone  ;If not decremented to -1 . . .                   
       STD  .sub.-- AlmEoc100s$,X                                         
                        ; . . . then save the new value                   
AlmEocDone:                                                               
;Decrement the Cook timer 100&#39;s of a second.                              
;                                                                         
;If 100&#39;s hit negative, just finished another &#34;second&#34;. Need to reload    
100&#39;s while                                                               
;decrementing SS&#39;s (rippling to MM&#39;s, if necessary).                      
;                                                                         
;If Load Compensation is in effect, we may load 100&#39;s with more or less   
than 100/100&#39;s,                                                           
;to compensate for temperature being more or less than setpoint. (Note    
that reloading                                                            
;with &#34;99&#34; = 1 full second, since we count from 99 downto -1 . . . If no  
load comp is in                                                           
;effect, simply reload with unadjusted 99.                                
DecCook:                                                                  
       LDAA .sub.-- CookTmr+.sub.-- Sta,X                                 
                        ;Test the top bit of the status byte;             
       BPL  DecCookDone ;If b7 = 0, timer is not Running --               
                        ;ignore...                                        
       LDAA .sub.-- CookTmr+.sub.-- 100,X                                 
                        ;Else decrement 1/100&#39;s:                          
       SSUBA                                                              
            #1          ;(*Note: .sub.-- 100 value is UNSIGNED            
                        ;255..0)                                          
       STAA .sub.-- CookTmr+.sub.-- 100,X                                 
       BCC  DecCookDone ;If .sub.-- 100&#39;s decremented from 0 --&gt; 255,     
                        ;need to reload 100&#39; s, decrement SS . . .        
       JSR  GetLCAdj100s                                                  
                        ;Get new 100&#39;s value based on AirTmp              
                        ;SetptTmp, and LoadComp setting                   
       STAA .sub.-- LCAdj100,X                                            
                        ;(Save for later reference, as when               
                        ;blinking colon leds at half &#34;second&#34; rate)       
       STAA .sub.-- CookTmr+.sub.-- 100,X                                 
                        ;Save new 100&#39;s reload value . . .                
       DEC  .sub.-- CookTmr+.sub.-- SS,X                                  
                        ; . . . and decrement seconds                     
       BPL  DecCookDone ;If SS still &gt;= 0, all done here                  
       LDAA #59         ;Else if seconds hits -1 ==&gt; reload at            
                        ;59 sec.                                          
       STAA .sub.-- CookTmr+.sub.-- SS,X                                  
       DEC  .sub.-- CookTmr+MM,X                                          
                        ; . . . and decrement minutes                     
       BPL  DecCookDone ;If MM still &gt;= 0, all done here                  
       LDAA #59         ;Else if seconds hits -1 ==&gt; reload at            
                        ;59 min.                                          
       STAA .sub.-- CookTmr+.sub.-- MM,X                                  
       DEC  .sub.-- CookTmr+.sub.-- HH,X                                  
                        ;. . . and decrement hours                        
       BPL  DecCookDone                                                   
                        ;If Hours hits -1 . . .                           
       LDAA #TmrTimeOut.                                                  
                        ;. . . we&#39;ve hit the end -- signal timed          
                        ;out!                                             
       STAA .sub.-- CookTmr+.sub.-- Sta,X                                 
DecCookDone:                                                              
RTS                                                                       
__________________________________________________________________________
 
    
     The &#34;DoState 100HzTmrs&#34; subroutine is preferably called every 1/100th second by the (hardware) TimerISR (Interrupt Service Routine). 
     The &#34;AlmEoc100s&#34; timer, handled at the start of DoState100HzTmrs, is separate from load compensation. 
     The values in the LCPercentsTbl are preferably implemented as 8-bit fractions (i.e. &#34;X&#34; in the table is implicitly the fraction &#34;X&#34;/256), but these multiplier constants do not need to be limited to fractional values. The multipliers could be 8-bit integer/8-bit fractional numbers, for example, to allow much more aggressive compensation. 
     In the preferred embodiment the cook time is sped up or slowed down by adding or subtracting &#34;K * abs (SetptTmpF-AirTmpF)&#34; to a nominal value of &#34;100&#34; when reloading the 1/100s component of the CookTmr countdown timer. 
     
         CookTmr. 100s:=100+K*(SetptTmpF-AirTmpF) 
    
     (where &#34;K&#34; is the multiplier for the current LoadComp setting) 
     An alternate correction calculation would make the adjustment directly proportional to the percent temperature difference rather than just the temperature difference itself. In this embodiment, an air temperature that was 15% too low, for example, could result in a cook timer &#34;second&#34; that was 15% longer, etc. For example, the time could be adjusted as follows: 
     
         CookTmr.100s:=100+K*((SetptTmpF-AirTmpF)/SetptTmpF) 
    
     A flow chart illustrating the steps in the &#34;Dostate 100HzTMrs&#34; subroutine is depicted in FIG. 5. A flow chart depicting the &#34;GetLCadj100s&#34; subroutine is depicted in FIG. 6. 
     The previously described hardware controller embodiments are usable with various types of food ovens. For example, but without limitation, the controller may be used in a rotisserie type oven, as discussed above. However, it is to be understood that the following control features are not limited to use in a rotisserie oven. 
     As described, for example, in U.S. Pat. Nos. 5,044,262 and 4,968,515, a rotisserie type food oven may be used to cook food in a cooking chamber by rotating the food about at least one axis within the cooking chamber. The rotation may be implemented by a rotor. The rotisserie type oven may include one or more types of heating elements to cook and/or brown the food. For example, one or more radiant heating elements and one or more air heating elements may be used. Typically, the air heating element(s) are used in combination with a fan (or blower) whereby the fan blows air over the heating elements to cause heated air to flow within the cooking cavity to assist in cooking the food. To control these (and other) components of the rotisserie, a controller may be used. To program and operate the controller, a user accessible control panel is provided. The control panel may include a plurality of input keys and displays. 
     The following is a description of another example of a controller which may be used to control a rotisserie of the type described above. However, the arrangement of the components need not be the same. Additionally, the concepts and features described below may be used in a controller to control other types of cooking appliances. Preferably, the controller is user accessible via a control panel which has a plurality of keys and displays, described in more detail below. 
     According to a preferred embodiment of the present invention, the rotisserie controller has several basic modes of operation. These modes include, without limitation, a STANDBY mode, a PREHEAT mode, a COOK mode, a HOLD mode, a PROGRAM mode, a SPECIAL PROGRAM mode and a TEST mode. The functions and operation of each of these modes is described below. 
     As shown, for example, in FIG. 7, the control panel (200) may be configured as follows. 
     Preferably, located on (or adjacent to) the control panel 200 are (2) five-digit LED displays (201A, 201B) including a top and bottom (or left and a right) display. As further discussed below, these displays show the temperature, time and messages associated with a control operation. Additionally, a plurality of LEDs are provided. For example, there may be a READY LED, a COOK LED, and a PROGRAM LED. The READY LED turns on during PREHEAT when the air temperature is in the programmed READY range. It turns off during cooking, regardless of the air temperature. The COOK LED turns on when the COOK timer is running. The HOLD LED turns on when the HOLD timer is running. The PROGRAM LED flashes during PROGRAM mode. 
     Additionally, there are preferably a plurality of PRODUCT LEDs (1-9 and 0). One PRODUCT LED is located adjacent each PRODUCT switch. A PRODUCT LED turns on to show which product is selected, and flashes while the COOK and HOLD timers are running for that product. All PRODUCT LEDs turn on in PROGRAM mode when a product must be selected. 
     Preferably, there are 10 PRODUCT switches, labelled 1 through 9 and zero. However, any reasonable number of such switches may also be used. The PRODUCT switches are used to select a product and operate the COOK timers. Moreover, as described below, by providing 10 PRODUCT switches, these switches may also be used to enter numbers and other parameter values during PROGRAM mode. 
     A menu card window is preferably located adjacent the PRODUCT LEDs. When the menu card is installed, from the back of the control panel, the menu legends are visible above each PRODUCT switch. This enables ease of identification and replacement. A POWER switch, for example, a 2-position rocker switch, is located adjacent the PRODUCT switches. This switch controls power to the rotisserie and the control. A ROTOR switch (not shown), for example, a momentary contact-type switch, is located adjacent (or on) the control panel. Pressing the ROTOR switch overrides automatic control of the rotor, and turns the rotor motor on. An identical switch may be located on the opposite side of the rotisserie, especially when the rotisserie has two doors (e.g., on opposite sides of the rotisserie) for accessing the cooking chamber. 
     A speaker (not shown) is conveniently located in the control panel or any other suitable location. It is used to generate audible alarms (as discussed herein) and to provide switch feedback. Preferably, as described in more detail below, the control may be programmed to generate alarms having different volumes and different tones. 
     A general description of the various modes will now be provided, followed by a more detailed description of the functions and operations performed in these modes along with excerpts of the source code for the software routines which are run by the controller during these modes to control the operation of the cooking appliance. 
     In STANDBY mode, the control is waiting for the operator to select a product. Thus, the display scrolls &#34;SELECT Product&#34; across the LED displays. STANDBY is entered, for example, when power is applied to the rotisserie or when a COOK cycle timer is cancelled. In PREHEAT mode, the control preheats the rotisserie to the programmed PREHEAT temperature (discussed below). The PREHEAT mode is entered when a product is selected. From the PREHEAT mode, to enter the COOK mode and thereby start the COOK timer, the PRODUCT switch is pressed. In COOK mode, the control causes the display to display the time remaining in the COOK cycle and regulates the process outputs for each stage of the COOK cycle to the parameter settings programmed during the PROGRAM mode. The HOLD mode is an optional mode in which the control regulates the process outputs as programmed for holding product after it is cooked. HOLD mode is automatically entered after the COOK timer end-of-cycle (EOC) alarm. In the PROGRAM mode, the PREHEAT, COOK and HOLD parameters are set. PROGRAM mode is entered by pushing and holding the &#34;Program&#34; (P) switch. Once in PROGRAM mode, pushing and holding the &#34;Program&#34; switch causes the controller to exit the PROGRAM mode. In the SPECIAL PROGRAM mode, system settings are set. Such settings include, for example, probe calibration, selection of °F./°C. operation, READY RANGE limits, and CPU temperature display. SPECIAL PROGRAM mode is entered by pressing and holding the PROGRAM switch until the displays show &#34;SPCL Prog&#34;. SPECIAL PROGRAM mode is exited by pressing and holding the &#34;Program&#34; switch. The TEST mode enablers various output tests to be performed as described below. 
     According to a preferred embodiment, in PROGRAM mode, the control can be programmed by a user for up to 10 products. Each PRODUCT program, corresponding to a COOK cycle, can include 10 COOK stages, an optional HOLD stage, and four process alarms. Of course, other numbers of stages and alarms could easily be accommodated. With reference to FIG. 8, a description of one embodiment of the PROGRAM mode will now be described. PROGRAM mode is entered by pressing and holding the PROGRAM (&#34;P&#34;) switch until the displays show &#34;Prod Set&#34;, then the top display shows &#34;Code&#34;. An access code is entered (step 901) with the PRODUCT keys to prevent unauthorized use of the PROGRAM mode. Once the proper access code is entered (step 902), the top display scrolls &#34;SELECT Product&#34;, the bottom display shows &#34;0-9&#34;, and all product LEDs turn ON. If no key is pressed for 15 seconds after the &#34;Code&#34; message display, the speaker sounds an alarm, the displays show &#34;code&#34; and &#34;- - - &#34;, and the control resumes operation. If an invalid password is entered, the displays flash &#34;Bad&#34; and &#34;Code&#34; (902a), and the speaker sounds at the maximum volume for 10 seconds. The control then resumes operation. Once access has been granted, the top display scrolls &#34;SELECT Product&#34; and the bottom display shows &#34;0-9&#34;. As in COOK mode, the desired product is selected by pressing one of the PRODUCT keys (0-9) (step 903). 
     When the product has been selected in PROGRAM mode, the displays are used in a consistent way. The top display describes the parameter and the bottom display shows the current value of the parameter. Once the product is selected, each press of the program switch advances to the next parameter. The parameters are described below. 
     Next, the PREHEAT temperature is selected (step 904) by using the PRODUCT keys and pressing the PROGRAM switch, which acts like an ENTER key in this mode. The PREHEAT temperature is the temperature to which the control will regulate the air and radiant heat elements during PREHEAT mode. For this parameter, the top display shows &#34;PrHt&#34; and the bottom display shows preheat temperature in degrees. Next, the top display shows &#34;ST.=&#34; (stage), and the bottom display shows a stage number. The displayed stage number is the stage that will be selected if the PROGRAM switch is pressed. If a PRODUCT switch (0-9) is pressed, followed by the PROGRAM switch, the control will immediately access the selected stage (0-9) for programming (step 905). For example, after the PREHEAT is programmed, the displays may show &#34;St.=1&#34;. If the program switch is pressed here, the stage 1 programming is entered. Alternatively, if &#34;5&#34; is pressed followed by the PROGRAM switch, the control jumps to stage 5. If the selected stage is &#34;0&#34; (step 906), control returns to step 903, otherwise control proceeds to step 907. If the selected stage number (N) is not less than or equal to the maximum number of COOK stages (e.g. 10), control passes to step 908. Otherwise, it proceeds to step 908. In steps 908-913, the parameters for COOK stage N are selected. For purposes of example, it will be assumed that the Stage 1 parameters are being programmed. 
     First, the Stage 1 cook time is set (step 908). The Stage 1 COOK time is the total COOK time for a COOK cycle (all stages) in hours and minutes. All other COOK stage times are then set and displayed in terms of time remaining to the end of the COOK cycle. The top display shows &#34;St. x&#34;, where &#34;x&#34; is the stage number and the bottom display shows stage time in hours and minutes. 
     The Stage 1 COOK time seconds is the total COOK time seconds. This time is added to the stage 1 COOK time in hours and minutes programmed above. This step can be skipped if it is only necessary to use hours and minutes. The left display shows &#34;St. 1&#34;, &#34;sec&#34;. The right display shows &#34;:xx&#34;, where &#34;xx&#34; is the time in seconds. The time can be set from 0 to :59 
     Next, the Stage 1 AIR TEMPERATURE setpoint is set (Step 909). This is the setpoint to which the air heat elements will be regulated during the stage. For this parameter, the display shows &#34;Air&#34;, and the bottom display shows setpoint in degrees. The PRODUCT keys are used to select this temperature. Then, the Stage 1 FAN (blower) status may be set to ON, OFF or VENT (step 910). For this parameter, the top display shows &#34;Fan&#34;, and the bottom display shows VENT, ON or OFF. Any PRODUCT key may be pressed to cycle the setting through VENT, ON, OFF, VENT, etc. 
     In steps 911-912, the RADIANT HEAT setpoint and its DUTY CYCLE are set. The Stage 1 RADIANT HEAT TEMPERATURE setpoint is the temperature limit for the radiant heat elements during the stage. The Stage 1 radiant heat DUTY CYCLE percent is the duty cycle that the radiant heat elements will be on during the stage. For this parameter, the top display shows &#34;rAd&#34;, and the bottom display shows &#34;xxx%&#34;, where &#34;xxx&#34; is the duty cycle in percent. 
     The control will cause the radiant heat elements to operate according to the programmed DUTY CYCLE when the air temperature is at or below this setpoint. The radiant heat will be off when the air temperature is above this setpoint. Top display shows &#34;rAd°&#34; and the bottom display shows the setpoint in degrees. 
     In step 913, the Stage 1 LOAD COMPENSATION FACTOR is set. This is the load compensation setting for the stage. 0 is minimum (no load compensation), and 10 is maximum load compensation. The load compensation adjustment is calculated based on the higher of the radiant and air temperature setpoints as discussed in connection with other embodiments. For this parameter, the top display shows &#34;LdCo&#34; and the bottom display, shows &#34;LC:xx&#34;, where &#34;xx&#34; is the load compensation setting. 
     After stepping through all stage 1 parameters, the top display shows &#34;St. =&#34;, and the bottom display shows the number of the next stage (step 914) and control returns to step 905, if this is not the last stage (step 915). Pressing the &#34;P&#34; switch at this point causes entry to the displayed stage number parameters. Alternatively, the desired stage number can be entered, and the entered stage is accessed. For example, after programming all stage 1 parameters, the display shows &#34;St. =&#34;, &#34;2&#34;. If &#34;P&#34; is pressed, programming continues with the stage 2 parameters. If, instead of pressing &#34;P&#34;, 3 is entered, then &#34;P&#34; is pressed, programming continues with stage 3. Thus the user may set the parameters for stages 2-10 in substantially the same way. As noted above, however, the time set will be the time remaining in the COOK cycle when the stage is entered. After setting the desired parameters for stages 2-10, the HOLD stage parameters may be set(step 917), if desired. 
     The HOLD stage time is the total product HOLD time in hours and minutes. For this parameter, the top display shows &#34;Hold&#34; and the bottom display shows the total HOLD time in hours and minutes. If the HOLD time is set to 0:00, then the HOLD parameters will not appear during programming. The HOLD stage time SECONDS is the HOLD stage time seconds which are added to the HOLD time hours and minutes, programmed above. For this parameter, the top display shows &#34;HOLD&#34;, &#34;sec&#34; and the bottom display shows the HOLD time seconds. The HOLD stage AIR TEMPERATURE setpoint is the temperature to which the air heat elements are regulated during the HOLD stage. For this parameter, the top display alternates &#34;Hold&#34;, Air°&#34; and the bottom display shows the AIR TEMPERATURE setpoint in degrees. The HOLD stage FAN status is the fan status during the HOLD stage. For this parameter, the top display alternates &#34;Hold&#34;, &#34;FAN&#34; and the bottom display shows VENT, ON, or OFF. Any PRODUCT key may be pressed to cycle through VENT, ON, and OFF. The HOLD stage radiant heat DUTY CYCLE percent is the duty cycle that the radiant heat elements will be on during the HOLD stage. For this parameter, the top display alternates &#34;Hold&#34;, &#34;rAd&#34; and the bottom display shows duty cycle in percent. The HOLD stage RADIANT HEAT setpoint is the temperature to which the radiant heat elements are regulated during the HOLD stage. For this parameter, the Top display alternates &#34;Hold&#34;, &#34;rAd°&#34; and the bottom display shows the setpoint in degrees. The HOLD stage LOAD COMPENSATION FACTOR is the load compensation setting for the HOLD stage. For this parameter, the Top display alternates &#34;Hold&#34;, &#34;LdCo&#34; and the bottom display shows &#34;LC:xx&#34;, where &#34;xx&#34; is the load compensation setting. The load compensation can be set from 0 to 10. 0 is no load compensation, 10 is maximum load compensation. 
     As noted above, various alarms may be set (steps 918-920). Alarm 1 time, in hours and minutes is set in terms of the time remaining in the COOK cycle. For this parameter, the top display shows &#34;AL x&#34;, where x=1 for alarm 1, 2 for alarm 2, etc. The bottom display shows the alarm time in hours and minutes. If all alarms are set to 0:00, the remaining alarms will not be displayed in PROGRAM mode. If more than one alarm is not set to 0:00, then only one &#34;0:00&#34; alarm will be shown. For example, if alarm 1 is 1:00, alarm 2 is :40, and alarms 3 and 4 are zero, then only alarms 1, 2 and 3 will be shown during programming. 
     The ALARM 1 time, SECONDS is the number of seconds which is added to the alarm 1 time hours and minutes, programmed above. This step can be skipped if it is only necessary to set the alarm time in hours and minutes. For this parameter, the top display shows &#34;AL 1&#34;, &#34;sec&#34; and the bottom display shows the alarm time seconds. The seconds can be set from 0 to :59. Similarly, Alarms 2-4 may be set. 
     When programming the stage parameters, the top display alternates between displaying &#34;St. x&#34;, and the parameter label, where &#34;x&#34; is the stage number. This acts as a reminder of which stage is being programmed. 
     During programming, preferably the numeric parameters are entered by using the PRODUCT keys as a numeric keypad. For example, to enter &#34;400&#34;, the keys 4, 0 and 0 are pressed. Mistakes in parameter entry are cleared by pressing the &#34;0&#34; key until the display shows all zeros. The correct parameter can be entered at this point. Other known data entry techniques may also be used. 
     To prevent errors and for other reasons, parameter limits and resolution may be fixed. For example, COOK, HOLD and ALARM times between 0:00:00 and 18:00:00, with one second resolution are reasonable limits. For temperatures 140° to 425° F., with one degree resolution, are reasonable limits. For radiant heat duty cycle 0 to 100%, with 1% resolution are reasonable limits. For load compensation settings of 0 to 10, with 1 unit resolution. 
     If a parameter is entered that exceeds the parameter limits, an error message is sounded. The error message occurs when the PROGRAM switch is pressed to advance to the next item. If the value is too low, the bottom display flashes &#34;too Lo&#34;, then the previous value of the parameter is shown. If the value is too high, the display flashes &#34;too Hi&#34;. In either case, the top display shows the parameter prompt. It is not possible to advance to the next parameter until a valid parameter is entered. 
     PROGRAM mode can be exited at any time by pressing and holding the &#34;Program&#34; switch. PROGRAM mode will be exited automatically if no switches are pressed for 60 seconds, or some other predetermined time. 
     If no HOLD stage is required, the HOLD time can be set to zero. Similarly, if no alarms are required, all alarm times can be set to zero. Since all of the various stage parameters can be set for the HOLD stage, this means, for example, that HOLD mode can be programmed so that only radiant heat is used with no air heat as described above or vice versa. To skip past all COOK stage settings, directly to HOLD and alarm settings, a stage number greater than 10 (for example, 11 or 15) is entered when the top display shows &#34;St. =&#34; (step 905). 
     To COOK or HOLD with only radiant heat, and no air heat, the AIR TEMP setpoint can be programmed to a very low value, and the radiant heat setpoint can be programmed to the desired regulation point, with the radiant heat duty set as wide as required. To COOK or HOLD with only air heat, and no radiant heat, the radiant heat duty cycle is set to zero. In this case, the radiant heat setpoint does not matter. 
     In PROGRAM mode, data may be entered in various ways. For example, as shown in FIGS. 8A-8E, the item (parameter) displayed well generally be displayed with an existing value or is initialized to set an &#34;existing value.&#34; Selection of the existing value is performed as shown in FIG. 8B. Entry of a numeric value is performed as shown in FIG. 9C. If an entry is a &#34;good entry&#34; (e.g. a valid entry) the good entry routine is performed as shown in FIG. 8D. If a bad entry (e.g. invalid entry) the routine of FIG. 8E is performed. 
     By way of example, an excerpt of a software routine for enabling items (e.g. parameters) to be programmed with data values is as follows. ##SPC1## 
     An example of software routine which may be used during programming is as follows. ##SPC2## 
     To operate the controller, the POWER switch is turned to the ON position and the control executes self-tests. All displays are blank during internal self-tests, which may take 2-4 seconds. After self-tests are done, all displays and LEDs turn on briefly, and the speaker sounds an alarm, for example, 5 short beeps. Then, the top display scrolls &#34;SELECT Product&#34;, to indicate that a product must be selected. All outputs (heat, fan, rotor, etc.) are OFF until a product is selected. 
     When the top display shows &#34;SELECT product&#34;, a PRODUCT key (0-9) is pressed to select the desired product and the associated PRODUCT LED turns on. The control then begins to regulate the air to the PREHEAT temperature. The Top display flashes &#34;Pre-&#34;, &#34;HEAT&#34;, and the bottom display shows the air temperature in the cavity. A different product can be selected by pressing the associated PRODUCT key. Otherwise, the control begins a heater response test when the product is selected, during the PREHEAT stage. If the air temperature does not reach a predetermined temperature, for example, 150° F. within a predetermined time, for example, four minutes of product selection, then the control shows the message &#34;Heat error&#34; in the top display. This signals that there is some sort of error. Otherwise, the heat remains on, and normal operation can continue. 
     During PREHEAT, preferably the air heat and radiant heat are both turned on to regulate the air temperature in the cooking chamber to the programmed PREHEAT setpoint. Preferably, the air heat and radiant heat are independently controlling during PREHEAT, COOK and HOLD. Independent control of different types of heaters is disclosed, for example, in U.S. Pat. No. 5,182,439 which is incorporated herein by reference. Other examples of PREHEAT control are disclosed in application Ser. No. 07/746,760 filed Aug. 19, 1991 entitled &#34;PREHEATING METHOD AND APPARATUS FOR USE IN A FOOD OVEN&#34;, which is incorporated herein by reference. During PREHEAT, preferably, the blower (fan) runs continuously, the rotor is always off and the vent is always closed. An excerpt of the PREHEAT subroutine is as follows. ##SPC3## 
     The READY LED turns on when the air temperature in the cavity is within 10° F. of the setpoint (but this can be changed in the SPECIAL PROGRAM mode.) This prompts the user to load the product. After the product is loaded, the user presses the desired PRODUCT switch to start the timer and enter the COOK mode. The top display shows time remaining in hours and minutes, until less than one hour remains. When less than one hour remains, the top display shows the time remaining in minutes and seconds. The bottom display shows the air temperature in the cavity. Also, the COOK LED turns on and the ROTOR starts turning automatically when the COOK timer is started. 
     In COOK mode, the selected PRODUCT is cooked during a COOK cycle. A COOK cycle is made up of one or more COOK stages or intervals and optimally, a HOLD stage. During a COOK cycle, the air heating elements are regulated according to the programmed AIR HEAT setpoint for each stage within the COOK cycle. The air heating elements are ON as long as the air temperature is less than the programmed AIR HEAT setpoint. If the air temperature is above the AIR HEAT setpoint, the air heating elements are turned OFF. Additionally, the radiant heat elements are pulsed at the programmed DUTY CYCLE as long as the air temperature in the cooking chamber is less than the programmed RADIANT HEAT setpoint. If the air temperature is above the RADIANT HEAT setpoint, the radiant heat elements are turned off. The spit motor (also called the rotor) is turned on during the COOK cycle. The blower (or fan) is regulated according to the programmed FAN setting for each stage of the COOK cycle. The blower (fan) can be programmed to one of three settings during a COOK cycle stage: ON, OFF or VENT. The ON setting causes the fan to run continuously with the vent closed. The VENT setting causes the fan to run continuously with the vent open. The OFF setting causes the fan to be OFF, except for a short period of time in which it will pulse on. For example, in the OFF state, the fan may pulse ON for 10 seconds every 2 minutes. This pulsing operation is desirable to enable a good sample of the cavity (cooking chamber) air temperature to be obtained, and to assist in cooling the control compartment. Additionally, the fan will turn ON whenever the air heat is ON, regardless of the programmed FAN stage setting. This is desirable to ensure heat transfer from the air heat elements to avoid damage. Additionally, whenever the door (or one of the doors) to the cooking chamber is open, the blower is turned OFF. This is done for safety and efficiency reasons. 
     Alarms during the COOK cycle cancel themselves. Alternatively, they can be cancelled by pressing the PRODUCT switch. During an alarm, the bottom display flashes &#34;AL x&#34;, where &#34;x&#34; is the alarm number. The top display continues to show the COOK time remaining. The speaker sounds as the display flashes. Preferably, there are a total of 5 flashes. 
     If either or both doors are opened during the COOK cycle, preferably all process outputs are turned OFF and remain OFF until both doors are again closed. A door open detector of a known type may be used to detect these occurrences. Both displays are used to flash the &#34;door open&#34; message. The COOK timer keeps running while the doors are open, but the load compensation feature adjusts the COOK time accordingly due to the likely drop in temperature while the door(s) is open. Alternatively, the COOK timer is paused while the door is open. 
     To abort a COOK cycle, a user presses and holds the PRODUCT switch until the display shows &#34;Select product.&#34; Otherwise, at the end of the COOK cycle, the top display flashes &#34;0:00&#34; and the bottom display flashes &#34;DONE&#34;. The product LED also flashes and an alarm sounds. This prompts the user to push the PRODUCT switch to stop the alarm. The rotor stops automatically when the alarm is acknowledged. If no HOLD time is programmed, all process outputs turn OFF and the top display scrolls the &#34;SELECT Product&#34; message. If a HOLD time is programmed, it is not necessary to push the PRODUCT switch to stop the alarm--the alarm will sound and the HOLD mode will automatically be entered. In this case, at the end of the HOLD cycle, the top display flashes &#34;0:00&#34; and the bottom display flashes &#34;Hold&#34;, &#34;End&#34;. The speaker executes the end-of-hold (EOH) alarm, which is audibly different from the end-of-cycle (EOC) alarm. Again, the user presses the PRODUCT switch to stop this alarm. The ROTOR continues to turn until the EOH alarm is acknowledged. When the alarm is acknowledged, all outputs are turned off and the display displays &#34;SELECT product.&#34; 
     If power is removed from the control at any time, the control will power up again, execute the self-tests, then resume the operation that was active at power-down. If a COOK cycle was timing, then the control will resume the COOK timer. If PREHEAT was active, then PREHEAT will be resumed. 
     In operation, the control uses the stored parameters for each stage of a COOK cycle to COOK and HOLD product. This is accomplished primarily by controlling the air heat elements, the radiant heat elements, the blower and the rotor in connection with running and monitoring the COOK timer (and other timers) and based on the probed temperature. By way of example, these operations are described below. 
     As shown, for example, in connection with FIG. 10, the operation of the Air Heat is described. First, the AIR temperature setpoint for the current stage is obtained (step 1001). Then it is determined whether the (or either) door is open (step 1002). If a door is open the air heat elements are turned OFF (step 1009). Otherwise, it is determined whether the probed temperature is greater than the AIR setpoint temperature (step 1003). If yes, control passes to step 1004 and if not, control passes to step 1005. In step 1005, it is determined whether the probed temperature is equal to the AIR setpoint temperature. If no, control passes to step 1010, if yes, control passes to step 1006. In step 1006, it is determined whether the AIR HEAT TIMER is running. If it is, there is no change to the AIR HEAT output of the controller and control returns to the beginning of the subroutine (step 1016). If the AIR HEAT TIMER is not running, control passes to step 1007. In step 1007, it is determined if the AIR HEAT is ON. If it is not, control passes to step 1009. If it is ON, the AIR HEAT TIMER (off time) is set (step 1008), the AIR HEAT is turned OFF (step 1009) and control passes to step 1016. The AIR HEAT TIMER is used to limit the contactor cycling at the transition temperatures. From steps 1004 and 1007, control passes to step 1009. 
     If control passes from step 1005 to step 1010, it is determined whether the probed temperature is equal to the AIR setpoint-1. If not, control passes to step 1012. However, if it is, control passes to step 1011, where it is determined whether the AIR HEAT TIMER is running. If it is running, there is no change to the AIR HEAT output and control passes to step 1016. If the AIR HEAT TIMER is not running (step 1011), it is determined whether the AIR HEAT is currently OFF (step 1013). If it is, the AIR HEAT TIMER (on time) is set (step 1014), the AIR HEAT is turned ON-(step 1015) and control passes to step 1016. From step 1012 or if the response is negative to step 1013, control passes to step 1015. 
     By way of example, the following is an excerpt of a software routine that may be used to control the AIR heat elements of a cooking appliance. ##SPC4## 
     As shown, for example, in FIG. 11, the operation of the RADIANT HEAT element(s) is described. First, the programmed RADIANT HEAT setpoint and DUTY CYCLE are obtained (step 1101). Then it is determine whether a door is open (step 1102). If a door is open, the RADIANT HEAT is turned OFF (step 1108) and control passes to step 1109 which causes control to return to the beginning of the subroutine. If a door is not open, it is determined whether the probed temperature is greater than the RADIANT HEAT setpoint (step 1103). If yes, a RADIANT HEAT TIMER is set to &#34;0&#34; (step 1103a) and control passes to step 1108. If no, it is determined whether the probed temperature equals to the RADIANT HEAT setpoint (step 1104). If no, control passes to step 1110. If yes, it is determined whether the RADIANT HEAT TIMER is running (step 1105). If it is running, there is no change to the RADIANT HEAT output of the control and control passes to step 1109. If the RADIANT HEAT TIMER is not running (step 1105), it is determined whether the RADIANT HEAT is currently ON (step 1106). If not, control passes to step 1108, otherwise the RADIANT HEAT TIMER (off time) is set (step 1107), the RADIANT HEAT is turned OFF (step 1108) and control passes to step 1109. 
     In step 1110, it is determined whether the probed temperature equals the RADIANT HEAT setpoint-1. If not, control passes to step 1112, otherwise it is determined whether the RADIANT HEAT TIMER is running (step 1111). If it is running, there is no change to the RADIANT HEAT output and control passes to step 1109. If the RADIANT HEAT TIMER is not running (step 1111), it is determined whether the RADIANT HEAT is currently OFF (step 1113). If it is OFF, the RADIANT HEAT TIMER (on time) is set (step 1114) and control passes to step 1115. If it is ON (step 1113), control passes directly to step 1115. In step 1115, it is determined whether a cycle percent timer value is less than the requested DUTY CYCLE. If it is not, the RADIANT HEAT is turned OFF (step 1116) and control passes to step 1109. If it is, the RADIANT HEAT is turned ON (step 1117) and control passes to step 1109. 
     By way of example, the following is an excerpt of a software routine that may be used to control the radiant heat elements of a cooking appliance. ##SPC5## 
     As shown, for example, in FIG. 12, the blower (FAN) may be operated as follows. The blower mode or setting for the current stage is obtained (step 1201). Then it is determined whether a door is open. If a door is open, the blower is turned off (step 1208) and control passes to step 1206. If not, it is determined whether the AIR HEAT is ON or if the vent is open. If yes, the blower is turned ON (step 1205) and control passes to step 1206. If the AIR HEAT is not ON (step 1203), it is then determined whether the blower setting for the current stage is ON (step 1204). If yes, the blower is turned ON (step 1205). Otherwise, it is determined whether the blower setting is OFF (step 1207). If yes, the blower is turned OFF (step 1208) and control passes to step 1206. If the response in step 1207 is no, the blower setting may be a periodic pulse mode (step 1209), in which case it is determined whether a blower timer is less than the ON time for the blower timer (step 1210). If it is, the blower is turned ON (step 1211), if not, the blower is turned OFF (step 1212). From steps 1211 and 1212, control passes to step 1206. 
     The following is an example of an excerpt of a software routine that may be used to control the blower (fan) of a cooking appliance. ##SPC6## 
     Similarly, the rotor and vent may be controlled. For example, if a door is open, the rotor may be OFF and the vent closed. Preferably, whenever the control is in a COOK or HOLD mode, the rotor is ON. Otherwise, it should be OFF (unless control is overridden by manual rotor control). The vent position (open or closed) may be responsive to the programmed vent setting. Alternatively, a manual or automatic override may be used. For example, automatic override may be used to open the vent if the humidity (or some other sensed parameter) as sensed by a humidity sensor located in or in communication with the cooking chamber exceeds a predetermined level. 
     By way of example, excerpts of software routines for controlling the rotor and vent according to one embodiment of the present invention are as follows. ##SPC7## 
     In the COOK mode, the control performs the general procedure shown in FIG. 13. If the COOK state is not already initialized (step 1301), it is initialized (step 1302) and control passes to step 1303. In step 1303, the parameter settings for COOK stage N are copied into the &#34;Requested Variables&#34; Then the end of cycle (EOC) code check is performed (step 1304) and control passes to step 1305, where it is determined whether the substrate is &#34;cooking&#34;. If it is, control passes to step 1309. Otherwise, it is determined whether the alarm EOC code is &#34;0&#34; (step 1306). If it is, the COOK state is exited, the HOLD or OFF state is entered (step 1307) and control passes to step 1308. If not, control passes directly to step 1308 which is a return step. In step 1309, the time remaining in the cook cycle is determined. Next, it is determined if the time remaining is 00:00:00 (step 1310). If yes, this is the end of cycle (EOC) and an EOC routine is performed (step 1310a) and control passes to step 1308. If the time remaining is not 00:00:00 (step 1310), it is determined if a door is open (step 1311). If a door is open, the timer is paused (step 1312). Optionally, however, the timer may continue to run, especially if load compensation is being used. In any event, if the door is not open (or the timer pause step is skipped) the COOK timer is running (step 1313). In either case, control passes as shown to step 1314 where it is determined whether the remaining time equals a programmed ALARM time. If yes, the alarm EOC code is set to the next alarm number (step 1315) and control passes to step 1316. If not, control passes directly to step 1316. If the COOK stage (N) is already the last stage (step 1316) control passes to step 1308. Otherwise, it is determined if the remaining time equals the time set for the next (N+1) stage (step 1317). If it is, N is incremented (N=N+1) (step 1318) and control passes to step 1308. If not, control passes to step 1308 and the current stage continues. 
     By way of example, an excerpt of a software routine for performing these functions and associated displays and key inputs is set forth below. ##SPC8## 
     At the end of a cook cycle, the HOLD mode may be entered. An example of a software routine which may be performed in HOLD mode for cooking appliance is as follows. ##SPC9## 
     According to another feature of this embodiment, a SPECIAL PROGRAM mode is used to set parameters that are not changed very often, and are more system-oriented than the PRODUCT parameters. SPECIAL PROGRAM mode is entered by pressing and holding the PROGRAM switch for a predetermined period of time until the displays show &#34;SPCL&#34; &#34;Prog&#34;. The top display then shows &#34;Code&#34;, indicating that the control is waiting for the user to enter the access code. The behavior if the code is not entered, or is entered incorrectly, is the same as that described in the PROGRAM MODE section above. 
     On entry to SPECIAL PROGRAM mode, the PROGRAM mode message (&#34;Prod Set&#34;) will be displayed first. By continuing to hold the PROGRAM key until &#34;SPCL Prog&#34; is displayed SPECIAL PROGRAM mode can be exited at any time by pressing and holding the PROGRAM switch. SPECIAL PROGRAM mode will be exited automatically if no switches are pressed for a predetermined time, for example, one minute. Prior to this latter mentioned predetermined time, for example, at 50 seconds, the control causes the speaker to beep to alert the user that SPECIAL PROGRAM mode is about to be exited. Once SPECIAL PROGRAM mode is entered, the PROGRAM switch is used to step through the parameters that may be set and/or displayed. The top display shows a parameter label, and the bottom display shows the current setting. 
     SPECIAL PROGRAM mode is used, for example, to set or display the following items: 
     1. Temperature display/programming units: °F. or °C. The top display shows &#34;deg&#34;. The bottom display shows the current setting. Any key may be pressed to toggle the temperature units. 
     2. Probe calibration. The top display shows &#34;Calib&#34;. The bottom display shows the current air temperature. The desired air temperature is entered using the PRODUCT switches. The air temperature can be set +/-15 degrees from nominal to take into account component tolerances, etc. 
     3. Speaker volume. The top display shows &#34;Loud&#34;. The bottom display shows the current setting. The desired volume setting is entered with the PRODUCT keys. The volume can be set from 1 to 10. 1 is minimum volume, 10 is maximum volume. When the PROGRAM key is pressed, the speaker will sound the frequency for three short beeps. If this setting is satisfactory, the PROGRAM switch is pressed to advance to the next item. 
     4. Speaker frequency. The top display shows &#34;tone&#34;, and the bottom display shows the current frequency in Hz. The frequency can be set from 50 to 2000 Hz or some other suitable range. When the PROGRAM key is pressed, the speaker will sound the frequency for three short beeps. If this setting is satisfactory, the PROGRAM switch is pressed to advance to the next item. 
     5. READY LED range limits. The READY LED range limits are programmed in two steps--the upper limit and the lower limit. The two limits need not be symmetrical about the setpoint. When programming the upper limit, the top display shows &#34;rdy&#34;, and the bottom display shows the upper limit in degrees. When programming the lower limit, the top display shows &#34;-rdy&#34;, and the bottom display shows &#34;-xx&#34;, where &#34;xx&#34; is the lower limit in degrees. The desired limits are entered with the PRODUCT keys. The limits can be set from 0° to 25°, or other suitable values. 
     6. Usage values. This keeps track of a product usage, by product, in cycles. The top display shows &#34;USED&#34;. The bottom display shows the number of times the cycle was cooked since the count was last reset. The PRODUCT keys are pressed to display the usage for the different products. The product LED turns on to show which product is selected. To reset the usage to zero the PRODUCT switch is pressed to select the product, then it is released and pressed again and held until the display flashes, then shows 0. 
     7. Control ambient temperature, current and maximum. The bottom display shows &#34;CPU&#34;, and the top display shows the current control ambient temperature. The maximum ambient temperature recorded by the control can be displayed by pressing and holding the &#34;1&#34; PRODUCT switch. In this case, the top display shows &#34;Hi =&#34;, and the bottom display shows the maximum recorded ambient. To reset this maximum, the &#34;1&#34; and &#34;0&#34; PRODUCT keys are pressed and held simultaneously. 
     8. System initialization. This step is used to initialize a parameter RAM to the product constants stored in the program EPROM. The top display shows &#34;init&#34;, and the bottom display shows &#34;sys&#34;. Any PRODUCT key may be pressed and held to initialize the RAM. As the switch is held, the displays flash &#34;init in x&#34;, where &#34;x&#34; is the number of seconds remaining until initialization. &#34;x&#34; starts at 5 seconds. The speaker sounds during this display. To abort the initialization, the key is released. If the key is held until the system is initialized, then the control does a complete reset after initializing the parameter RAM. After the usual power-up sequence, the displays will show &#34;SYS init&#34; for one second as the speaker sounds. 
     An example of an excerpt of the software routines used in SPECIAL PROGRAM mode is as follows. ##SPC10## 
     Other parameter data may be logged as well. These may be accessed in SPECIAL PROGRAM mode or in another convenient way. 
     For example, the control may log individual variables (e.g. usage statistics, e.g., for individual components, cycles and stages) and overall system items (number of times powered-up, initialized, etc.). An example of a subroutine for logging such parameters in a cooking appliance is as follows. ##SPC11## 
     The control implements several self-tests and error messages. When an error occurs preferably the speaker sounds continuously at the maximum volume. Pressing any key turns the speaker off. The top display shows a standard error code, and the bottom display flashes a description of the error. All process outputs are turned off. The error display continues until the error is cleared. Timers keep running during error conditions. For example, some errors which may occur are: 
     
         ______________________________________                                    
&#34;Prob Err&#34;     The air temperature probe has                              
               opened or shorted.                                         
&#34;ctrl hot&#34;     Control ambient temperature                                
               limit exceeded.                                            
&#34;CPU Chip&#34;     Internal CPU RAM error.                                    
&#34;-rA- CHIP&#34;    External RAM error.                                        
&#34;-ro- CHIP&#34;    External ROM error.                                        
&#34;dAtA Err&#34;     Data corruption error.                                     
&#34;too hot&#34;      Software high limit (excessive air                         
               temperature).                                              
______________________________________                                    
 
    
     An example of excerpts of the software routines relating to ERROR MESSAGES is as follows. ##SPC12## 
     SYSTEM INITIALIZATION SETTINGS 
     By way of example, the control may set the various parameters for each product to the following values after a system initialization. 
     
         ______________________________________                                    
Preheat                 375° F.                                    
Stage 1 time            0:55                                              
Stage 1 air temperature 360° F.                                    
Stage 1 fan             on                                                
Stage 1 radiant heat    100%                                              
Stage 1 radiant         360° F.                                    
temperature setpoint                                                      
Stage 1 load compensation                                                 
                         0                                                
Stages 2-10 time        0:00                                              
HOLD time               0:00                                              
HOLD air temperature    200° F.                                    
setpoint                                                                  
HOLD fan                on                                                
HOLD radiant heat       100%                                              
HOLD radiant            200°                                       
temperature setpoint                                                      
HOLD load compensation   0                                                
Alarm 1                 0:01                                              
Alarms 2-4              0:00                                              
______________________________________                                    
 
    
     Of course, other settings may be used. 
     The TEST mode enables a user (or preferably a service technician) to check the operation of the components individually without having to actually enter a PREHEAT COOK or HOLD stage. It enables the components to be checked directly by operation of the control panel. Preferably, entry to this mode requires a special access code. An example of an exerpt of a software routine for operating a cooking appliance in this mode is as follows. ##SPC13## 
     An example of a software routine for operating the speaker in a cooking appliance is as follows. ##SPC14## 
     According to another feature, the programmable parameters may be stored in a checksum-protected data area to check the integrity of the data. A second copy of this data is maintained as a back-up and is used to restore the primary data area whenever the primary data is corrupted, provided the secondary data is still valid and intact. The number of times that the secondary data is used to restore the primary data may be logged, for example, as described above to enable a technician to determine if there is a problem. An example of a subroutine for implementing this &#34;data-fix&#34; feature is as follows. ##SPC15## 
     As described above, access to various levels or modes may require entry of a code or password. By restricting access to these codes or passwords certain classes of individuals may be restricted from accessing certain features or groups of features. An example of a subroutine for implementing this access control in a cooking appliance is as follows. ##SPC16## 
     Timing (e.g. of a cook cycle) may continue through a power down condition. For example, a routine for handling this feature is as follows. ##SPC17## 
     In some instances, left and right are used to described displays and in other instances top and bottom. It is to be understood that this is merely a design preference and the left and top displays may be used interchangeably and the right and bottom displays may be used interchangeably, or vice versa. 
     The foregoing is a description of the preferred embodiments of the present invention. Various alternatives and modifications will be readily apparent to one of ordinary skill in the art. The invention is only limited by the claims appended hereto.