Ich versuche, externe ADC AD7798- Werte mit dem ATmega32-A-Controller zu lesen. Im Datenblatt zeigt Statusregister Bit 7 ( SR7
) an, dass die Konvertierung abgeschlossen ist oder nicht:
Bereit-Bit. Wird gelöscht, wenn Daten in das Datenregister geschrieben werden. Wird gesetzt, nachdem das Datenregister gelesen wurde oder nach einer Zeitspanne, bevor das Datenregister mit einem neuen Umwandlungsergebnis aktualisiert wird, um dem Benutzer anzuzeigen, dass er die Umwandlungsdaten nicht lesen soll. Es wird auch gesetzt, wenn das Teil in den Abschaltmodus versetzt wird. Das Ende einer Wandlung wird durch den DOUT/RDY-Pin angezeigt. Dieser Pin kann alternativ zum Statusregister zur Überwachung des ADC auf Konvertierungsdaten verwendet werden.
Jetzt möchte ich Code schreiben, um zu prüfen, ob das Statusregister MSB (Bit7) ist 0
oder nicht. Wenn es also ist 0
, kann ich nur dann einen Lesebefehl erteilen.
Ich habe Code wie folgt geschrieben:
unsigned char CheckStatus(void)
{
char adcStatus;
spi(0x40);
adcStatus = spi(0xFF);
while((adcStatus & 0x80)!=0x80);
return adcStatus;
}
Aber es funktioniert nicht.
Meine Code-Erklärung:
adcStatus
Variable speichern.1
. (Ich bin mir nicht sicher, ob diese while
Schleife richtig ist oder nicht.)Ich möchte prüfen, ob das Statusregister MSB nicht gleich ist, 1
damit ich den Lesebefehl ( 0x58
) ausgeben kann, um die ADC-Werte einzulesen. Wenn das Statusregister MSB gleich ist, 1
kann ich keine ADC-Werte lesen.
Was mache ich falsch?
Sie müssen das ADC-Statusregister innerhalb der Schleife erneut lesen; Andernfalls testen Sie nur das Bit, das Sie beim ersten Mal gelesen haben. Außerdem müssen Sie den Sinn des Tests umkehren – Sie möchten den Test wiederholen, wenn das Bit "1" ist, und aus der Schleife aussteigen, sobald es auf "0" wechselt. Es kann auch erforderlich sein, die Chipauswahl bei jedem Lesen auf den ADC umzuschalten, wie in den Kommentaren unten gezeigt.
unsigned char CheckStatus(void)
{
unsigned char adcStatus;
do {
/* TBD: assert chip select here? */
spi(0x40);
adcStatus = spi(0xFF);
/* TBD: negate chip select here? */
} while ((adcStatus & 0x80) == 0x80);
return adcStatus;
}
verendra
David Tweed
(adcStatus & 0x80)
kann nur zwei unterschiedliche Werte haben: 0x00 oder 0x80, abhängig vom Zustand von Bit 7 in adcStatus.verendra
Wouter van Ooijen