0,0 → 1,315 |
//********************************************************************** |
// program pro rizeni TRXu - HLAVICKOVY SOUBOR |
//********************************************************************** |
// (c) OK1XGL 2005 |
|
|
#include <16F877.h> |
#device ADC=8; |
#fuses XT,NOWDT,NOPROTECT,BROWNOUT,NOLVP,NOCPD |
#use delay (clock=4000000,restart_wdt) |
|
|
// LCD display |
#define LCD_RS PIN_D2 /* rizeni registru LCD displeje */ |
#define LCD_E PIN_D3 /* enable LCD displeje */ |
#define LCD_DATA_LSB PIN_D4 /* pripojeni LSB bitu datoveho portu LCD displeje (celkem 4 bity vzestupne za sebou) */ |
#define LCD_LED1 PIN_B5 |
#define LCD_LED2 PIN_B4 |
|
#define LCD_CHAR_a_FILL "\x80\x80\x0E\x01\x0F\x1F\x0F\x80" /* male a s s vyplnenym briskem */ |
#define LCD_CHAR_b_FILL "\x10\x10\x16\x1F\x1F\x1F\x1E\x80" /* male b s vyplnenym briskem */ |
#define LCD_CHAR_9_FILL "\x0E\x1F\x1F\x0F\x01\x02\x0C\x80" /* 9 s vyplnenym briskem */ |
|
// smimac polohy - ladeni |
#define ENCODER_CLK PIN_B0 /* musi zde byt ,je od nej preruseni */ |
#define ENCODER_DIR PIN_B1 |
|
// tlacitka |
#define KEY_ATN_KEY PIN_C7 |
#define KEY_SPLIT_MNU PIN_C4 |
#define KEY_A_B PIN_C5 |
#define KEY_RIT_STEP PIN_C6 |
#define KEYPORT PORTC |
// masky pro jednotlive funkce na tlacitkach |
#define KEY_MASK 0b11110000 /* maska pouzitych tlacitek */ |
#define KEY_LONG 100 /* doba, po, ktere je povazuje stisk tlacitka za dlouhy v jednotkach zakladniho tiku */ |
|
#define KEY_RIT 0b01000000 /* funkce RIT/STEP */ |
#define KEY_SPLIT 0b00010000 /* funkce SPLIT/MNU */ |
#define KEY_CHNGVFO 0b00100000 /* prepni VFO/srovnej VFO */ |
#define KEY_ATTN 0b10000000 /* nastav utlum/rychlost elbugu */ |
|
|
// tlg. klic |
#define KEY_DASH PIN_B6 |
#define KEY_DOT PIN_B7 |
|
// ridici signaly TRXu |
#define RXTX PIN_B2 /* prepinac prijem vysilani 1= vysilani*/ |
#define KEYING PIN_B3 /* klicovaci signal */ |
#define MUTE PIN_C3 /* uzavira NF cestu pri vysilani */ |
#define TONE PIN_C2 /* generovani tonu odposlechu NEMENIT!!! PWM1 je jen zde */ |
#define PWR_CTRL PIN_C1 /* vystup PWM2 pro rizeni vystupniho vykonu PA NEMENIT !!!*/ |
|
|
// DDS signaly |
#define DDS_FSYNC PIN_D0 /* enable prenosu dat aktivni v log0 */ |
#define DDS_SCK PIN_D5 /* musi zde byt, hodiny sestupna hrana */ |
#define DDS_SDATA PIN_D4 /* musi zde byt, seriova data */ |
#define DDS_FSEL PIN_D1 /* prepnuti frekvencnich registru */ |
|
// rizeni attenuatoru |
#define ATN1 PIN_E0 |
#define ATN2 PIN_C0 |
#define ATNC PIN_E1 |
#define RELE_PULSE 10 /* delka prepinaciho pulzu pro rele v ms jednotkach */ |
|
|
// analogove vsupni signaly |
#define REF PIN_A1 |
#define FWD PIN_A0 |
#define MTR12V PIN_A2 |
#define SMTR PIN_A3 |
#define BAND PIN_A5 |
// cisla pouzitych kanalu |
#define REF_CH 0 |
#define FWD_CH 1 |
#define MTR12V_CH 2 |
#define SMTR_CH 3 |
#define BND_CH 4 |
|
|
// konstanty verze programu |
#define NAME "VERSION " |
#define VERSION " V1.6 " |
|
// konstanty timeru0 |
#define TICK_TIME 0xFFFF-(5000/128)+1 /* zakladni tik TMR0 bude 5ms */ |
#define UPDATE_TIME 10 /* doba, po ktere se muze updatovat kde co v jedntkach tick_time */ |
|
// konstanty timeru2 |
#define TONE_SET 0x4d /* konstanta urcujici kmitocet priposlechu, zde 800Hz */ |
|
// konstanty kmitoctu pro VFO |
#define CONVERT_CONST 5.36870912 /* 2^28/50000000 , tedy 2^28/kmitocet hodin DDS*/ |
#define FREQ_IF 4999600L /* kmitocet mezifrekvence v Hz */ |
#define SUB_IF_INDEX 3 /* index pasma, od ktereho se mezifrekvencni kmitocet odecita */ |
// zakladni nastaveni ridiciho registru DDS |
#define CTRL_FREQ0 0b0010000000000000 /* prepni se do freq0 */ |
#define CTRL_FREQ1 0b0010100000000000 /* prepni se do freq1 */ |
#define CTRL_RESET 0b0010000100000000 /* pozaduj reset */ |
#define CLR_PHASE0 0b1100000000000000 /* nuluj fazovy registr 0 */ |
#define CLR_PHASE1 0b1110000000000000 /* nuluj fazovy registr 1 */ |
|
#define ENC_HISTEREZE 10 /* necitlivost kroutitka pri nastavovani parametru v impulzech */ |
|
#define BAND_NUM 4 /* pocet pasem */ |
// tabulka meznich kmitoctu v Hz pro jednotliva pasma |
int32 const BAND_LIMIT[BAND_NUM][2] = { |
//{1800000,2000000}, |
{3500000,3620000}, |
{7000000,7045000}, |
{10100000,10150000}, |
{14000000,14120000} |
//{18068000,18168000} |
//{21000000,21450000} |
}; |
|
|
int32 const START_FREQ[BAND_NUM] = { |
//1810000, |
3560000, |
7030000, |
10116000, |
14060000, |
//18096000, |
//21060000 |
}; |
|
#define RIT_STEP 10 /* krok RITu v Hz */ |
signed int16 const RIT_LIMIT[2] = {-2000,2000}; /* rozsah RITu v Hz */ |
|
int16 const FREQ_STEP[2]={20,1000}; /* tabulka ladicich kroku v Hz */ |
|
// tabulka dekodovani pasma |
#define BAND_ADC_MASK 0b11100000 |
int8 const BAND_ADC[BAND_NUM]= { |
//0x00, /* 160m */ |
0x20, /* 80m */ |
0x40, /* 40m */ |
0x60, /* 30m */ |
0x80 /* 20m */ |
//0x82, /* 17m */ |
//0x84 /* 15m */ |
}; |
|
|
// hodnoty napeti z prevodniku odpovidajici prislusnym S stupnum |
int8 const S_METER[9]= { |
0xC7, /* S2 */ |
0xBA, /* S3 */ |
0xA8, /* S4 */ |
0x91, /* S5 */ |
0x82, /* S6 */ |
0x79, /* S7 */ |
0x73, /* S8 */ |
0x6C, /* S9 */ |
0x60 /* S9 + cca 10dB */ |
}; |
|
|
|
// priznaky v promenne flags |
#define _DDS_UPDATE flags,0 /* pozadavek zmeny kmitoctu DDS */ |
#define _LCD1_UPDATE flags,1 /* pozadavek aktualizace udaje v 1.radku LCD */ |
#define _LCD2_UPDATE flags,2 /* pozadavek aktualizace udaje ve 2. radku LCD */ |
#define _PAR_UPDATE flags,3 /* pozadavek aktualizace vybraneho parametru */ |
#define _RIT flags,4 /* misto kmitoctu zobrazuj RIT */ |
#define _SPLIT flags,5 /* zapnut rezim SPRIT */ |
#define _TRANSMIT flags,6 /* je prepnuto na vysilani */ |
#define _LED_UPDATE flags,7 /* zrcadlo stavu LED */ |
#define _ENC_CHNG flags,8 /* doslo ke zmene polohy korutitka */ |
#define _TXDELAY flags,9 /* bezi spozdeni mezi stiskem klice a zaklicovanim vysilace */ |
#define _ATTN flags,10 /* je zapnuty utlum */ |
#define _MNU flags,11 /* rezim nastavovani hodnoty parametru */ |
#define _MNU2 flags,12 /* rezim vyberu parametru */ |
#define _RUN_VOX flags,13 /* bezi vox timer */ |
#define _BATT_LOW flags,14 /* baterie je vybita */ |
#define _KEYING flags,15 /* je zaklicovan vysilac */ |
|
// priznaky promenne keys_flags |
#define _KEYS_LONG keys_flags,0 /* tlacitko stisknuto po dlouhou dobu */ |
#define _KEYS_VALID keys_flags,1 /* tlacitka jsou platna */ |
#define _KEYS_RELEASE keys_flags,2 /* cekej na uvolneni tlacitka = ukonceni reakce na tlacitko */ |
|
// priznaky promenne adc_flags |
#define _ADC_START adc_flags,0 /* spust_prevod */ |
|
// priznaky promenne elbug_flags |
#define _ELBUG_ON elbug_flags,0 /* klicovani bude rizeno elbugem */ |
#define _ELBUG_BSY elbug_flags,1 /* probiha generovani signalu _ELBUG */ |
#define _ELBUG_OUT elbug_flags,2 /* vystup z elbugu */ |
#define _ELBUG_SP elbug_flags,3 /* priste vysilej mezeru */ |
#define _ELBUG_DOT elbug_flags,4 /* byla stisknuta paka tecek */ |
#define _ELBUG_DASH elbug_flags,5 /* byla stisknuta paka carek */ |
#define _ELBUG_LAST elbug_flags,6 /* minula stisknuta paka 0=dot 1=dash */ |
#define _ELBUG_REV elbug_flags,7 /* reverzni chapani pak */ |
#define _ELBUG_REAL elbug_flags,8 /* zapnuto realne klicovani */ |
#define _ELBUG_ON_TMP elbug_flags,9 /* pro zapamatovani stavu _ELBUG_ON pri nastavovani vykonu */ |
|
// konstanta pro odmereni nejmensiho elementu elbugu (tecka nebo tez mezera) |
#define ELBUG_CONST ((60*1000)/(5*5*2))*125 /* 60 - prevod na vteriny */ |
/* 1000 - prevod na ms */ |
/* 5 - prevod WPM na LPM */ |
/* 5 - pocet tecek v 1sec pro 200WPM */ |
/* 2 - zajima nas sirka tecky */ |
/* 125 - prevodni konstanta pro timer */ |
|
#define PAR_NUM 7 /* pocet parametru TRXu */ |
// cisla (indexy) parametru TRXu |
// poradi urcuje poradi ve vyberovem menu |
// parametry za volnym radkem v menu nejsou, vybiraji se na funkcnich tlacitkach |
#define PAR_POWER 0 /* vykon vysilace */ |
#define PAR_VOX 1 /* doba prepnuti zpet na prijem */ |
#define INF_BATT 2 /* napeti baterie */ |
#define PAR_KEYER_REV 3 /* zap/vyp reverzni chapani pak */ |
#define PAR_KEYER_MODE 4 /* doplnkove nebo realne klicovani */ |
|
#define PAR_KEYER 5 /* rychlost elbugu */ |
#define PAR_ATTN 6 /* attenuator */ |
|
|
|
// tabulka mezi pro jednotlive parametry |
int8 const PAR_LIMIT[PAR_NUM][2] = { |
{0,16}, /* vykon ve 0.5w jednotkach */ |
{0,40}, /* meze pro vox v 50ms jednotkach */ |
{0,0}, /* hodnota napeti baterie */ |
{0,1}, /* meze pro zap/vyp reverzi pak */ |
{0,1}, /* mod klicovani */ |
{5,40}, /* meze pro elbug ve WPM */ |
{0,3} /* meze pro attenuator 0,-6,-12 a -18dB */ |
}; |
|
// adresy jednotlivych parametru ulozenych v eeprom |
#define EE_ADR_POWER 0 /* BAND_NUM bajtu - pro kazde pasmo jeden bajt */ |
#define EE_ADR_VOX BAND_NUM |
#define EE_ADR_BATT EE_ADR_VOX+1 |
#define EE_ADR_KEYER_REV EE_ADR_BATT+1 |
#define EE_ADR_KEYER_MODE EE_ADR_KEYER_REV+1 |
#define EE_ADR_KEYER EE_ADR_KEYER_MODE+1 |
#define EE_ADR_ATTN EE_ADR_KEYER+1 |
#define EE_ADR_CRC EE_ADR_ATTN+1 /* kontrolni soucet eeprom */ |
|
// pole adres parametru ulozenych v eeprom |
int8 const EE_ADDR[PAR_NUM] = { |
EE_ADR_POWER, |
EE_ADR_VOX, |
EE_ADR_BATT, // napeti baterie se neuklada, zde je zapsana konstantni hodnota |
EE_ADR_KEYER_REV, |
EE_ADR_KEYER_MODE, |
EE_ADR_KEYER, |
EE_ADR_ATTN |
}; |
|
|
#define BATT_MIN 173 // napeti baterie, od ktere se povazuje za vybitou (hodnota z prevodniku pro 10.8V) |
#define BAD_PSV 18 // od PSV > 1.8 se omezi vykon |
#define PWR_LIM 10 // vykon pri spatnem psv je omezen na 1W |
#define PWM_MIN 27 // minimalni hodnota pro PWM2 |
#define PWM_MAX 157 // maximalni hodnota pro PWM2 |
#define PWR_HIST_LO 2 // spodni povolena odchylka od pozadovaneho vykonu v nasobcich 100mW |
#define PWR_HIST_HI 1 // horni povolena odchylka od pozadovaneho vykonu v nasobcich 100mW |
#define PWR_FWD_CONST 5600 // prevodni konstatna pro prevod napeti z ADC na vykon |
|
|
int8 lcd_pos; // poloha znaku na LCD pro specialni fce s nazvy xxx_lcd_putc |
int32 freq_vfo[2]; // pozadovany kmitocet vfoA a vfoB |
signed int16 freq_rit; // rozladeni +- pri prijmu |
signed int8 enc_delta; // +-pocet impulzu zmeny kroutitka |
|
int8 update_timer; // periodicky casovac pro aktualizaci kde ceho |
int8 key_timer; // casovac pro rozpoznani dlouheho stisku tlacitka |
int16 vox_timer; // casovac pro automaticke prepnuti na prijem po urcite dobe bez vysilani |
int16 vox_time; // hodnota vox timeru, 0 = plny BK |
int8 flash_timer; // pro blikani ledkou pri vybite baterii |
|
int8 keys; // obsahuje tlacitka, ktera byla stisknuta (0=klidovy stav) |
int8 keys_work; // pro precteni stavu tlacitek v preruseni |
int8 keys_old; // predchozi stav tlacitek, pro osetreni zakmitu |
int8 keyer; // obsahuje stav stisknutych pak elbugu |
int8 keyerb; // obsahuje aktualni stav pak elbugu |
|
int1 step_index; // index do tabulky moznych kroku ladeni |
int1 vfo_index; // index do tabulky VFO |
int8 band_index; // index do tabulky rozsahu kmitoctu |
|
int16 flags; // stavove priznaky pro rizeni programu |
int16 elbug_flags; // stavove priznaky pro rizeni elbugu |
int8 keys_flags; // stavove priznaky tlacitek |
int8 adc_flags; // stavove priznaky pro rizeni ADC |
int8 par[PAR_NUM]; // parametry TRXu |
int8 par_index; // cislo nastavovaneho parametru |
|
int8 adc_ch; // citac kanalu ADC |
int8 adc_val; // napeti z ADC aktualniho kanalu |
int8 smtr_val; // hodnota napeti z ADC odpovidajici S-metru |
int8 pwr_val; // hodnota aktualniho vykonu v 100mW jednotkach |
int8 psv_val; // hodnota psv v desetinovych jednotkach |
int8 fwd_val; // napeti z ADC odpovidajici doprednemu vykonu |
int8 rev_val; // napeti z ADC odpovidajici odrazenemu vykonu |
int8 bnd_val; // napeti z ADC odpovidajici pasmu |
int8 batt_val; // napeti z ADC odpovidajici napeti baterie |
int8 pwm_val; // hodnota pro PWM2 - rizeni vykony PA |
int8 power; // pozadovany vykon PA |
int16 elbug_dot_sp; // hotnota timeru 1 pro generovani tecky a mezery |
int16 elbug_dash; // hordnota timeru1 pro generovani carky |
|
|
#bit _T0IF = 0x0B.2 // priznak preteceni timeru0 - vyuziva se pri spousteni TXDELAY |
// (vyuziva se pro nej prave timer0) aby byla jistota, ze se TXDELAY |
// skutecne odmeri |
|
#bit _TMR1IF = 0x0C.0 // priznak preruseni od timeru 1 - pro vyprovokovani preteceni (start elbugu) |
// End of File |