Чт июн 08, 2023 16:11:41
void main(void)
{
static unsigned int fG_old = 0;
SpiSlaveInit();
Tim1Init();
UpdateTim1A(fG);
PORTD &= (~((1<<0)|(1<<1)|(1<<2)|(1<<4)|(1<<5)|(1<<6))); //гашу светодиоды
DDRD=0x77;
#asm("sei")
for(;;) {
if (flag_RT = 1) {
if (fG_old != fG) { //old value detction
SetUpTim1A(fG);
fG_old = fG;
}
nG= ch_num; //generator number
fG= dFi.b[0]+dFi.b[1]+dFi.b[2]; //generator frequency
set_out_pin (nG);
SetUpTim1A(fG);
}
}
}
Чт июн 08, 2023 16:29:13
Чт июн 08, 2023 16:47:24
Чт июн 08, 2023 16:49:30
Чт июн 08, 2023 16:56:15
Чт июн 08, 2023 17:12:05
Чт июн 08, 2023 23:33:28
Пт июн 09, 2023 11:06:56
void Tim1Init(void)
{
#asm("cli")
TCCR1A = (1<<COM1A0); //toggle on compare
TCCR1B = (1<<WGM12)|(1<<CS12)|(1<<CS10); // set timer CTC mode, prescaler 1024
TIMSK = (1<<OCIE1A);
#asm("sei")
}
void SetUpTim1A(unsigned int Foc) //calculate value OCR1A register
{
unsigned int TimDiv;
unsigned char ClockSelect=0;
unsigned char i=0;
for(i=0;i<=4;i++) {
TimDiv = (F_CPU/(2*(Foc/167)*N[i])-1)+0.5;
if(TimDiv >= 0 && TimDiv<VFG_TIMER_MAX){
ClockSelect=i+1;
break;
}
}
OCR1A=TimDiv;
TCCR1B = (1<<WGM12) | (ClockSelect<<CS10);
}
void UpdateTim1A(unsigned int freq) //old value storage
{
static unsigned int fG_old = 0;
if (fG_old != freq)
{
SetUpTim1A(freq);
fG_old = freq;
}
}
void set_out_pin (unsigned char num){ //output pin selection
nG=1<<num;
VFG_DDR = nG;
}
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
VFG_PORT = (VFG_PORT^nG)&(nG);
}
Пт июн 09, 2023 11:49:38
Пт июн 09, 2023 11:54:07
Пт июн 09, 2023 12:15:03
Пт июн 09, 2023 12:32:48
void SPITransmitFreq(unsigned char Cnt, double F) { //F- значение частоты
dFi.w = F*167.77216; //частота передаваемая через SPI, какое-то фиксированное число 167.77216
PORTB &= ~(1<<PORTB0);
SPI_MasterTransmit(Cnt & 0x03);//0x03-маска
SPI_MasterTransmit(dFi.b[0]);//флаги передачи
SPI_MasterTransmit(dFi.b[1]);//флаги передачи
SPI_MasterTransmit(dFi.b[2]);//флаги передачи
PORTB |= (1<<PORTB0);
}
Пт июн 09, 2023 12:52:26
Пт июн 09, 2023 12:54:53
Пт июн 09, 2023 13:04:11
Пт июн 09, 2023 13:12:32
unsigned int fG;
fG = dFi.b[0] | dFi.b[1]<<8 | dFi.b[2]<<16;
Пт июн 09, 2023 13:18:09
Пт июн 09, 2023 14:01:31
Пт июн 09, 2023 14:10:53
... dFi.b[3] << 32
... dFi.b[3] << 24
fG = dFi.b[1] << 8;
uint32_t tmp = dFi.b[2] << 16;
fG |= tmp;
tmp = dFi.b[2] << 24;
fG |= tmp;
Пт июн 09, 2023 14:33:52
void SpiSlaveInit() {
#asm("cli")
USICR = ((1<<USIWM0)|(1<<USICS1)); // Activate 3- Wire Mode and use of external clock but NOT the interrupt at the Counter overflow (USIOIE)
//PORTD |= (1<<6);
PORTD |= 1<<CS; // Activate Pull-Up resistor on PD3
GIMSK |= 1<<INT1;
MCUCR |= 1<<ISC10;
#asm("sei")
}
// External Interrupt 0 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
if((PIND & (1<<CS))== 0){
PORTD |= (1<<5);
// If edge is falling, the command and index variables shall be initialized
// and the 4-bit overflow counter of the USI communication shall be activated:
reqID = 0;
//index = 0;
flag_RT = 0;
USICR |= (1<<USIOIE);
USISR = 1<<USIOIF; // Clear Overflow bit
}
else{
// If edge is rising, turn the 4-bit overflow interrupt off:
USICR &= ~(1<<USIOIE);
PORTD |= (1<<6);
}
}
interrupt [USI_OVERFLOW] void usi_ovf_isr(void) {
switch(reqID) {
case 0:
PORTD |= (1<<0);
ch_num = USIDR;
USISR = 1<<USIOIF; // Clear Overflow bit
reqID++;
break;
case 1:
PORTD |= (1<<1);
dFi.b[1] = USIDR;
USISR = 1<<USIOIF; // Clear Overflow bit
reqID++;
break;
case 2:
PORTD |= (1<<2);
dFi.b[2] = USIDR;
USISR = 1<<USIOIF; // Clear Overflow bit
reqID++;
break;
case 3:
PORTD |= (1<<4);
dFi.b[3] = USIDR;
USISR = 1<<USIOIF; // Clear Overflow bit
reqID = 0;
flag_RT = 1;
break;
}
}