Problem mit While-Schleife

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 0oder 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:

  1. Ausgeben des Lesebefehls zum Lesen des ADC-Statusregisters.
  2. ADC-Statusregisterwert lesen und in adcStatusVariable speichern.
  3. Das Prüfen des MSB-Bits ist ungleich 1. (Ich bin mir nicht sicher, ob diese whileSchleife richtig ist oder nicht.)

Ich möchte prüfen, ob das Statusregister MSB nicht gleich ist, 1damit ich den Lesebefehl ( 0x58) ausgeben kann, um die ADC-Werte einzulesen. Wenn das Statusregister MSB gleich ist, 1kann ich keine ADC-Werte lesen.

Was mache ich falsch?

Antworten (1)

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;
}
Ich verwirre die While-Schleife, weil (adcStatus & 0x80) result=0x80 ergibt. dann 0x80==0x80 bedeutet? Können Sie dies ein wenig erläutern.
Der Ausdruck (adcStatus & 0x80)kann nur zwei unterschiedliche Werte haben: 0x00 oder 0x80, abhängig vom Zustand von Bit 7 in adcStatus.
Angenommen, (adcStatus & 0x80) ergibt 0x80, dann wird 0x80 == 0x80 verglichen und was wird zurückgegeben. Ich vermute, es wird fortlaufend ausgeführt, bis Bit7 = 0 und der Rückgabewert adcStatus. denn wenn Bit7 = 0 dann (adcStatus & 0x80) ergibt 0x00, was nicht gleich 0x80 ist, also endet die Schleife. Bin ich richtig.
Nein, wie Dave erklärt hat, liest Ihr Code den Statuswert EINMAL und führt dann eine Schleife durch, bis das 7. Bit dieses Statuswerts (gespeichert in der lokalen Variablen adcStatus) auf magische Weise zu einer 1 wechselt. Oder vielleicht wird sogar das die Schleife nicht beenden : adcStatus ist nicht als flüchtig deklariert, daher kann der Compiler das Bit nur einmal überprüfen und dann in eine Endlosschleife eintreten. Aber das ist NICHT dein Problem. Ihr Problem ist (wie Dave sagte!), dass Sie den Statuswert INSIDE THE LOOP erneut lesen müssen.