Приветствую! Помогите, пожалуйста с кодом.
Три входных регистра 75НС165 и atmega328p.
Проблема в том, что после 12 разряда ни USART не отзывается, ни в порты не переключаются в контроллере, если в них производить запись кода от регистров. Я думаю, что из-за того, что слишком длинное число получается, аж три байта ).
Или это у меня глюки в протеусе?
Может быть кто поможет с кодом?
Проект для AvrStudio 4.19 и для Proteus 7.9 SP1 во вложении.
Код:
#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];
//unsigned char data[BIT]; //здесь будем хранить данные
void data_in() //функция чтения данных 74HC165
{
unsigned int i=0;
a=0;
PORTD &=~(1<<4);//SHLD=0; //защёлкиваем входные данные
pause(1000);
PORTD |=(1<<4);//SHLD=1;
for( i=0; i<BIT; i++ ) //цикл побитного чтения данных
{
pause(1000);
// data[ i ]=BIT_IN;
a|=((PIND & (1<<PD3))<<i);
PORTD &=~(1<<2);//CLK=0; //сдвигаем данные
_delay_ms(1);
PORTD |=(1<<2);//CLK=1;
}}
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 = a;
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\n\r ",a); // раскомментировать и будет показывать в dec.
USART_SendStr(s);
}
programm();
}}