Здравствуйте форумчане !
Делаю расширитель входящих данных для LPT порта, наваял такую схему и код.
Данные передает по своему собственно-выдуманному протоколу, так как на данном этапе мне легче придумать, чем использовать уже готовое =))
Это мой первый опыт работы с ATMEGA16, да и вообще с AVR, поэтому хотелось бы услышать адекватную критику по коду и схеме..
Раздел: AVR
Делаю расширитель входящих данных для LPT порта, наваял такую схему и код.
Данные передает по своему собственно-выдуманному протоколу, так как на данном этапе мне легче придумать, чем использовать уже готовое =))
Это мой первый опыт работы с ATMEGA16, да и вообще с AVR, поэтому хотелось бы услышать адекватную критику по коду и схеме..
#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