21. listopadu 2007

BCC Stack-Match III. - úprava fw

Původní verze firmware měla na pevno nastavené vysílání do ant 1 a 2 při PTT. V této verzi je možno antény, do kterých se vysílá ,možno naprogramovat. V zapojení přibyl spínač S4 připojený na port PD0. Při programování je třeba mít nastaveno spínání antén jak to má být při PTT. Při zapnutí napájení stiskneme S4 a konfigurace se uloží do EEPROM.
/*--------------------------------------------
BCC Stackmatch controler 0.2
(c)OK1CDJ, OK1CDK 2007
Pin Function
6 PD2 PTT IN (0=PTT)
7 PD3 Switch 1 (0=ON)
8 PD4 Switch 2 (0=ON)
9 PD5 Switch 3 (0=ON)
12 PB0 REL. 1 (1=ON)
13 PB1 REL. 2 (1=ON)
14 PB2 REL. 3 (1=ON)
15 PB3 REL. 4 (1=ON)
*/
#include <avr/io.h>
#include <avr/eeprom.h>
unsigned char bit(unsigned char param);
#define ON 1 // turned on
#define OFF 0 // turned off
unsigned char PTT=OFF;
unsigned char cfgmem __attribute__((section(".eeprom")));
unsigned char cfg;
#define PTTIN PD2
#define S1 PD3
#define S2 PD4
#define S3 PD5
#define S4 PD0
#define R1 PB0
#define R2 PB1
#define R3 PB2
#define R4 PB3
int main(void) {
unsigned char portstatus;
unsigned char PTT=OFF;
DDRD = 0x0;
// PD2 PD3 PD4 internal pullups high
PORTD |= _BV(S4);
PORTD |= _BV(PTTIN);
PORTD |= _BV(S1);
PORTD |= _BV(S2);
PORTD |= _BV(S3);
//PORTD = 0xFF;
// PB1,2,3 as output
DDRB = 0xFF;
PORTB = 0x0;
PTT=ON;
// programovani eeprom po startu
portstatus = PIND;
if( ! bit_is_set(PIND, S4) )//je stiknuto S4 pro programovani
{
switch(portstatus & 56) {
case 48: {
//S1
cfg = 1;
}
break;
case 40: //S2
{
cfg = 2;
}
break;
case 24: //S3
{
cfg = 4;
}
break;
case 32: //S1+2
{
cfg = 11;
}
break;
case 16: //S1+3
{
cfg = 13;
}
break;
case 8: //S2+3
{
cfg = 14;
}
break;
case 0: //S1+2+3
{
cfg = 15;
}
break;
case 56: //Nic nesepnuto - vsechny 3 anteny
{
cfg = 15;
}
break;
}
eeprom_write_byte(&cfgmem,cfg);
}
cfg = eeprom_read_byte(&cfgmem);
if (cfg==0xFF) cfg=15;
//
while(1) // +++++++++++++++++++++++ main loop +++++
{
//PORTB |= _BV(R3);
portstatus = PIND;
if( ! bit_is_set(PIND, PTTIN) )//if PTT = 0 klicovani
{
//PORTB |= _BV(R3);
if (PTT == OFF)
{
PTT=ON;
PORTB= cfg;
}
}
if( bit_is_set(PIND, PTTIN) )//if PTT = 1 odklicovani
{
if (PTT == ON) {
PTT=OFF;
}
switch(portstatus & 56) {
case 48: {
//S1
PORTB = 1;
}
break;
case 40: //S2
{
PORTB = 2;
}
break;
case 24: //S3
{
PORTB = 4;
}
break;
case 32: //S1+2
{
PORTB = 11;
}
break;
case 16: //S1+3
{
PORTB = 13;
}
break;
case 8: //S2+3
{
PORTB = 14;
}
break;
case 0: //S1+2+3
{
PORTB = 15;
}
break;
case 56: //Nic nesepnuto
{
PORTB = 0;
}
break;
// }
}
}
}
return(0); // to avoid a compiler warning
}

Žádné komentáře: