Portál AbcLinuxu, 14. května 2025 00:36

Dotaz: Chyba v programu v C (avr)

4.5.2010 16:37 mega8
Chyba v programu v C (avr)
Přečteno: 314×
Odpovědět | Admin
Zdravím. Snažil jsem se naprogramovat do procesoru mega8 procedury na blikání led diod, ale nějak si to občas dělá co chce. Konkrétně třeba bliknou led diody, které by v tu chvíli vůbec neměly.

uint8_t leds_array[LEDS];
uint8_t leds_array_pointer = 0;

void leds_add(uint8_t lid) {
        leds_array[leds_array_pointer] = lid;
        if( leds_array_pointer < (LEDS-1) ) leds_array_pointer ++;
}

void leds_clear() {
        leds_array_pointer = 0;
}

void leds_blink(uint8_t interval) {
        bool leds_status_before[LEDS];
        if(leds_array_pointer > 0) {
                for(int i=0; i<=leds_array_pointer; i++) {
                        if(bit_is_set(LED_PIN, leds_array[i]))
                                leds_status_before[i] = true;
                        else
                                leds_status_before[i] = false;
                        bitSet (LED_PORT, leds_array[i]);
                }
                m_delay_ms(interval);
                for(int i=0; i<=leds_array_pointer; i++) {
                        bitClear (LED_PORT, leds_array[i]);
                }
                m_delay_ms(interval);
                for(int i=0; i<=leds_array_pointer; i++) {
                        if(leds_status_before[i]) bitSet (LED_PORT, leds_array[i]);
                }
        leds_clear();
        }
}


v programu potom volám:

if(podmínka1) leds_add(LED_1);
if(podmínka2) leds_add(LED_2);
// teoreticky mohou bliknout jen led1 a led2, ale občas blikne i led3
leds_blink(LED_BLINK_INTERVAL);

Kde dělám chybu?

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

4.5.2010 17:28 Sten
Rozbalit Rozbalit vše Re: Chyba v programu v C (avr)
Odpovědět | | Sbalit | Link | Blokovat | Admin
Klasická chyba off-by-one.

for(int i=0; i<=leds_array_pointer; i++) {

má být

for(int i=0; i<leds_array_pointer; i++) {

Po nastavení dvou LEDek je leds_array_pointer == 2, ale ten první (původní) cyklus proběhne třikrát
4.5.2010 18:08 mega8
Rozbalit Rozbalit vše Re: Chyba v programu v C (avr)
díky za pomoc
5.5.2010 15:44 Farin
Rozbalit Rozbalit vše Re: Chyba v programu v C (avr)
leds_array_pointer - dost zavadejici nazev promenne; vystiznejsi je asi leds_array_index || leds_array_ix

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.