#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <util/delay.h>
#include "uart_i2c.h"
volatile int i = 0, pause = 0, uart = 0; // i - length of telegramm, pause - length of pause after telegramm
char s[64];
#define F_CPU 1843200L
// I/O ports init
void init_io_ports()
{ DDRA =(1<< DDA0)|(1<< DDA1)|(1<< DDA2)|(1<< DDA3)|(1<< DDA4)|(1<< DDA5)|(1<< DDA6)|(1<< DDA7);
DDRB =(1<< DDB0)|(1<< DDB1)|(1<< DDB2)|(1<< DDB3)|(1<< DDB4)|(1<< DDB5)|(1<< DDB6)|(1<< DDB7);
DDRC =(0<< DDC0)|(0<< DDC1)|(1<< DDC2)|(1<< DDC3)|(1<< DDC4)|(1<< DDC5)|(1<< DDC6)|(1<< DDC7);
DDRD =(1<< DDD0)|(1<< DDD1)|(1<< DDD2)|(1<< DDD3)|(1<< DDD4)|(1<< DDD5)|(1<< DDD6)|(1<< DDD7);
PORTA =(0<< PA0)|(0<< PA1)|(0<< PA2)|(0<< PA3)|(0<< PA4)|(0<< PA5)|(0<< PA6)|(0<< PA7);
PORTB =(0<< PB0)|(0<< PB1)|(0<< PB2)|(0<< PB3)|(0<< PB4)|(0<< PB5)|(0<< PB6)|(0<< PB7);
PORTC =(1<< PC0)|(1<< PC1)|(0<< PC2)|(0<< PC3)|(0<< PC4)|(0<< PC5)|(0<< PC6)|(0<< PC7);
PORTD =(0<< PD0)|(0<< PD1)|(0<< PD2)|(0<< PD3)|(0<< PD4)|(0<< PD5)|(0<< PD6)|(0<< PD7);
}
//************************************* Timer ****************************************************
// Timer0 8bit init, no prescaler, CTC mode
void init_timer()
{ TCCR0 = (0<< FOC0)|(0<< WGM00)|(0<< COM01)|(0<< COM00)|(1<< WGM01)|(0<< CS02)|(0<< CS01)|(1<< CS00);
TIMSK = (1<< OCIE0); // enable interrupts
sei(); // enable interrupts
SREG = (1<< 7); // enable interrupts
OCR0 = 192; // 1.8432Mhz of Xtal / 9600Hz = 192
}
//******************************** Interrupt Vector ************************************************
ISR(TIMER0_COMP_vect) // interrupt vector
{
if (i <= 64) // while telegramm is ON 64
{
if((PINC & (1 << PC0)) == 1)
{s[i] = '0';} // write "0" in s[i]
else
{s[i] = '1';} // write "1" in s[i]
i++;
}
else
{
if ((PINC & (1 << PC0)) == 0) //waiting the end of pause
{pause++;}
else
{pause = 0;}
}
}
//**************************************** MAIN ****************************************************
int main(void)
{
init_io_ports();
init_uart();
while (1)
{
i = 0;
pause = 0;
uart = 0;
if((PINC & (1 << PC0)) == 1) // waiting first "0" in Transmition on PC0
{
_delay_ms(0.010);
init_timer();
TCCR2 = 254;
while (pause <= 50) // pause after telegramm = 50 bit
{}
TCCR2 = 0; // stop timer TCNT2
putstr(s);
}
}
return 0;
}
Цитата
Сделайте без прерываний ради интереса.
На самом деле все должно быть очень просто. Вероятно какая-то тупая ошибка sm.gif
Приведите здесь код, если его немного. Может кто-нить сразу увидит в чем дело
без прерываний как?
Глупы ошибки это да... =)
Сообщение отредактировал micronano - Aug 2 2011, 10:44