Уже как год хочу сделать пиропульт компютерный, но увы небыло знаний. А сейчас и знания и железо появилось.
Есть бесплатная МУЗЫКАЛЬНАЯ програма запуска салютов, но модули к ней стоят очень и не дешево.
Вот програма:
Сылка на програму и на сигнал модулей.
http://alexval2007.u...l_v1_4/2-1-0-27
http://alexval2007.u.../forum/36-183-1
Вот код что написал я для одного модуля на базе ATMEGA8.
Но он почему то не работает. (Какие ошибки я допустил)
Прошу помочь в этом не легком деле.
Вот весь код что был написан сразу:
Spoiler
Вот програма на Asm но старая и под attiny2313(она не совершенна но рабочая)
Spoiler
AVR Studio компилирует. А в железе не работает.
Ну и изюминка(Ручной запуск)
Spoiler
Раздел: AVR
Есть бесплатная МУЗЫКАЛЬНАЯ програма запуска салютов, но модули к ней стоят очень и не дешево.
Вот програма:
Сылка на програму и на сигнал модулей.
http://alexval2007.u...l_v1_4/2-1-0-27
http://alexval2007.u.../forum/36-183-1
Вот код что написал я для одного модуля на базе ATMEGA8.
//atmega8
#define F_CPU 8000000
#define number_modul 1
#include <avr/io.h>
#include <avr/interrupt.h>
char array_crc8[256]=
{
0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53
};
char bufer_uart[4];
unsigned char tail=0;
ISR(USART_RXC_vect)
{
TIMSK |= (0 << OCIE1A);
bufer_uart[tail]=UDR;
tail++;
if (tail>3)
{
tail=0;
}
TIMSK |= (1 << OCIE1A);
}
ISR(TIMER1_COMPA_vect)
{
tail=0;
bufer_uart[0]=0;
bufer_uart[1]=0;
bufer_uart[2]=0;
bufer_uart[3]=0;
}
void USART_Init(void)
{
UBRRH = 0;
UBRRL = 51; //скорость обмена 9600 бод
UCSRB = (1<<RXCIE)|(1<<RXEN);
//обращаемся к регистру UCSRS, размер слова – 8 бит
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
int main(void)
{
DDRC=0xff;
PORTC=0x00;
USART_Init();
tail=0;
TCCR1A = 0x00;
TCCR1B =0x05;
TCNT1 = 0x00;
OCR1A = 5; // максимальный предел счета
sei();
while(1)
{
switch(bufer_uart[2])
{
case 0x01: PORTC=1<<0; break;
case 0x02: PORTC=1<<1; break;
case 0x03: PORTC=1<<2; break;
case 0x04: PORTC=1<<3; break;
case 0x05: PORTC=1<<4; break;
case 0x06: PORTC=1<<5; break;
case 0x07: PORTC=1<<6; break;
case 0x08: PORTC=1<<7; break;
default: break;
}
}
}
Но он почему то не работает. (Какие ошибки я допустил)
Прошу помочь в этом не легком деле.
Вот весь код что был написан сразу:
Spoiler
#define F_CPU 8000000
#define number_modul 1
#include <avr/io.h>
#include <avr/interrupt.h>
char array_crc8[256]=
{
0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53
};
char bufer_uart[4];
unsigned char flag_uart=0;
unsigned char tail=0;
ISR(USART_RXC_vect)
{
TIMSK |= (0 << OCIE1A);
bufer_uart[tail]=UDR;
tail++;
if (tail>3)
{
tail=0;
flag_uart=1;
}
TIMSK |= (1 << OCIE1A);
}
ISR(TIMER1_COMPA_vect)
{
tail=0;
bufer_uart[0]=0;
bufer_uart[1]=0;
bufer_uart[2]=0;
bufer_uart[3]=0;
}
void USART_Init(void)
{
UBRRH = 0;
UBRRL = 51; //скорость обмена 9600 бод
//разр. прерыв при приеме, разр приема,
UCSRB = (1<<RXCIE)|(1<<RXEN);
//обращаемся к регистру UCSRS, размер слова – 8 бит
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
int main(void)
{
DDRC=0xff;
PORTC=0x00;
USART_Init();
tail=0;
TCCR1A = 0x00;
TCCR1B =0x05;
TCNT1 = 0x00;
OCR1A = 5;
sei();
unsigned char temp1=0;
unsigned char temp2=0;
while(1)
{
if (flag_uart)
{
temp1=bufer_uart[1];
temp2=array_crc8[temp1];
temp1= temp2^bufer_uart[2];
temp2=array_crc8[temp1];
if (temp2==bufer_uart[3])
{
if (bufer_uart[1]==number_modul)
{
switch(bufer_uart[2])
{
case 0x01: PORTC=1<<0; break;
case 0x02: PORTC=1<<1; break;
case 0x03: PORTC=1<<2; break;
case 0x04: PORTC=1<<3; break;
case 0x05: PORTC=1<<4; break;
case 0x06: PORTC=1<<5; break;
case 0x07: PORTC=1<<6; break;
case 0x08: PORTC=1<<7; break;
default: break;
}
}
}
flag_uart=0;
}
}
}
Вот програма на Asm но старая и под attiny2313(она не совершенна но рабочая)
Spoiler
;----------------------------
.include "tn2313def.inc"
.list
.def temp=r16
.def temp1=r17
.equ ur=51
.def ua1=r18
.def ua2=r19
.def ua3=r20
.def ua4=r21
.def crc=r22
.def tempa=r23
;-----------------------------
.macro outi
ldi temp,@1
out @0,temp
.endm
.cseg
.org 0
rjmp reset
.org 0x0013
;----------------------------
reset:
cli
outi spl,low(ramend)
outi ddra,0xff
outi ddrd,0b11111110
outi ddrb,0xff
outi porta,0x00
outi portb,0x00
outi portd,0b00000001
outi acsr,0x80
outi tccr0b,0x05
outi ubrrl,low(ur)
outi ubrrh,high(ur)
;-----------------------------------------------------------
LDI temp,0
OUT UCSRA,temp
LDI R16,(1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)
OUT UCSRB, R16
LDI R16,(1<<UCSZ0)|(1<<UCSZ1)|(0<<USBS)
OUT UCSRC, R16
;---------------------------------------------------------
ldi temp,0xFF ;сбрасываем флаги прерывания
out GIFR,temp
sei
pyro:
cli
ldi ua1,0
ldi ua2,0
ldi ua3,0
ldi ua4,0
in_1:
SBIS UCSRA,RXC
RJMP in_1
IN ua1,UDR
cpi ua1, 0xff
brne pyro
in_2:
SBIS UCSRA,RXC
RJMP in_2
IN ua2,UDR
in_3:
SBIS UCSRA,RXC ; Ждем флага прихода байта
RJMP in_3
IN ua3,UDR
in_4:
SBIS UCSRA,RXC ; Ждем флага прихода байта
RJMP in_4
IN ua4,UDR
crc8:
mov temp1, ua2
rcall ReadArray
eor temp1, ua3
rcall ReadArray
cp temp1, ua4
brne pyro
main:
ldi temp,0b00000001
cpi ua3,0x01
breq out_port
ldi temp,0b00000010
cpi ua3,0x02
breq out_port
ldi temp,0b00000100
cpi ua3,0x03
breq out_port
ldi temp,0b00001000
cpi ua3,0x04
breq out_port
ldi temp,0b00010000
cpi ua3,0x05
breq out_port
ldi temp,0b00100000
cpi ua3,0x06
breq out_port
ldi temp,0b01000000
cpi ua3,0x07
breq out_port
ldi temp,0b10000000
cpi ua3,0x08
breq out_port
rjmp pyro
;------------------------------------
out_port:
out portb,temp
rjmp pyro
;---------------------------------------------
ReadArray:
ldi ZH,High(Array*2) ;загрузка начального адреса массива
ldi ZL,Low(Array*2)
ldi Temp,0 ;прибавление внутр. адреса
add ZL,Temp1
adc ZH,Temp
lpm ;загрузка из ПЗУ
mov Temp1,R0 ;копирование в РОН
ret
Array:
.db 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65
.db 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220
.db 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98
.db 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255
.db 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7
.db 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154
.db 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36
.db 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185
.db 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205
.db 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80
.db 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238
.db 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115
.db 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139
.db 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22
.db 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168
.db 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53
AVR Studio компилирует. А в железе не работает.
Ну и изюминка(Ручной запуск)
Spoiler
Раздел: AVR