Форум РадиоКот https://radiokot.ru/forum/ |
|
3 x 74HC165 и atmega328. глюки Протеуса или что? https://radiokot.ru/forum/viewtopic.php?f=57&t=153772 |
Страница 1 из 1 |
Автор: | Sel4 [ Ср мар 28, 2018 18:38:38 ] | ||
Заголовок сообщения: | 3 x 74HC165 и atmega328. глюки Протеуса или что? | ||
Приветствую! Помогите, пожалуйста с кодом. Три входных регистра 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(); }}
|
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |