Kod: Zaznacz cały
/*
* File: main.c
* Author: Arkadiusz Pytlik
*
* Created on 27 listopada 2016
*/
#include "config.h"
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 48000000UL
#endif
#include <xc.h>
#include <stdint.h>
#include <stdbool.h>
#include "usart/usart.h"
#define TMR0_RELOAD ((_XTAL_FREQ/4)/256UL/(255-100))// 100Hz
void TIMER0_Init(void);
void low_priority interrupt lowISR(void);
void high_priority interrupt highISR(void);
volatile uint8_t timer10ms;
int cnt;
int main(void)
{
TIMER0_Init();
USART_Init();
INTCONbits.GIEL = 1;//enable low level interrupts
INTCONbits.GIEH = 1;//enable all interrupts ( ei();)
while(true)
{
if(!timer10ms)
{
cnt++;
USART_BufferTransmit_P("Frame count: ");
USART_IntegerTransmit(cnt);
USART_BufferTransmit_P("\r\n");
USART_BufferTransmit_P("*PIC18F4550 fully interrupt driven USART *\r\n");
USART_BufferTransmit_P("* Connection params: 19200 8N1 *\r\n");
USART_BufferTransmit_P("* High priority interrupt used! *\r\n");
USART_BufferTransmit_P("* *\r\n");
timer10ms = 100;
}
}
}
void TIMER0_Init(void)
{
T0CON = (_T0CON_TMR0ON_MASK|_T0CON_T08BIT_MASK|_T0CON_T0PS2_MASK|
_T0CON_T0PS1_MASK|_T0CON_T0PS0_MASK);
INTCON2 &= ~_INTCON2_TMR0IP_MASK;//low priority for TIMER 0
RCON |= _RCON_IPEN_MASK;//interrupt priorities enabled
INTCON |= _INTCON_TMR0IE_MASK;//enable tmr0 interrupt
}
void low_priority interrupt lowISR(void)
{
if(INTCONbits.TMR0IE)
{
if(INTCONbits.TMR0IF)
{
TMR0 = TMR0_RELOAD;//100Hz reload
if(timer10ms) timer10ms--;
INTCONbits.TMR0IF = 0;//flag reset
}
}
}
void high_priority interrupt highISR(void)
{
if(PIE1bits.RC1IE && PIR1bits.RC1IF)
{
USART_Rx();
}
else if(PIE1bits.TX1IE && PIR1bits.TX1IF)
{
USART_Tx();
}
}
Oraz kompletny projekt:
Pozdrawiam.