/* * File: swieczka.c * Author: srodaelektronika.pl * * Created on 23-10-2025 */ // Bity konfiguracyjne // CONFIG1 #pragma config FOSC = INTOSC // (INTOSC oscillator; I/O function on CLKIN pin) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled) #pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR) #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled) #pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset disabled) #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin) // CONFIG2 #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) #pragma config PLLEN = OFF // PLL Enable (4x PLL disabled) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset) #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) #pragma config LPBOREN = OFF // Low Power Brown-out Reset enable bit (LPBOR is disabled) #pragma config DEBUG = OFF // In-Circuit Debugger Mode (In-Circuit Debugger disabled, ICSPCLK and ICSPDAT are general purpose I/O pins) #pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming) #define _XTAL_FREQ 4000000 // Ustawiamy wewnętrzny oscylator na 4 MHz #include #include // Potrzebne do generowania liczb losowych (funkcja rand()) // NOWA FUNKCJA do obsługi zmiennego czasu opóĽnienia void delay_ms_zmienna(unsigned int milliseconds) { while (milliseconds > 0) { __delay_ms(1); milliseconds--; } } void main(void) { // KROK 1: Konfiguracja oscylatora OSCCONbits.IRCF = 0b1101; // Wewnętrzny oscylator 4 MHz FOSC // Ustaw piny jako cyfrowe ANSELA = 0; // KROK 2: Konfiguracja pinu RA2 TRISAbits.TRISA2 = 0; // Ustawienie pinu RA2 jako wyjście // Konfiguracja zegara PWM3 PWM3CLKCONbits.CS = 0b00; // Zegar z FOSC PWM3CLKCONbits.PS = 0b100; // Prescaler 1:16 // Ustawienie okresu PWM (dla Fosc=4MHz i preskalera 1:16, wartość 250 daje f ~ 1kHz) PWM3PRH = 250 >> 8; // 00000011 PWM3PRL = 250 & 0xFF; // 10000100 // Początkowe ustawienie wypełnienia (Duty Cycle) PWM3DCH = 0; // Dioda zgaszona na starcie PWM3DCL = 0; // Ustawienie fazy i offsetu na 0 PWM3PHH = 0; PWM3PHL = 0; PWM3OFH = 0; PWM3OFL = 0; // Aktywowanie PWM3 PWM3CONbits.PWM3POL = 0; // Aktywny stan wyjścia: wypełnienie stan wysoki PWM3CONbits.PWM3MODE = 0; // Tryb standardowy PWM // Włączenie modułu PWM3 PWM3CONbits.PWM3OE = 1; // Włącz wyjście PWM3 na pin PWM3CONbits.PWM3EN = 1; // Włącz moduł PWM3 // Zmienna do przechowywania wartości wypełnienia unsigned int duty_cycle_value; // while (1) { // // PWM3DCH = (30 >> 8); // PWM3DCL = (30 & 0xFF); // PWM3LDCONbits.LDA = 1; // Załaduj nowe wartości do aktywnych rejestrów // __delay_ms(1500); // // PWM3DCH = (200 >> 8); // PWM3DCL = (200 & 0xFF); // PWM3LDCONbits.LDA = 1; // Załaduj nowe wartości do aktywnych rejestrów // __delay_ms(1500); // } // --- PĘTLA GŁÓWNA: SYMULACJA PŁOMIENIA ¦WIECZKI --- while (1) { // 1. Ustaw główną jasność płomienia z niewielką, losową zmiennością. // Dodano rzutowanie (unsigned int) aby pozbyć się ostrzeżenia. duty_cycle_value = (unsigned int)(150 + (rand() % 100)); // 2. Z niewielkim prawdopodobieństwem (tutaj 15%) gwałtownie przygaś płomień. if ((rand() % 100) < 15) { // POPRAWKA: Dodano rzutowanie (unsigned int). duty_cycle_value = (unsigned int)(rand() % 100); } // 3. Zaktualizuj rejestry wypełnienia PWM PWM3DCH = (duty_cycle_value >> 8); PWM3DCL = (duty_cycle_value & 0xFF); PWM3LDCONbits.LDA = 1; // Załaduj nowe wartości do aktywnych rejestrów // 4. Odczekaj losowy, krótki czas. delay_ms_zmienna(20 + (rand() % 100)); } }