Ovo je minimalistička varijanta sa malim PIC 8-PIN MCU, to sve radi što treba, ima 5 LED i 1 taster i ulaze/izlaze.
Imaju GPS moduli koji na sebi imaju TCXO, malkice su skuplji tako da uz ovakav jedan PIC taj brojac bi radio sa TCXO kada je nesinhronizovan i preko GPS kada jeste.
Minimalno sve, kao NE555 da smo stavili a zavrsili smo kompletnu logiku.
Imam te PIC-ove zato sam njega izabrao, GPT napravi ceo prgram, samu se kaže "Rekao nam Miki da napišeš progam po ovoj tablici za Borin frekvencmetar sa GPS"
Detalji po funkcionalnosti:
Imaju GPS moduli koji na sebi imaju TCXO, malkice su skuplji tako da uz ovakav jedan PIC taj brojac bi radio sa TCXO kada je nesinhronizovan i preko GPS kada jeste.
Minimalno sve, kao NE555 da smo stavili a zavrsili smo kompletnu logiku.
Imam te PIC-ove zato sam njega izabrao, GPT napravi ceo prgram, samu se kaže "Rekao nam Miki da napišeš progam po ovoj tablici za Borin frekvencmetar sa GPS"
Detalji po funkcionalnosti:
- Ulaz frekvencije (RA5):
- Kada je ulazna frekvencija 10 kHz, sistem prepoznaje da je GPS sinhronizovan (locked).
- Kada je ulazna frekvencija 20 kHz, sistem prepoznaje da je GPS nesinhronizovan (unlocked), ali i dalje funkcioniše normalno, generišući vremenske baze i signalizirajući nesinhronizovano stanje putem RA3.
- Kada je ulazna frekvencija 10 kHz, sistem prepoznaje da je GPS sinhronizovan (locked).
- Izlaz frekvencije (RA4):
- Sistem generiše sledeće frekvencije na osnovu izabrane vremenske baze:
- 5 kHz
- 500 Hz
- 50 Hz
- 5 Hz
- 5 kHz
- Sistem generiše sledeće frekvencije na osnovu izabrane vremenske baze:
- Sync LED (RA3):
- RA3 kontroliše Sync LED:
- Kada je GPS frekvencija 10 kHz (locked), LED svetli.
- Kada je frekvencija 20 kHz (unlocked), LED može blinkati ili svetliti drugačije kako bi signalizovala nesinhronizovano stanje.
- Kada je GPS frekvencija 10 kHz (locked), LED svetli.
- RA3 kontroliše Sync LED:
- Kontrola LED dioda (RA1 i RA2):
- RA2 kontroliše dve LED diode koje prikazuju stanja za vremenske baze 0.1 s (10 Hz) i 1 s (1 Hz).
- RA1 kontroliše preostale dve LED diode koje prikazuju stanja za vremenske baze 10 s (0.1 Hz) i 100 s(0.01 Hz).
- RA2 kontroliše dve LED diode koje prikazuju stanja za vremenske baze 0.1 s (10 Hz) i 1 s (1 Hz).
- Taster za promenu baze (RA0):
- Ovaj pin se koristi za jedan taster kojim ciklično menjaš između vremenskih baza.
- Pritiskom na taster menja se baza, a odgovarajuće LED diode na RA1 i RA2 prikazuju trenutno stanje.
- Ovaj pin se koristi za jedan taster kojim ciklično menjaš između vremenskih baza.
Code:
#include <xc.h>
// Konfiguracija fjuza
#pragma config FOSC = INTOSC // Interni oscilator
#pragma config WDTE = OFF // Watchdog Timer Off
#pragma config PWRTE = OFF // Power-up Timer Disable
#pragma config MCLRE = ON // Master Clear Enable
#pragma config CP = OFF // Code Protection Off
#pragma config BOREN = OFF // Brown-out Reset Disable
#pragma config CLKOUTEN = OFF // CLKOUT Function Disable
#pragma config WRT = OFF // Flash Memory Self-Write Protection Off
#pragma config PLLEN = OFF // PLL Disable
#pragma config STVREN = OFF // Stack Overflow/Underflow Reset Disable
// Definicija frekvencija i baze
#define BASE_5KHZ 0
#define BASE_500HZ 1
#define BASE_50HZ 2
#define BASE_5HZ 3
unsigned char current_base = BASE_5KHZ; // Trenutna baza (default 5kHz)
// Funkcija za inicijalizaciju tajmera i ulaznih/izlaznih pinova
void init_pic() {
// Interni oscilator na 4MHz
OSCCON = 0x6A;
// Konfiguracija I/O pinova
TRISA = 0xFF; // RA5 kao ulaz (GPS frekvencija), RA4 kao izlaz frekvencije, RA3 kao izlaz za Sync LED
ANSELA = 0x00; // Digitalni režim za sve pinove
// Postavljanje izlaznih pinova za LED diode i frekvenciju
TRISA0 = 1; // RA0 kao ulaz za taster
TRISA1 = 0; // RA1 kao izlaz za dve LED diode (1s i 10s)
TRISA2 = 0; // RA2 kao izlaz za dve LED diode (0.1s i 100s)
TRISA3 = 0; // RA3 kao izlaz za Sync LED
TRISA4 = 0; // RA4 kao izlaz za frekvenciju
TRISA5 = 1; // RA5 kao ulaz za GPS
// Timer1 konfiguracija za deljenje frekvencije
T1CON = 0x31; // 16-bitni tajmer, predelilac 1:8
TMR1 = 0; // Resetovanje Timer1
// Konfiguracija Timer2 za generisanje PWM (ukoliko je potrebno)
T2CON = 0x04; // Postavljanje predelilaca i uključenje tajmera
PR2 = 249; // Postavljanje vrednosti za postizanje željene frekvencije
// Interrupt za taster
OPTION_REGbits.nWPUEN = 0; // Dozvoli weak pull-up
WPUAbits.WPUA0 = 1; // Pull-up za taster na RA0
INTCONbits.INTF = 0; // Resetovanje interapt flaga
INTCONbits.INTE = 1; // Dozvoli eksterni interrupt
INTCONbits.GIE = 1; // Dozvoli globalne prekide
}
// Funkcija za promenu vremenske baze
void change_base() {
// Promena baze u ciklusima
current_base++;
if (current_base > BASE_5HZ) {
current_base = BASE_5KHZ;
}
}
// Funkcija za generisanje izlazne frekvencije na RA4
void set_frequency_output() {
switch (current_base) {
case BASE_5KHZ:
// Postavi Timer1 za generisanje 5kHz na RA4
T1CONbits.TMR1ON = 1; // Uključi Timer1
LATAbits.LATA4 = 1;
__delay_ms(1); // Kratak impuls
LATAbits.LATA4 = 0;
break;
case BASE_500HZ:
// Postavi Timer1 za 500Hz
T1CONbits.TMR1ON = 1;
LATAbits.LATA4 = 1;
__delay_ms(10);
LATAbits.LATA4 = 0;
break;
case BASE_50HZ:
// Postavi Timer1 za 50Hz
T1CONbits.TMR1ON = 1;
LATAbits.LATA4 = 1;
__delay_ms(100);
LATAbits.LATA4 = 0;
break;
case BASE_5HZ:
// Postavi Timer1 za 5Hz
T1CONbits.TMR1ON = 1;
LATAbits.LATA4 = 1;
__delay_ms(1000);
LATAbits.LATA4 = 0;
break;
}
}
// Funkcija za detekciju GPS frekvencije i kontrolu Sync LED-a
void check_gps_signal() {
// Prebrojavanje impulsa na RA5 (10kHz ili 20kHz)
if (PORTAbits.RA5 == 1) {
// GPS frekvencija je prisutna
LATAbits.LATA3 = 1; // Upali Sync LED
} else {
LATAbits.LATA3 = 0; // Ugasi Sync LED
}
}
// Funkcija za kontrolu LED-ova vremenske baze
void update_leds() {
// Kontrola LED-a na RA1 i RA2 na osnovu trenutne baze
switch (current_base) {
case BASE_5KHZ:
LATAbits.LATA2 = 1; // LED za 0.1s
LATAbits.LATA1 = 0;
break;
case BASE_500HZ:
LATAbits.LATA2 = 0;
LATAbits.LATA1 = 1; // LED za 1s
break;
case BASE_50HZ:
LATAbits.LATA1 = 1; // LED za 10s
LATAbits.LATA2 = 0;
break;
case BASE_5HZ:
LATAbits.LATA1 = 1; // LED za 100s
LATAbits.LATA2 = 1;
break;
}
}
// Prekidna rutina za eksterni interrupt (taster)
void __interrupt() ISR() {
if (INTCONbits.INTF) {
// Detekcija pritiska tastera
change_base(); // Promeni vremensku bazu
INTCONbits.INTF = 0; // Resetovanje interapt flaga
}
}
void main() {
init_pic(); // Inicijalizacija mikrokontrolera
while (1) {
check_gps_signal(); // Detekcija GPS signala
set_frequency_output(); // Generisanje izlazne frekvencije
update_leds(); // Ažuriranje stanja LED-ova
}
}