Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 22 lip 2026, o 07:04


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 2 ] 
Autor Wiadomość
PostNapisane: 27 gru 2016, o 15:38 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 06 paź 2016
Posty: 22
Pomógł: 0

Cześć, wróciłem do ćwiczeń z diodami i chciałem zrobić efekt "Night Rider", zapalam kolejno diody od 0 do 7 a potem gaszę od 7 do 0.
Mam pewien, prawdopodobnie, trywialny problem.

Przy gaszeniu diod, gaszę je jedynie do diody d1, d0 w dalszym ciągu się świeci.

Teoretycznie użycie "i>=0" powinno załatwić sprawę, ALE...wtedy całość operacji wykonuje się tylko 1 raz(nie wracam do początku pętli while).
Pomyślałem również o zmianie warunku rzeczonej pętli na i>-1, skutek był podobny.

Poniżej zamieszczam kod:
Kod:
#include <avr/io.h>
#include <util/delay.h>

#define LED (1<<PC0)
#define LED_ON PORTC &= ~LED
#define LED_OFF PORTC |= LED
#define LED_TOG PORTC ^= LED


int main(void){
   DDRC |= 0xff;
   PORTC = 0xff; // wygaszenie diod
   
   while(1)
   {
      // Night Rider Effect
      for(uint8_t i=0; i<8 ; i++ ) {
         
         PORTC &= ~(1<<i);
         _delay_ms(5000);
                  
      }      
      for(uint8_t i=7;i>0;i--){ // kiedy i>=0 to nie wracam na początek whila, podobnie jak i>-1
         
         PORTC |= (1<<i);
         _delay_ms(5000);
         
      }
      
            
      // obsługa klawisza (przeciwko drganiom  stykow)
      if (!key_lock && !(PINA & KEY)) {
         key_lock = 1;
         
         //piszemy zdazenie "press_button"
         //LED_TOG; // zmiana aktualnego stanu LED
         //BUZ_TOG; // zmiana aktualnego stanu BUZ
         
      }else if (key_lock && (PINA & KEY)) key_lock++;
         
   }
   return 0;
}



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2016, o 16:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

A jaką wartość ma zmienna i w tej drugiej pętli? Przecież zadeklarowałeś ją jako uint8_t czyli bez znaku, przyjmuje ona wartości od 0 do 255.
W twoim kodzie zmienna i najpierw przyjmuje wartość 7, następnie 6 itd.
Gdy na samym końcu pętli for przyjmie wartość 0 i dalej ją dekremantujesz to zmienna i będzie miała wartość 255, następnie 254 itd.
A warunkiem w pętli for jest dalej i>=0, czyli jest dalej spełniony prawda?
Jeśli chcesz tak zapisać to zmienna i musi być zadeklarowana jako int8_t. Ewentualnie możesz zrobić w dugą stronę, tzn przesuwać tym razem w lewo, zobacz w kodzie poniżej. ;)

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 2 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO