| ??? 12/21/07 20:32 Read: times |
#148603 - Isn't it too short? Responding to: ???'s previous message |
Oliver said:
The ADC ISR should just copy the ADC result sfrs to a variable and raise a flag to indicate that new data is ready.
The UART RI interrupt should copy the SBUF sfr to a variable and raise a flag. 2. The main loop checks the flags raised by the ISRs to decide what to do. The ADC holds the result in the ADC SFRs until it finishes next conversion. Also, the UART holds the received byte on SBUF until the end of next byte reception. Then, is there any difference from direct polling of the ADC flag or RI in the main loop? This implementation doesn't reduce the timing requirement for the main loop. The main loop should round within the one byte period of the RS232. Otherwise, the RX data will be lost. The all tasks on the main loop cannot take more than the one byte period. I recommend you to apply buffering on the firmware side. Then the main loop tasks enjoy more execution time. In the ADC ISR, the ADC result is summed into a sum variable. Also count up a counter. When the counter reaches to a given value, say 16, - copy the sum variable to a hold variable - clear the sum variable - raise a flag to show it to the main loop task. In the UART ISR, - The received byte is stored to a 16 bytes buffer, for example. - The byte is stored in the current index on the buffer. - Increment the index. - When the received byte is the terminator character, - Raise a flag to show it to the main loop. In the main loop task, - Handle the buffered data array. - Clear the index. Drop the flag I showed simple single buffer implementation here. Depending on your protocol on RS232, you may need more elaborate buffering. a) single buffer b) double buffer - assign two buffers and use them in turn c) cyclic buffer Tsuneo |



