Привет! Подскажите, пожалуйста решение.
Делаю так: в переменную g пишу все, что натикало до 8, в переменную h все, что до 16 и т.д. сдвигаю это все вправо , в итоге, должно получатся все норм - выводиться отдельно три байта. (Это место в коде выделено слэшами /////////. В протеусе правый байт адекватно показывается, второй байт снова до 4 бита работает, а дальше не реагирует... Вернее , 4 бит должен бы 16 давать, а он сразу 240 показывает, как буд-то при нажатии 4 бита, нажимаются и все следующие за ним.
Не могу понять, глюк протеуса это или код кривой? Если не затруднит, проверьте у себя в протеусе. Если это не глюк протеуса, то подскажите решение, пожалуйста.
PHP код:
|
#include ‹avr/io.h› #include ‹avr/interrupt.h› #include ‹util/delay.h› #include ‹stdio.h› #include ‹stdlib.h› #include ‹stdint.h› #include "usart.h"
#define CLK PD2 // строб - сдвиг данных #define SHLD PD3 //защёлкивание входов #define BIT_IN PD4 //вход данных #define BIT 24 //количество входов-бит ...1 регистр 8 входов #define show USART_SendStr("1 ");} else {USART_SendStr("0 ");
void pause(unsigned long i) { while (--i) asm("nop"); } unsigned long int old_u, new_u;
uint32_t a; char s[24], b[3]; uint8_t c =0; unsigned char data[BIT]; //здесь будем хранить данные uint8_t g,h,r,e,i; void data_in() //функция чтения данных 74HC165 { a=0; PORTD &=~(1‹‹4);//SHLD=0; //защёлкиваем входные данные pause(1000); PORTD |=(1‹‹4);//SHLD=1; for( i=0; i‹BIT; i++ ) //цикл побитного чтения данных { pause(1000); a|=((PIND & (1‹‹PD3))‹‹i); //////////////////////////////////////////// //////////////////////////////////////////// if(i==8) { g=a››3; } if(i==16) { h=a››11; } if(i==24) { r=a››19; } ///////////////////////////////////// ////////////////////////////////////// PORTD &=~(1‹‹2);//CLK=0; //сдвигаем данные _delay_ms(1); PORTD |=(1‹‹2);//CLK=1;
data[ i ]=BIT_IN; }} void programm() { data_in(); pause(100); } int main(void) { PORTD= 0b00010101; DDRD= 0b11110111; USART_Init();
asm("sei"); while (1) { // a=a››3; /* old_u= new_u; new_u = g ||h||r; if(new_u !=old_u) { if((a››0) & 1){show} if((a››0) & 2){show} if((a››0) & 4){show} if((a››0) & 8){show} if((a››0) & 16){show} if((a››0) & 32){show} if((a››0) & 64){show} if((a››0) & 0x80){show} if((a››0) & 0x100){show} if((a››0) & 0x200){show} if((a››0) & 0x400){show} if((a››0) & 0x800){show} if((a››0) & 0x1000){show} if((a››0) & 0x2000){show} if((a››0) & 16384){show} if((a››0) & 32768){show} if((a››0) & 65536){show} if((a››0) & 131072){show} if((a››0) & 262144){show} if((a››0) & 524288){show} if((a››0) & 1048576){show} if((a››0) & 2097192){show} if((a››0) & 4194304){show} if((a››0) & 8388608){USART_SendStr("1\n\r");} else {USART_SendStr("0\n\r"); } */
sprintf(s," count is: %u %u %u\n\r", r,h,g);
//sprintf(s, "count is: %u\n\r", w); USART_SendStr(s); //} programm(); }}
|