#include "_global.h"
 
#include "_output.h"
 
#include "_uart.h"
 
#include <util/delay_basic.h>
 
 
 
//-----------------------------------------------------------------------------
 
 
 
void PinTest(void)
 
{
 
 u8 err, tmp;
 
 
 
 err=0;                                         // проверка ножки UART TX
 
 PORTD|=(1<<PD3);
 
 _delay_loop_1(3);
 
 if (!(PIND&(1<<PD3))) err|=0x01;
 
 PORTD&=~(1<<PD3);
 
 DDRD|=(1<<PD3);
 
 _delay_loop_1(3);
 
 if (PIND&(1<<PD3)) err|=0x02;
 
 DDRD&=~(1<<PD3);
 
 
 
 if (err)                                       // проблемы с ножкой UART TX
 
 {                                              // хаотически мигаем св.диодом
 
  DDRB|=(1<<PB7);
 
  while (1)
 
  {
 
   PORTB&=~(1<<PB7);                            // led off
 
   if (random8()&0x01) PORTB|=(1<<PB7);        // led on
 
   _delay_loop_2(0x6c00);
 
  }
 
 }
 
                                                // проблем с ножки UART TX нет -
 
 directuart_init();                             // - задействуем UART без буфера FIFO
 
 directuart_crlf();
 
 directuart_crlf();
 
 directuart_crlf();
 
 print_msg(msg_title1);
 
 print_short_vers();
 
 print_mlmsg(mlmsg_pintest);
 
                                                // проверка ножек. 1 этап.
 
 PORTA=0b01010101;
 
 DDRA =0b10101010;
 
 PORTB=0b10000010;
 
 DDRB =0b00000101;
 
 PORTC=0b00010101;
 
 DDRC =0b00001010;
 
 PORTD|= (1<<PD5);
 
 DDRD &=~(1<<PD5);
 
 PORTE|= (1<<PE0);
 
 DDRE &=~(1<<PE0);
 
 PORTE&=~(1<<PE1);
 
 DDRE |= (1<<PE1);
 
 PORTG=0b00010101;
 
 DDRG =0b00001010;
 
 _delay_loop_2(276); // 100 us
 
 
 
 err=0;
 
 tmp=PINA;
 
 if (tmp!=0b01010101) err|=0x01;
 
 tmp=PINB;
 
 if ((tmp&0b10000111)!=0b10000000) err|=0x02;
 
 tmp=PINC;
 
 if ((tmp&0b00011111)!=0b00010101) err|=0x04;
 
 if (!(PIND&(1<<PD5))) err|=0x08;
 
 tmp=PINE;
 
 if ((tmp&0b00000011)!=0b00000001) err|=0x10;
 
 tmp=PING;
 
 if ((tmp&0b00011111)!=0b00010101) err|=0x20;
 
                                                // проверка ножек. 2 этап.
 
 PORTA=0b10101010;
 
 DDRA =0b01010101;
 
 PORTB=0b00000101;
 
 DDRB =0b10000010;
 
 PORTC=0b00001010;
 
 DDRC =0b00010101;
 
 PORTD&=~(1<<PD5);
 
 DDRD |= (1<<PD5);
 
 PORTE&=~(1<<PE0);
 
 DDRE |= (1<<PE0);
 
 PORTE|= (1<<PE1);
 
 DDRE &=~(1<<PE1);
 
 PORTG=0b00001010;
 
 DDRG =0b00010101;
 
 _delay_loop_2(276); // 100 us
 
 
 
 tmp=PINA;
 
 if (tmp!=0b10101010) err|=0x01;
 
 tmp=PINB;
 
 if ((tmp&0b10000111)!=0b00000101) err|=0x02;
 
 tmp=PINC;
 
 if ((tmp&0b00011111)!=0b00001010) err|=0x04;
 
 if (PIND&(1<<PD5)) err|=0x08;
 
 tmp=PINE;
 
 if ((tmp&0b00000011)!=0b00000010) err|=0x10;
 
 tmp=PING;
 
 if ((tmp&0b00011111)!=0b00001010) err|=0x20;
 
                                                // итог, печать результата
 
 if (err)
 
 {
 
  u16 ptr;
 
  ptr=0x0020;
 
  while (ptr<0x003c) *(u8*)(ptr++)=0;
 
  ptr=0x0061;
 
  while (ptr<0x0066) *(u8*)(ptr++)=0;
 
  print_mlmsg(mlmsg_pintest_error);
 
  if (err&0x01) print_msg(msg_pintest_pa);
 
  if (err&0x02) print_msg(msg_pintest_pb);
 
  if (err&0x04) print_msg(msg_pintest_pc);
 
  if (err&0x08) print_msg(msg_pintest_pd);
 
  if (err&0x10) print_msg(msg_pintest_pe);
 
  if (err&0x20) print_msg(msg_pintest_pg);
 
  print_mlmsg(mlmsg_halt);
 
  while (1) {}
 
 }
 
 else
 
 {
 
  print_mlmsg(mlmsg_pintest_ok);
 
 }
 
}
 
 
 
//-----------------------------------------------------------------------------