Pyroignitioncontrol И Модули К Нему. Пишем Прошивку Вместе.

2-07-2014, 23:45 От: admin Посмотрели: 471
Уже как год хочу сделать пиропульт компютерный, но увы небыло знаний. А сейчас и знания и железо появилось.



Есть бесплатная МУЗЫКАЛЬНАЯ програма запуска салютов, но модули к ней стоят очень и не дешево.



Вот програма:

Сылка на програму и на сигнал модулей.

http://alexval2007.u...l_v1_4/2-1-0-27

http://alexval2007.u.../forum/36-183-1

пиро.png






Вот код что написал я для одного модуля на базе 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

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться, либо войти на сайт под своим именем.

Обсудить на форуме


На момент добавления Pyroignitioncontrol И Модули К Нему. Пишем Прошивку Вместе. все ссылки были рабочие.
Все публикации статей, книг и журналов, представлены на этом сайте, исключительно для ознакомления,
авторские права на эти публикации принадлежат авторам статей, книг и издательствам журналов!
Подробно тут | Жалоба
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.


Опрос

Ваши предпочтения в TRX


Одинарное преобразование
Двойное преобразование
Прямое преобразование
SDR
Другое
Мне всё равно

Популярные новости
Календарь новостей
«    Май 2024    »
ПнВтСрЧтПтСбВс
 12345
6789101112
13141516171819
20212223242526
2728293031