Hallo,
ich hab mal wieder ein kleines Designproblem beim Programmieren meines PIC. Und zwar bin ich mir unschlüssig, ob ich auf eventuelle Fehlfunktion der chipinternen Peripherie reagieren sollte.
Konkret geht es um diverse Funktionen, bei denen gewartet werden muß:
- Freiwerden des UART-Sendebuffers while ( !PIR1bits.TXIF );
- Fertigwerden des ADC while ( ADC_RUN );
- Fertigwerden des Schreibens im internen EEPROM while ( EECON1bits.WR );
- Warten auf Ereignisse am I2C-Bus: while ( SSPCON2bits.SEN ); while ( SSPCON2bits.RSEN ); while ( SSPCON2bits.PEN ); while ( SSPSTATbits.BF ); while ( SSPCON2bits.RCEN ); while ( SSPCON2bits.ACKEN );
Diese Warteschleifen sollten ja irgendwann mal beendet werden, nämlich dann, wenn das ersehnte Ereignis eintritt. Nun die Frage: Sollte/Muß ich damit rechnen, daß eine der Zustände
- UART-Sendebuffer wird nie frei
- ADC wird nie fertig
- interner EEPROM wird nie fertig mit Schreiben
- I2C-Bedingung wird nie erfüllt
eintritt?
Die Beispielprogramme, die "man" so findet - auch die im Manual - haben oft bzw. meistens nur obige Form. Aber was, wenn doch was passiert? Oder brennt eher der Core durch als daß irgendeine der genannten Fehlfunktionen eintritt?
Anders gefragt: Sollte man hier nicht eher einen Zähler einbauen in der Art
count=0xFF; // 1 cycle: about 16 Loops - this one is more than enough... while (ADC_RUN && count) count--; if (ADC_RUN) // Oops. count has run out and ADC_RUN is still 1. Should never happen. result = ADC_FAULT; else // read out the result result = ADRES;
Würde das Programm natürlich etwas verkomplizieren...
Wie denkt ihr darüber?
TIA,
Thomas