Правильно ли реализована эта программа SPI и частотомер? - PullRequest
1 голос
/ 23 апреля 2019

Я устанавливаю частотомер на 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)
    {
    }
}

...