Получается функция if (reqID >= (sizeof(master_arr) / sizeof(master_arr[0]))) по прежнему не работает.
Добавлено after 46 seconds:
veso74, это я уже заметил и исправил, результат тот же.
Код: Выделить всё
fG = (master_arr[1] << 8)|(master_arr[2] << 16)|(master_arr[3] << 24); //generator freqencyКод: Выделить всё
fG = (master_arr[1])|(master_arr[2] << 8)|(master_arr[3] << 16); //generator freqencyКод: Выделить всё
#include <mega8.h>
#include <math.h>
#include <io.h>
#include <delay.h>
#define F_CPU (8000000)
#define VFG_TIMER_MAX (65535)
#define VFG_DDR DDRD
#define VFG_PORT PORTD
volatile unsigned long int fG;
volatile unsigned char nG;
unsigned int N[]={1,8,64,256,1024};
//BYTE STORAGE
volatile unsigned char master_arr [4];
//BYTE COUNTER
volatile int reqID = 0;
volatile int flagRT = 0;
void setup (void)
{
#asm("cli")
DDRB |= (1 << PORTB4); //configure MISO as output
SPCR |= (1 << SPIE) | (1 << SPE) | (0 << MSTR); //configure slave mod and interrupt
#asm("sei")
}
interrupt [SPI_STC] void spi_isr(void)
{
switch(reqID) {
case 0:
if (SPDR == 0b00000001 || SPDR == 0b00000010 || SPDR == 0b00000011) {
master_arr[0] = SPDR;
SPDR = master_arr [0];
PORTC |= (1<<0);
reqID++;
flagRT++;
break;
}
case 1:
if (flagRT = 1) {
master_arr[1] = SPDR;
SPDR = master_arr [1];
PORTC |= (1<<1);
reqID++;
flagRT++;
break;
}
case 2:
if (flagRT = 2) {
master_arr[2] = SPDR;
SPDR = master_arr [2];
PORTC |= (1<<2);
reqID++;
break;
}
case 3:
if (flagRT = 3) {
master_arr[3] = SPDR;
SPDR = master_arr [3];
PORTC |= (1<<3);
reqID++;
flagRT = 0;
break;
}
}
}
//***********************************************timer1************************************************
void main(void)
{
VFG_DDR = 0b00000111;
DDRC = 0b11111111;
setup();
#asm("sei")
for(;;) {
PORTC &= ~(1<<0);
PORTC &= ~(1<<1);
PORTC &= ~(1<<2);
PORTC &= ~(1<<3);
if (reqID >= (sizeof(master_arr) / sizeof(master_arr[0])))
{
if (flagRT == 1) {nG = master_arr[0];} //generator number
fG = 0|(master_arr[1] >> 8)|(master_arr[2] >> 16)|(master_arr[3] >> 24); //generator freqency
delay_ms(1);
PORTC &= ~(1<<4);
reqID= 0;
}
}
}Код: Выделить всё
volatile unsigned char master_arr [4];
...
... (master_arr[2] >> 16)|(master_arr[3] >> 24);Код: Выделить всё
#include <mega128.h>
#include <io.h>
#include <delay.h>
volatile unsigned char reqTr,reqTm;
struct Tmr_t {
unsigned char n;
double F;
};
struct Tmr_t T;
unsigned char chrT;
typedef union //объединение
{
unsigned long int w ; // w as WORD
unsigned int h[2]; // h as HALF-WORD
unsigned char b[4]; // b as BYTE
} Union32;
Union32 dFi;
void SPI_MasterTransmit(unsigned char cData);
void IOInit(void) {
PORTA = 0b00000000;
DDRA = 0b11111111;
PORTB = 0b00001001;
DDRB = 0b11110111;
PORTC = 0b00010000;
DDRC = 0b11111111;
PORTD = 0b01101100;
DDRD = 0b10111011;
PORTE = 0b00000011;
DDRE = 0b11111110;
PORTF = 0b00000000;
DDRF = 0b11111110;
PORTG = 0b00000000;
DDRG = 0b11111111;
reqTr=0;
reqTm=0;
}
void SPI_MasterInit(void) {
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1); /* Enable SPI, Master, set clock rate fck/16 */
}
void SPI_MasterTransmit(unsigned char cData) {
SPDR = cData; /* Start transmission */
while(!(SPSR & (1<<SPIF))); /* Wait for transmission complete */
}
void SPITransmitFreq(unsigned char Cnt, double F) { //F- значение частоты
dFi.w = F*167.77216; //частота передаваемая через SPI, какое-то фиксированное число 167.77216
PORTB &= ~(1<<PORTB0);
SPI_MasterTransmit(Cnt & 0x03);
SPI_MasterTransmit(dFi.b[0]);
SPI_MasterTransmit(dFi.b[1]);
SPI_MasterTransmit(dFi.b[2]);
PORTB |= (1<<PORTB0);
}
void main(void)
{
chrT=0x01;
T.n=0;
T.F=0;
SPI_MasterInit();
IOInit();
while (1)
{
unsigned char nG=2;
double fG=100;
SPITransmitFreq(T.n, T.F);//T.F-значение частоты, T.n-номер генератора
switch(nG) {
case 0: {T.n=0; T.F=fG; reqTm=1;}; break;
case 1: {T.n=1; T.F=fG; reqTm=1;}; break;
case 2: {T.n=2; T.F=fG; reqTm=1;}; break;
}
}
}
Код: Выделить всё
#include <mega8.h>
#include <math.h>
#include <io.h>
#include <delay.h>
#define F_CPU (8000000)
#define VFG_TIMER_MAX (65535)
#define VFG_DDR DDRD
#define VFG_PORT PORTD
volatile unsigned long int fG;
volatile unsigned char nG;
unsigned int N[]={1,8,64,256,1024};
//BYTE STORAGE
volatile unsigned char master_arr [4];
//BYTE COUNTER
volatile int reqID;
volatile int flagRT=0;
void setup (void)
{
#asm("cli")
DDRB |= (1 << PORTB4); //configure MISO as output
SPCR |= (1 << SPE) | (0 << MSTR); //configure slave mod and interrupt
#asm("sei")
}
interrupt [SPI_STC] void spi_isr(void)
{
unsigned char i=0;
for(i=0;i<5;i++) {
master_arr[i] = SPDR;
SPDR = master_arr [i];
}
}
//***********************************************timer1************************************************
void main(void)
{
VFG_DDR = 0b00000111;
DDRC = 0b11111111;
setup();
#asm("sei")
for(;;) {
if(PINB.2==0) {SPCR |= (1 << SPIE);} //ожидание 0 на SS для включения прерываний SPI
if(PINB.2==1) {SPCR |= (0 << SPIE);} //ожидание 1 на SS для отключения прерываний SPI
PORTC &= ~(1<<0);
PORTC &= ~(1<<1);
PORTC &= ~(1<<2);
PORTC &= ~(1<<3);
if (reqID >= (sizeof(master_arr) / sizeof(master_arr[0])))
{
nG = master_arr[0] & 0x03; //generator number
fG = 0|(master_arr[1] << 8)|(master_arr[2] << 16)|(master_arr[3] << 24); //generator freqency
PORTC &= ~(1<<4);
}
}
}