Problem mit if-Abfrage

Pielo

Mitglied
Hallo,

ich werde jetzt sicher mit einem Problem kommen bei denen die meisten sich fragen werden, warum macht er sowas wenn er es nicht kann. Die Antwort ist, weil ich es mir in Kopf gesetzt habe das Problem irgendwie zu lösen und ich dachte ich bekomme das so hin.

Also, ich habe mir eine LED-Matrix (16x14 LED's) zusammen gebaut, dazu noch ein wenig Elektronik und das Ganze ergibt dann eine SOLCHE Uhr. Jetzt wollte ich das zu bestimmten Zeiten mehrmals ein Text durch läuft.


Mein erster versuch war folgender Code:

Code:
        .
        . 
        . 
        .

	// since time is kept in 24 hours format inside of DS323X IC, and we can show only 12 hours, we must reduce it to 12 hr mode
	uint8_t time_h = RTC[TIME_H];
	uint8_t time_m = RTC[TIME_M];

       //HIER IST DAS PROBLEMKIND

        if (time_h == 8 && time_m >= 30 && time_m <= 45) text_scroll("&&&&Pause",80,1);

        else

	if( time_h == 0 ) time_h = 12;
	if( time_h > 12 ) time_h = time_h - 12;

	// fetch the appropriate arrays from PGM space into RAM
	char hour_arr[32];
	memcpy_P(hour_arr, (PGM_P)pgm_read_word( &MAX_h[time_h-1] ), 32);
	char minute_arr[32];
	memcpy_P(minute_arr, (PGM_P)pgm_read_word( &MAX_m[time_m] ), 32);

       .
       .
       .
       .

}

hier ist aber immer nach dem der Text durchgelaufen ist ganz kurz die Uhrzeit aufgeleuchtet (quasi das Programm ganz schnell durchgelaufen) dann wieder der Text ganz normal und wieder die Uhrzeit und so weiter...

Darauf hin hab ich folgendes probiert:

Code:
      //HIER IST DAS PROBLEMKIND

     Pause:
        if (time_h == 8 && time_m >= 30 && time_m <= 45) text_scroll("&&&&Pause",80,1);
       
        if (time_h == 8 && time_m >= 30 && time_m <= 45) goto Pause;

        else
      .
      .
      .
      .

Hier bleibt die Uhr aber in der Schleife hängen.

Wie kann ich das Problem umgehen?

Danke schon mal im vorraus.

***lg Pielo***
 
Hallo,

in der ersten Version bin ich mir nicht sicher, ob die if-else Abfrage genauso aussieht wie du dir das vorstellst. Da du keine Klammern gesetzt hast müsste in der else Abfrage nur das erste "if" ausgewertet werden und das 2te wird immer ausgewertet, wobei ich das Gefühl habe, dass beide "if" Klauseln immer ausgewertet werden sollen.

Bei der 2ten Version würde ich sagen, bleibt er 15 Minuten lang in der Pause-Schleife. Zwischen 8:30 und 8:45 sollte die 2te Abfrage immer erfüllt sein und er springt immer zur Sprungmarke "Pause:"

Gruß,
Wolf
 
Hallo,

in der ersten Version bin ich mir nicht sicher, ob die if-else Abfrage genauso aussieht wie du dir das vorstellst. Da du keine Klammern gesetzt hast müsste in der else Abfrage nur das erste "if" ausgewertet werden und das 2te wird immer ausgewertet, wobei ich das Gefühl habe, dass beide "if" Klauseln immer ausgewertet werden sollen.

Upps stimmt, da hab ich hier die Klammer(n) vergessen. Habe sie im Programm meiner Uhr aber gesetzt.


Bei der 2ten Version würde ich sagen, bleibt er 15 Minuten lang in der Pause-Schleife. Zwischen 8:30 und 8:45 sollte die 2te Abfrage immer erfüllt sein und er springt immer zur Sprungmarke "Pause:"

