Расширитель Входящих Сигналов Для Lpt

3-08-2013, 12:43 От: admin Посмотрели: 679
Здравствуйте форумчане !



Делаю расширитель входящих данных для LPT порта, наваял такую схему и код.



Данные передает по своему собственно-выдуманному протоколу, так как на данном этапе мне легче придумать, чем использовать уже готовое =))



Это мой первый опыт работы с ATMEGA16, да и вообще с AVR, поэтому хотелось бы услышать адекватную критику по коду и схеме..



Расширитель Входящих Сигналов Для Lpt






#include <mega16.h>
#include <delay.h>
#define pause delay_ms(10)
int pins;
void avr_init(void) {
PORTA=0xFF;
DDRA=0xFF;
PORTB=0x01;
DDRB=0x01;
PORTC=0x00;
DDRC=0x07;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
}
void peredacha(void) {

PORTC.1 = 1;
pause;
if (PINA.0 == 1){
PORTC.2 = 1;
pause;
PORTC.2 = 0;
}
else{
PORTC.2 = 1;
pause;
PORTC.2 = 0;
pause;
PORTC.2 = 1;
pause;
PORTC.2 = 0;
}
pause;
PORTC.1 = 0;
pause;

PORTC.1 = 1;
pause;
if (PINA.1 == 1){
PORTC.2 = 1;
pause;
PORTC.2 = 0;
}
else{
PORTC.2 = 1;
pause;
PORTC.2 = 0;
pause;
PORTC.2 = 1;
pause;
PORTC.2 = 0;
}
pause;
PORTC.1 = 0;
pause;

PORTC.1 = 1;
pause;
if (PINA.2 == 1){
PORTC.2 = 1;
pause;
PORTC.2 = 0;
}
else{
PORTC.2 = 1;
pause;
PORTC.2 = 0;
pause;
PORTC.2 = 1;
pause;
PORTC.2 = 0;
}
pause;
PORTC.1 = 0;
pause;

PORTC.1 = 1;
pause;
if (PINA.3 == 1){
PORTC.2 = 1;
pause;
PORTC.2 = 0;
}
else{
PORTC.2 = 1;
pause;
PORTC.2 = 0;
pause;
PORTC.2 = 1;
pause;
PORTC.2 = 0;
}
pause;
PORTC.1 = 0;
pause;

PORTC.1 = 1;
pause;
if (PINA.4 == 1){
PORTC.2 = 1;
pause;
PORTC.2 = 0;
}
else{
PORTC.2 = 1;
pause;
PORTC.2 = 0;
pause;
PORTC.2 = 1;
pause;
PORTC.2 = 0;
}
pause;
PORTC.1 = 0;
pause;

PORTC.1 = 1;
pause;
if (PINA.5 == 1){
PORTC.2 = 1;
pause;
PORTC.2 = 0;
}
else{
PORTC.2 = 1;
pause;
PORTC.2 = 0;
pause;
PORTC.2 = 1;
pause;
PORTC.2 = 0;
}
pause;
PORTC.1 = 0;
pause;

PORTC.1 = 1;
pause;
if (PINA.6 == 1){
PORTC.2 = 1;
pause;
PORTC.2 = 0;
}
else{
PORTC.2 = 1;
pause;
PORTC.2 = 0;
pause;
PORTC.2 = 1;
pause;
PORTC.2 = 0;
}
pause;
PORTC.1 = 0;
pause;

PORTC.1 = 1;
pause;
if (PINA.7 == 1){
PORTC.2 = 1;
pause;
PORTC.2 = 0;
}
else{
PORTC.2 = 1;
pause;
PORTC.2 = 0;
pause;
PORTC.2 = 1;
pause;
PORTC.2 = 0;
}
pause;
PORTC.1 = 0;
pause;

}
void main(void) {
avr_init();
// считываем состояние пинов A
pins = PINA.0+PINA.1+PINA.2+PINA.3+PINA.4+PINA.5+PINA.6+PINA.7;
while (1) {
// если состояние пинов изменилось
if(pins != PINA.0+PINA.1+PINA.2+PINA.3+PINA.4+PINA.5+PINA.6+PINA.7) {
pins = PINA.0+PINA.1+PINA.2+PINA.3+PINA.4+PINA.5+PINA.6+PINA.7;

while (PINB.0 == 0){ // если lpt занят другим контроллером
pause;
}

PORTC.0 = 1; // говорим другим контроллерам что lpt занят

peredacha();

PORTC.0 = 0;
}

}
}

Раздел: AVR

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

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


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


Опрос

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


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

Популярные новости
Календарь новостей
«    Апрель 2024    »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
2930