Вот код
Код: Выделить всё
#include <avr/interrupt.h>
#include <util/delay.h>
#define SETBIT(x,y) (x|=(1<<y))
#define CLRBIT(x,y) (x&=~(1<<y))
#define INVBIT(x,y) x ^= (1<<y)
#define RGB_PORT PORTD
#define RED_PIN PD4
#define GREEN_PIN PD5
#define BLUE_PIN PD3
#define RED_ON SETBIT(RGB_PORT,RED_PIN)
#define RED_OFF CLRBIT(RGB_PORT,RED_PIN)
#define GREEN_ON SETBIT(RGB_PORT,GREEN_PIN)
#define GREEN_OFF CLRBIT(RGB_PORT,GREEN_PIN)
#define BLUE_ON SETBIT(RGB_PORT,BLUE_PIN)
#define BLUE_OFF CLRBIT(RGB_PORT,BLUE_PIN)
#define EventCount 20
// Скорость обмена UART в бит/с
#define UART_BAUD 9600ul
#include <uart.c>
volatile unsigned char cR=0, cB=0, cG=0; /* текущие значения яркости каждого канала */
/* массивы времени (в минутах) и значений цвета по каналам */
volatile unsigned char aHour[EventCount];
volatile unsigned char aMin[EventCount];
volatile unsigned char aRed[EventCount];
volatile unsigned char aGreen[EventCount];
volatile unsigned char aBlue[EventCount];
volatile unsigned char gH,gM,gS;
volatile int T; /* текущее время*/
ISR(TIMER0_OVF_vect) { /* шим ленты */
static unsigned char Tmr=0;
if (Tmr<cR) RED_ON;
else RED_OFF;
if (Tmr<cG) GREEN_ON;
else GREEN_OFF;
if (Tmr<cB) BLUE_ON;
else BLUE_OFF;
Tmr++;
}
ISR(TIMER1_OVF_vect) { /* следим за временем и менем яркость ленты */
unsigned char n=0,i;
T=gH*60+gM;
for (i=0;i<EventCount;i++) { /* узнаем каким должно быть текущее значение ленты*/
if (T>=(aHour[i]*60+aMin[i])) n=i;
}
UART_SendChar(T>>8 & 0xFF);
UART_SendChar(T & 0xFF);
UART_SendChar(gS);
UART_SendChar(cR);
UART_SendChar(aRed[n]);
UART_SendChar(cG);
UART_SendChar(aGreen[n]);
UART_SendChar(cB);
UART_SendChar(aBlue[n]);
UART_SendChar(n);
UART_SendChar(0x0);
UART_SendChar(0x0);
UART_SendChar(0x0);
UART_SendChar(0x0);
UART_SendChar(0x0);
UART_SendChar(0x0);
}
void Load_Raspisanie(void) {
for (unsigned char j=0;j<EventCount;j++) {
aHour[j]=0;
aMin[j]=0;
aRed[j]=0;
aGreen[j]=0;
aBlue[j]=0;
}
aHour[17]=16;
aMin[17]=27;
aHour[18]=16;
aMin[18]=28;
aHour[19]=16;
aMin[19]=29;
}
int main (void) {
UART_Init();
sei();
Load_Raspisanie();
TCCR1B = (0<<CS12)|(1<<CS11)|(0<<CS10);
TIMSK |= (1<<TOIE1); // разрешаем прерывание по переполнению таймера
gH=16;
gM=26;
gS=0;
while(1) {
if (gS++>60) {
gS=0;
gM++;
}
_delay_ms(900);
}
}ВиеАвр 20100110 avr-gcc 4.3.3
протеус 8.1 sp1 билд 17358
Добавлено after 34 seconds:
attiny2313
- Вложения
-
- Archive.zip
- вот сам проект с исходниками
- (120.4 КБ) 251 скачивание