Ja das stimmt (fast), irgendwie bleibt das Prog aber in der Schleife hängen :(
 
Ja das stimmt (fast), irgendwie bleibt das Prog aber in der Schleife hängen :(
Ja, natürlich. Die Werte für time_h und time_m ändern sich ja auch niemals wieder.

Und goto ist meistens häßlich.

C:
while (true) {
  ... // get current time

  if (time_h == 8 && ...) {
    // Pause
  } else {
    // normale Zeitanzeige
  }
}
 
Tagchen, ich noch mal.

Ich habe jetzt rumprobiert und probiert, nur leider komme ich nicht auf ein brauchbaren Nenner.

Das der die Zeit in der Schleife nicht noch mal überprüft war ein guter Einwurf, hab ich garnicht bedacht. Leider schaff ich es einfach nicht, den in der Schleife nochmals aufzufordern die Zeit zu überprüfen.

Die Zeit wird in diesem Abschnitt ausgelesen

C:
//##########################
// Interrupt: PCINT2_vect //
//##########################
// called on PCINT2_vect - pin change interrupt
ISR(PCINT2_vect, ISR_NOBLOCK) // this interrupt routine can be interrupted by any other
{
    // we will get here on every 1Hz signal transition (high->low, and low->high) since it is interrupt on change
    // and also on button/sensor B press/release!

    // if we are not paused and if this was low->high transition, do it
    if( !bv(bRTC_Pause,BAPP1) && (SQW32KHZ_PINREG & _BV(SQW32KHZ_PIN)) )
    {
        // read time from DS323X RTC IC
        twi_start(DS323X_ADDR_WR);
        twi_tx_byte(0x00);                         // address the beginning
        twi_start(DS323X_ADDR_RD);                 // now we are going to read from it
        // time
        uint8_t temp_secs = twi_rx_ack();
        uint8_t temp_mins = twi_rx_ack();
        uint8_t temp_hours = twi_rx_ack();
        // skip this one
        //uint8_t dow = twi_rx_ack();             // dummy read Day Of Week
        twi_rx_ack();             // dummy read Day Of Week
        // date
        uint8_t temp_day = twi_rx_ack();
        uint8_t temp_month = twi_rx_ack();
        uint8_t temp_year = twi_rx_nack();
        twi_stop();

        // lets read the temperature also
        twi_start(DS323X_ADDR_WR);
        twi_tx_byte(0x11);                                // address the upper temperature byte
        twi_start(DS323X_ADDR_RD);
        uint8_t temp_tMSB = twi_rx_ack();                 // read the temperature
        uint8_t temp_tLSB = twi_rx_nack();                 // read 1/4 fraction
        twi_stop();

        // here we will check if seconds, minutes, hours,... changed, this will alert the main "while" to send display_matrix[] to MAXes. this prevents the main "while" to overwhelm the MAXes with data constantly
        if( RTC[TIME_S] != BCDTODEC(temp_secs))
        {
            bs(bRTC_SecChg,BAPP1); // set it here, and it will be cleared withing the function that actually sends the display_matrix[] to MAXes - it will probably be the display_seconds() function
        }
        if( RTC[TIME_M] != BCDTODEC(temp_mins))
        {
            bs(bRTC_MinChg,BAPP1); // set it here, and it will be cleared withing the function that actually sends the display_matrix[] to MAXes - it will probably be the display_time() function
        }
        if( (RTC[TEMP_LSB] != BCDTODEC(temp_tLSB)) || (RTC[TEMP_MSB] != BCDTODEC(temp_tMSB)) )
        {
            bs(bRTC_TempChg,BAPP1);
        }

        // convert from BCD to normal
        // time
        RTC[TIME_S] = BCDTODEC(temp_secs);
        RTC[TIME_M] = BCDTODEC(temp_mins);
        RTC[TIME_H] = BCDTODEC(temp_hours);        // NOTE: it is always 24hr format inside the DS323X RTC IC, so we can do this without additional checks
        // date
        RTC[DATE_D] = BCDTODEC(temp_day);
        RTC[DATE_M] = BCDTODEC((temp_month & 0b01111111)); // clear the possible Century bit and convert
        RTC[DATE_Y] = BCDTODEC(temp_year);

        // temperature also
        RTC[TEMP_LSB] = temp_tLSB;
        RTC[TEMP_MSB] = temp_tMSB;

        disp_duration_timer++;                                 // we need this counter for main()
    }

    // dots ON on every other second - by user preference, and if not in sleep
    if( !bv(bSleepMode,BAPP1) && bv(bBlinkDots,BUSR1) && (RTC[TIME_S] % 2) && !bv(bPauseDotsBlink,BSYS) )
    {
        dot_on( DOT_BL | DOT_BR | DOT_TL | DOT_TR );
    }
    else // turn off even if user didn't want them to blink
    {
        if( !bv(bPauseDotsBlink,BSYS) ) // don't touch the dots if locked
            dot_off( DOT_BL | DOT_BR | DOT_TL | DOT_TR );
    }

    // Note: there is no button debounce code required, since the buttons are actually the touch-sensors and they don't bounce

    // check to see if sensor B is active-high
    if( (BTNB_PINREG & _BV(BTNB_PIN)) )
    {
        // see if it wasn't pressed at all
        if( !(prev_btn & 0b00000010) )
        {
            prev_btn |= 0b00000010;                         // remember it was pressed
            btn_hold_timer[1] = BTN_HOLD_TMR;                 // load this counter for press/hold decision

            bc(bSleepMode,BAPP1);                            // wakeup on any key touch
        }
    }
    // button not pressed at this ISR event
    else
    {
        prev_btn &= ~0b00000010;
    }

    return;
}

Aber wie bring ich den jetzt dazu das in der while-Schleife abzufragen?

C:
uint8_t time_h = RTC[TIME_H];
uint8_t time_m = RTC[TIME_M];

while{
  ... // hier kommt die aktuelle Zeit rein, aber wie?
 
  if (time_h == 8 && time_m => 30 && time_m <= 45 ){
text_scroll("&&&&Pause",100,1)    // Text "Pause"
  } 

else {
    //Rest der Funktion
  }
}

P.S.: Der Code ich nicht von mir, ich habe ihn nur für meine Bedürfnisse angepasst. Nur stehe ich jetzt leider sehr auf dem Schlauch. SORRY für die evtl. dumme(n) Frage(n).
 
Die aktuelle Zeit steht also immer in RTC[TIME_H] bzw. RTC[TIME_M] drin.

Dann mußt du also nur die Werte in der Schleife auch immer neu daraus abfragen.
C:
while{
  uint8_t time_h = RTC[TIME_H];
  uint8_t time_m = RTC[TIME_M];
 
  if (time_h == 8 && time_m => 30 && time_m <= 45 ){
text_scroll("&&&&Pause",100,1)    // Text "Pause"
  } 
 
else {
    //Rest der Funktion
  }
}
 
DANKE für deine schnelle Anwort.

Genau das hatte ich auch schon probiert, nur leider kommt dann immer wieder 2 Fehler.

Code:
error: expencted '(' before '{' token          //Fehler zeigt auf die Zeile "while{"
error: 'time_h' undeclared (first use in this function)        // Fehler zeigt auf die Zeile " if (time_h == 8 && ..."


könntest du dir vorstellen woran das liegen könnte?
 
Du musst nach while natürlich auch eine Bedingung schreiben:

C++:
while (...)
{
}

Lg

ja, aber wenn ich es folgendermaßen probiere bleibt er immer in der Schleife hängen, da ich es einfach nicht hinbekomme in die Schleife noch eine Abfrage der aktuellen Uhrzeit einzubauen.

C:
  uint8_t time_h = RTC[TIME_H];
  uint8_t time_m = RTC[TIME_M];
 

while(time_h == 8 && time_m >= 30 && time_m <= 45 )

  {
  text_scroll("&&&&Pause",100,1)    // Text "Pause"
  }
 
Wie schon 3mal geschrieben, muss die Abfrage der Urzeit in die Schleife mit rein.

Wenn du die Schleifenbedingung von der Uhrzeit abhängig machen willst, muss die Abfrage der Uhrzeit auch vor der Schleife stattfinden.

Warum willst du denn jetzt das text_scroll direkt in die Schleife schreiben?

Irgendwie hab ich den Eindruck, du weißt überhaupt nicht was du da tust. Vielleicht solltest du mal den ganzen Quelltext posten.
 

Neue Beiträge

Zurück