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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 7 cze 2025, o 04:29


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
    Autor Wiadomość
    PostNapisane: 28 maja 2017, o 23:07 
    Offline
    Użytkownik

    Dołączył(a): 01 sty 2015
    Posty: 31
    Pomógł: 0

    Szukam kogoś kto odpowie mi na pytania odnośnie kodów podobnych do tego który wstawiam. Generalnie chodzi o opisanie jak działają timery na podstawie prostych i krótkich programów.

    Zainteresowanych proszę o wiadomość na PW.

    Kod:

    void main(void){
       
       clock_config();
       
       GLCD_Initialize();  //GLCD to wyswietlacz
       
       
      RCC->AHB1ENR |= ((1<<0) | (1<<6));             // wlacz zegar dla GPIO A i G
       
       //TIMER krok 1.
       
       RCC->APB1ENR |= (1<<0);                              // wlacz zegar dla TIM2
       
       
      GPIOG->MODER |= (1<<(2*13)) | (1<<(2*14));  // linie G13 i G14 jako wyjscia
       GPIOA->MODER |= (2<<2*0);                              // linia A0 - ALTERNATE FUNCTION AF1 TIM2 CH1
       GPIOA->AFR[0] |= (1<<4*0);
          
          
          //Adding an interrupt involves configuring the NVIC (Nested Vectored Interrupt Controller).
          //different flags are used to trigger and clear an interrupt
          
       NVIC->ISER[0] |= ((1<<28));                         // wlacz przerwanie dla TIM2 //enable interrupts
       
       //zlicza do góry od 0 do wpisanej wartosci dlatego jest 7999 a nie 8000
       //prescaler - dzelnik zegara wejsciowego
       
       // 16-bitowy rejestr umozliwiajacy podzielenie czestotliwosci taktowania licznika przez wartosc od 1 do 65536

       
       TIM2->PSC   = 7999;                                          // preskaler TIM2 = wpisana wartosc+1
       //TIM2->ARR = 65535;                                    // wykorzystaj pelna pojemnosc licznika /// moze zliczac w takim zakresie
       
       TIM2->CCMR1 |= 1;                                        // CC1S = 01 - Capture Compare ch. 1 jako wejscie, linia T1
       
       TIM2->SMCR |= 5<<4 | 4;                                 // bity SMS=100 - Slave Reset Mode
                                                                         // bity TS =101 - Trigger Selection - Timer Input 1
                                                                         
       TIM2->CCER |= ((0<<3) | (0<<1) | (1<<0));      // reakcja na zbocze rosnace                     
                                                                         // CC1E=1 - Capture Enabled, ch. 1   
                                                                         
       TIM2->DIER |= (1<<1);                                    // CC1IE - wlacz przerwanie dla Capture ch. 1
      TIM2->CR1 |= 1;                                             // wlacz licznik



    //cos do wyswietlacza
       GLCD_Clear(White);
       GLCD_SetBackColor(White);
      GLCD_SetTextColor(Black);
    // ==   
       

       licznik=0;
       pomiar=0;
       
       for(;;) {
             if (pomiar) GLCD_DisplayString(1, 0, __FI,"Pomiar!             ");
             else {
                sprintf(tekst,"Licznik :D = %u",licznik);
                GLCD_DisplayString(1, 0, __FI,tekst);
             }
       }
    }
     
    //obsluga przerwania
    void TIM2_IRQHandler(void)
    {
          licznik=TIM2->CCR1;
          GPIOG->ODR ^=(1<<13);                              //rejestr danych wychodzacych
          TIM2->CCER ^=  (1<<1);                           //zmien reakcje na zbocze rosnace<->opadajace
          pomiar = ~pomiar;      
    }

    void clock_config(void)
    {
       //wybor oscylatora
       RCC->CR &= ~(1<<0); //HSI OFF
       RCC->CR |=  (1<<16); //HSE ON
       while (!(RCC->CR & 1<<17)); //czekaj az sie HSE ustabilizuje
       
       //konfiguracja PLL: fout = (fin/M)*(N/P)
       RCC->PLLCFGR &= 0xF0BC0000; //zostaw tylko bity reserved, reszta 0
       RCC->PLLCFGR |= 8;       //M (2-63)
       RCC->PLLCFGR |= 256<<6;   //N   (192-432) Mhz
       RCC->PLLCFGR |= 0<<16; //P 0=/2 1=/4 2=/6 3=/8 //indeks ktory odpowiada dzielnikowi
       //RCC->PLLCFGR |= 2<<24; //Q (2-15) USB SDIO random number generator
       RCC->PLLCFGR |= 1<<22; //wejscie PLL 1=HSE, 0=HSI
       
       RCC->CR |= 1<<24; // 1 - PLL ON, 0 - PLL OFF
       while   (!(RCC->CR & 1<<25)); //czekaj az PLL sie zatrzasine
       
       RCC->CFGR |= 2;  //0 - HSI, 1 - HSE, 2 - PLL jako SYSCLK
       RCC->CFGR   |= 8<<4;   //AHB PRESCALER 8 - /2, 9 - /4 ,10 - /8 ...
       RCC->CFGR   |= 7<<10;   //APB1 PRESCALER LOW SPEED 4 - /2, 5- /4, 6 - /8, 7 - /16
       RCC->CFGR   |= 0<<13;   //APB2 PRESCALER HI SPEED   

    }




    Ostatnio edytowano 29 maja 2017, o 16:54 przez RideorDie, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 maja 2017, o 06:43 
    Offline
    Użytkownik

    Dołączył(a): 24 sty 2012
    Posty: 1469
    Pomógł: 56

    Ale dlaczego assembler?
    Wydaje mi się, że to assembler nie jest...

    _________________
    Jestem początkujący i moje porady mogą być błędne



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 maja 2017, o 08:20 
    Offline
    Użytkownik

    Dołączył(a): 24 lip 2013
    Posty: 60
    Lokalizacja: Okolice Gliwic
    Pomógł: 3

    No tak, to wygląda na C. Może autor chce, by ktoś mu napisał odpowiadający kod w asm?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 maja 2017, o 16:53 
    Offline
    Użytkownik

    Dołączył(a): 01 sty 2015
    Posty: 31
    Pomógł: 0

    Sory już mi się myli, bo mam część kodów na zajęciach w Assemblerze a część w C. Ten jest w C.

    Nie chcę żeby ktoś mi cokolwiek pisał, proszę tylko o wytłumaczenie kodu. Jak ktoś to ogarnia to proszę o kontakt. Dzięki



    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: 4 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

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


    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:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO