While-Befehl macht nicht, was ich möchte



  • Oder einfach

    while(PORTAbits.RA1);
    T0_RES();
    while(!PORTAbits.RA1);
    T0CON0bits.T0EN = 0;
    

    das ist zumindest die gängige Variante, schließlich wird die 0, der LOW Value, als falsch interpretiert und alles andere, eben auch der HIGH Value als wahr.

    Bzw. oft liest man auch den ganzen Port ein, dein Framework da scheint da wohl das ganze etwas aufzuhübschen ... da muss man nur auf Effizienz etwas achten, sobald man mehrere Pins einliest am selben Port.

    while(PORTA & (1 << RA1); // Solange RA1 HIGH
    while(!(PORTA & (1 << RA1)); //Solange RA1 LOW
    while(PORTA & (1 << RA1 | 1 << RA4 | 1 << RA5)); //Solange RA1, RA4, RA5 HIGH
    

    Oder so in der Art, abhängig davon was für einen Microcontroller du da hast.

    Wird PORTAbits.RA1 sowohl für Ausgang als auch Eingang genommen? Zumindest bei avr microcontrollern, kann man mit PORTX nur Ausgänge setzen, während man mit PINX Eingänge einliesr.

    Weiterführende Frage: IST RA1 ein digitaler Eingang? Könnte es ggf. auch ein analoger Eingang sein, sodass du Werte zwischen 0 und 1024 oder so bekommst?



  • Hallo Bashar,
    vielen Dank für Deine Hilfe!
    Ich verwende den PIC16F18313 und programmiere ihn mit dem MPLAB über PICKit von Microchip. Ich versuche, den Temperaturfühler TSIC151 auszulesen. Es zeigte sich, dass PicKid den Ausgang des TSIC so stark beeinflusst, dass das Signal undefiniert wird. Insoweit hattest Du mit Deiner Annahme Recht, dass der PIC-Eingang nicht in den notwendigen Zustand gelangen kann. Ich habe die Schaltung geändert und jetzt funktioniert die Software (dank Deiner Hilfe), worüber ich mich als Anfänger sehr freue. Es ist mein erstes C-Programm!

    Wie das immer so ist, stößt man als Anfänger ständig auf neue Probleme.
    Jetzt grübele ich, wie ich zwei 8- Bit Werte zu einer 16 Bit Zahl machen kann.
    Beispiel:
    8-Bit-Wert 1 : 0x02 (das ist das High-Nibbel der 16 Bit Zahl)
    8-Bit-Wert 2 Low: 0xEB(das ist das Low-Nibbel der 16 Bit Zahl)
    Da ich damit rechnen muss, benötige ich hieraus die folgende 16 Bit-Zahl: 0x02EB.
    Vermutlich muss ich 0x02 mit 256 multiplizieren und dann 0xEB addieren.
    Habe ich aber noch nicht ausprobiert.



  • @Leon0402
    vielen Dank für Deine Erläuterungen!
    Ich verwende den PIC16F18313 und programmiere ihn mit dem MPLAB über PICKit von Microchip. Ich versuche, den Temperaturfühler TSIC151 auszulesen. Es zeigte sich, dass PicKit den Ausgang des TSIC so stark beeinflusst, dass das Signal undefiniert wird. Nach Änderungen der Schaltung funktioniert die Software zu meiner Überraschung. Es ist mein allererstes C-Programm!

    Stimmt es, dass

    while(PORTAbits.RA1);
    dasselbe ist, wie
    while(PORTAbits.RA1 == 1);```
    ```cpp
    
    

    Ich finde die erste Schreibweise eher undurchsichtig und es verwirrt mich, wenn ich lese, wieviel abgekürzte Schreibweisen es bei C gibt.



  • @buschi sagte in While-Befehl macht nicht, was ich möchte:

    8-Bit-Wert 1 : 0x02 (das ist das High-Nibbel der 16 Bit Zahl)
    8-Bit-Wert 2 Low: 0xEB(das ist das Low-Nibbel der 16 Bit Zahl)

    Nibble sind nur 4 Bit (also eine Hex-Ziffer)

    Dein Problem wird mit binären Operatoren (& l << >>) gelöst.

    wert = (0x02 << 8) & 0xEB

    Das kannst du so schreiben. Der Compiler kann das optimieren.
    Du musst aber etwas bei unsigned Typen aufpassen.



  • @buschi sagte in While-Befehl macht nicht, was ich möchte:

    Stimmt es, dass
    while(PORTAbits.RA1);
    dasselbe ist, wie
    while(PORTAbits.RA1 == 1);

    Nein.
    Es ist dasselbe wie
    while(PORTAbits.RA1 != 0);

    Jeder Wert ungleich 0 gilt als wahr.

    Allerdings hängt das auch davon ab, welche Werte PORTAbits.RA1 annehmen kann. Wenn es nur 0 und 1 sind, stimmt deine Aussage.



  • Vielen Dank!
    Ich dachte, man kann den Begriff "Nibbel" bei einer 16-Bit-Zahl für das High-Byte bzw. Low-Byte verwenden. Wie heissen diese Teile in der Fachsprache richtig?
    Vielen Dank für die einfache Lösung. Ich werde es morgen ausprobieren.
    Allerdings weiss ich als Anfänger leider nicht, worauf man bei unsigned Typen hier aufpassen muss.



  • @DirkB
    Ja, das ist nur ein Port-Pin, der nur 0 oder 1 sein kann.



  • @buschi sagte in While-Befehl macht nicht, was ich möchte:

    Ich dachte, man kann den Begriff "Nibbel" bei einer 16-Bit-Zahl für das High-Byte bzw. Low-Byte verwenden. Wie heissen diese Teile in der Fachsprache richtig?

    High-Byte und Low-Byte.
    Manchmal wird auch (fälschlicherweise) MSB und LSB (Most bzw. Least Significant Byte) obwohl das für Bits steht.

    Vielen Dank für die einfache Lösung. Ich werde es morgen ausprobieren.
    Allerdings weiss ich als Anfänger leider nicht, worauf man bei unsigned Typen hier aufpassen muss.

    Die Werte sind ja nicht fix (sonst würdest du 0x02eb schreiben) sondern sind in Variablen.

    Wenn 0xEB in einer 8-Bit Variablen mit Vorzeichen gespeichert ist, ist der Wert negativ und bei der Erweiterung zu int gibt das 0xFFEB.

    wert = ((HighByte & 0xff) << 😎 & (LowByte & 0xff)



  • @buschi sagte in While-Befehl macht nicht, was ich möchte:

    Ja, das ist nur ein Port-Pin, der nur 0 oder 1 sein kann.

    Auf anderen Mikrocontrollern kann aber auch der Wert des Bits zurück kommen (bei PA1 0 und 2)



  • @buschi sagte in While-Befehl macht nicht, was ich möchte:

    Ich finde die erste Schreibweise eher undurchsichtig und es verwirrt mich, wenn ich lese, wieviel abgekürzte Schreibweisen es bei C gibt.

    Das legt sich ganz schnell und das ist wirklich einer der Dinge, die deinen Code aus meiner Sicht wesentlich lesbarer machen.
    Du muss dir das ein bisschen wie einen bool vorstellen in C++, eine Variable vom typ bool kann nur den Wert true oder false annehmen (1 oder 0) . Also im Prinzip wie deine digitalen Pins.

    bool bitHigh = true;
    while(bitHigh == true);
    

    Das ist irgendwie einfach doppelt ^^ Und grade wenn die Bedingungen etwas komplexer werden, wird es lesbarer, wenn du es weg lässt.


Log in to reply