با سلام مجدد
این برنامه بدون ASF راه اندازی شد و کار میکنه :
کد:
#include <avr/io.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "avr_compiler.h"
#include "TC_driver.h"
#include "TC_driver.c"
volatile unsigned int PULSE_LOW,PULSE_HIGH;
uint32_t Duty,Channel1,Channel2,Channel3,Channel4,Channel5,Channel6,Channel7,Channel8,Channel9;
char *Header = "First AVR Studio Project";
inline void usart_init(USART_t *usart_port_register,PORT_t *usart_port_pins,const int16_t bsel,const uint8_t bscale);
void usart_receive_byte(USART_t *usart_port_register);
void usart_putc(USART_t *usart_port_register,char c);
int main(void)
{
OSC_CTRL|=OSC_RC32MEN_bm;
while(!(OSC_STATUS & OSC_RC32MRDY_bm));
CCP=CCP_IOREG_gc;
CLK_CTRL=CLK_SCLKSEL_RC32M_gc;
PORTC_PIN1CTRL=PORT_OPC_PULLDOWN_gc|PORT_ISC_BOTHEDGES_gc;
EVSYS_CH0MUX=EVSYS_CHMUX_PORTC_PIN1_gc;
TC0_ConfigInputCapture(&TCC0,TC_EVSEL_CH0_gc);
TC0_SetCCAIntLevel(&TCC0,TC_CCAINTLVL_MED_gc);
TC0_EnableCCChannels(&TCC0,TC0_CCAEN_bm);
TC0_ConfigClockSource(&TCC0,TC_CLKSEL_DIV1_gc);
PMIC_CTRL|=PMIC_MEDLVLEN_bm;
sei();
//usart_init(&USARTD0,&PORTD,3317,12); // This should be 9600 Baud
usart_init(&USARTD0,&PORTD,3269,-6); // This should be 38400 Baud
//
for (int i=0; i<sizeof(Header);i++)
{
usart_putc(&USARTD0,Header[i]);
}
usart_putc(&USARTD0,(char)10);
usart_putc(&USARTD0,(char)13);
Header = "Data : ";
while (true)
{
char Freq[33];
Duty = TCC0.CCA;
itoa(Duty,Freq,10);
for (int i=0; i<sizeof(Freq);i++)
{
usart_putc(&USARTD0,Freq[i]);
}
usart_putc(&USARTD0,(char)10);
usart_putc(&USARTD0,(char)13);
}
}
ISR(TCC0_CCA_vect)
{
static bool first_time_f=true;
static unsigned int old_timer_value;
unsigned int t16;
if(first_time_f)
{
old_timer_value=TC_GetCaptureA(&TCC0);
first_time_f=false;
}
else
{
t16=TC_GetCaptureA(&TCC0);
if(PORTC_IN&PIN1_bm)PULSE_LOW=t16-old_timer_value;
else PULSE_HIGH=t16-old_timer_value;
old_timer_value=t16;
}
}
inline void usart_init(USART_t *usart_port_register,PORT_t *usart_port_pins,const int16_t bsel,const uint8_t bscale)
{
usart_port_pins->OUTSET = PIN3_bm;
usart_port_pins->DIRSET = PIN3_bm;
usart_port_pins->OUTCLR = PIN1_bm;
usart_port_pins->DIRSET = PIN1_bm;
usart_port_pins->DIRCLR = PIN2_bm;
usart_port_register->BAUDCTRLB = ((bscale << 4) | (bsel >> 8));
usart_port_register->BAUDCTRLA = (uint8_t) bsel;
usart_port_register->CTRLC = USART_CMODE_ASYNCHRONOUS_gc |
USART_PMODE_DISABLED_gc | USART_CHSIZE_8BIT_gc;
usart_port_register->CTRLB |= USART_RXEN_bm | USART_TXEN_bm;
}
void usart_receive_byte(USART_t *usart_port_register)
{
uint8_t rx_byte = 0;
rx_byte = usart_port_register->DATA;
for (int i=0; i<sizeof(Header);i++)
{
usart_putc(&USARTD0,Header[i]);
}
usart_putc(&USARTD0,rx_byte);
usart_putc(&USARTD0,(char)10);
usart_putc(&USARTD0,(char)13);
}
void usart_putc(USART_t *usart_port_register,char c)
{
while (!(usart_port_register->STATUS & USART_DREIF_bm));
usart_port_register->DATA = c;
}
اگر جایی در این برنامه اشکالی میبینید لطفا راهنمایی بفرمایید .
متشکرم .