Я устанавливаю частотомер на PIC18F4585, который отправляет частоту через 8-битный SPI.
Я устанавливаю в моем PICF4584 частотомер, который будет вычислять частоту прямоугольной волны, поступающей в таймер / счетчик1, выборки за 8 мс, синхронизированные таймером / счетчиком 0, а затем отправляемые в другой MCU через SPI. У меня нет подключенного входного контакта SPI SDI, потому что я не буду отправлять данные обратно, но по какой-то причине я не выводю данные. Я узнал MCU по линии AVR, поэтому способ PIC немного отличается от меня, и я думаю, что, возможно, пропустил что-то простое.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <xc.h>
volatile int count;
void timer0_init() //for sampling period 64 prescaler@ 8MHz -> 1000 ticks per 8ms
{
T0CON |= (1<<7); //Timer1 on
T0CON |= (1<<2) | (1<<0); //64 prescaler
TMR0 = 64535; //interrupt initiated on overflow, 1000 ticks until overflow
}
void timer1_init() //for frequency counting
{
T1CON |= (1<<7); //16 bit operation
T1CON |= (1<<1); //Timer1 clock source external RC0/T1OSO/T13CKI on rising edge
T1CON |= (1<<0); //Enables Timer1
T1CON |= (1<<6); //Device clock source is derived from Timer1 oscillator
}
void SPI_init()
{
//TRIS 0 is default output, TRIS 1 is input
TRISC &= ~(1<<3);
TRISC &= ~(1<<5);
TRISA |= (1<<5);
PORTA |= (1<<5);
SSPSTAT |= (1<<7); //Input data sampled at end of output time
SSPSTAT |= (1<<6); //Clock: transmit occurs on active to idle
SSPCON1 |= (1<<5); //SCK, SDO, SDI, and SS are serial port pins
SSPCON1 |= (1<<0); //Fosc/16
}
void interrupt_init()
{
INTCON |= (1<<7); //global interrupt enable
INTCON |= (1<<7); //Enables high priority interrupts
INTCON |= (1<<5); //enables Timer0 overflow
}
void __interrupt () ISR(void)
{
count = TMR1;
count = (count)/.008;
/*SPI TRANSMIT*/
PORTA &= ~(1<<5); //Slave Select goes low
SSPBUF = count;
PORTA |= (1<<5);
/*RESET TIMERS AND INTERRUPTS*/
TMR1 = 0;
TMR0 = 64343;
INTCON &= ~(1<<2);
}
int main() {
interrupt_init();
timer0_init();
timer1_init();
SPI_init();
while(1)
{
}
}