Перейти к содержанию

deemn72835

Members
  • Постов

    9
  • Зарегистрирован

  • Посещение

Весь контент deemn72835

  1. Появляется проблема при подключении ультразвукового датчика расстояния HC-SRC4 к МК avr Tiny2313A, когда загружаю готовую прошивку в МК. Когда проверяю в Протеус, то код работает. Подскажите в чем может быть проблема?
  2. Вопрос к тем кто имел дело с подключением ультразвукового датчика HC-SRC4 к avr микроконтроллеру, именно к attiny 2313a. Подскажите как написать код программы на СИ. В интернете нашел несколько статей для других МК. Пробовал переписать в CodevisionAVR, но ничего так и не заработало. В некоторых случаях датчик издает щелчки некоторое время, но по UART не передает. Из статей понял, что нужно отправлять импульс и ловить его с помощью таймера через внешнее прерывание. После компиляции в Codevision выдает ошибку Warning: overflow is possible in 16 bit multiplication, casting to 'long' may be required, также когда переписывал заметил что в attiny2313a в UART нет регистра URSEL. Вот код, подскажите где неправильно: #define F_CPU 8000000UL #include <tiny2313a.h> #include <delay.h> #include <stdio.h> //определяем ножку Echo #define Echo_PORT PORTD #define Echo_DDR DDRD #define Echo_PIN PIND #define Echo_N 3 //определяем ножку Trig #define Trig_PORT PORTD #define Trig_DDR DDRD #define Trig_PIN PIND #define Trig_N 4 void HC_SRC4_Init(void) { //устанавливаем ножки на выход и вход соответственно Trig_DDR |= 1<<Trig_N; Trig_PORT &= ~(1<<Trig_N); Echo_DDR &= ~(1<<Echo_N); Echo_PORT &= ~(1<<Echo_N); } void HC_SRC4_Send_strob(void) // отправляем 20мкс Строб { Trig_PORT |= 1<<Trig_N; //устанавливаем ЛОГ 1 delay_us(20); //длительность импульса Trig_PORT &= ~(1<<Trig_N); //устанавливаем ЛОГ 0 } void init_interp (void) //разрешение прерываний по любому фронту { MCUCR |=(1<<ISC10); //Прерывание по любому фронту GIFR |= (1<<INT1); //разрешение прерывания на INT0 } #define Start 1 #define Stop 0 unsigned int timer_Start_Stop (char flag) //функция Запуска и Остановки { unsigned int rez; // для хранения тактов if(flag) { TCNT1H = 0; //обнуляем TCNT1L = 0; TCCR1B |=(1<<CS11); //запуск таймера с предделителем 8 } else { TCCR1B &= ~(1<<CS11); //Останавливаем таймер rez = TCNT1H; rez <<= 8; rez |=TCNT1L; return rez; } } //функция преобр числа насчитанных тактов в растояние unsigned int HC_SRC4_Convert_CM (unsigned int N_t) { unsigned long int C; C = N_t * 8; //определяем время импульса C /= 58; // вычисляем расстояние в сантиметрах C +=2; return (unsigned int)C; } unsigned int N_takt=0; interrupt [EXT_INT1] void ext_int1_isr(void) { if(Echo_PIN & (1<<Echo_N)) //если передний фронт timer_Start_Stop (Start); //Запускаем таймер else //если задний фронт N_takt = timer_Start_Stop (Stop); //останавливаем таймер } unsigned int HC_SRC4_Get_CM (void) { HC_SRC4_Send_strob(); //отправляем строб delay_ms(100); return HC_SRC4_Convert_CM(N_takt); //возвращаем значение в СМ } #define BAUD 2400 #define UBRR_VAL F_CPU/16/BAUD-1 void usart_init (unsigned int speed) { // устанавливаем скорость Baud Rate: 4800 UBRRH=(unsigned char)(speed>>8); UBRRL=(unsigned char) speed; UCSRA=0X00; UCSRB|=(1<<TXEN)|(1<<RXEN);// Разрешение работы приемника // Установка формата посылки: 8 бит данных, 1 стоп-бит UCSRC=(1<<UCSZ1)|(1<<UCSZ0); } //функция передачи инф по юарт с контролем флага void Uart_tr (char s[]) { char k; for (k=0;s[k]!=0;k++) { UDR=s[k]; while(!(UCSRA&(1<<TXC)));//ждем окончания передачи UCSRA|=(1<<TXC);//сбрасываем флаг } } // Standard Input/Output functions void main(void) { char Buuf[10]; // Declare your local variables here // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=(1<<CLKPCE); CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0); #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Input/Output Ports initialization // Port A initialization // Function: Bit2=In Bit1=In Bit0=In DDRA=(0<<DDA2) | (0<<DDA1) | (0<<DDA0); // State: Bit2=T Bit1=T Bit0=T PORTA=(0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); // Port B initialization // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Port D initialization // Function: Bit6=In Bit5=In Bit4=Out Bit3=In Bit2=In Bit1=In Bit0=In DDRD=(0<<DDD6) | (0<<DDD5) | (1<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0); // State: Bit6=T Bit5=T Bit4=0 Bit3=T Bit2=T Bit1=T Bit0=T PORTD=(0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0); // External Interrupt(s) initialization // INT0: Off // INT1: On // INT1 Mode: Any change // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-10: Off // Interrupt on any change on pins PCINT11-17: Off MCUCR=(0<<ISC11) | (1<<ISC10) | (0<<ISC01) | (0<<ISC00); GIMSK=(1<<INT1) | (0<<INT0) | (0<<PCIE0) | (0<<PCIE2) | (0<<PCIE1); GIFR=(1<<INTF1) | (0<<INTF0) | (0<<PCIF0) | (0<<PCIF2) | (0<<PCIF1); // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 2400 UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM); UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (1<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8); UCSRC=(0<<UMSEL1) | (0<<UMSEL0) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL); UBRRH=0x00; UBRRL=0xCF; HC_SRC4_Init(); usart_init(UBRR_VAL); init_interp(); // Global enable interrupts #asm("sei") while (1) { sprintf(Buuf,"%d ",HC_SRC4_Get_CM()); Uart_tr(Buuf); delay_ms(900); } }
  3. Надо понимать на выходе было 25 вольт, а на входе не было совсем? Или как На входе 25вольт с трансформатора, а на общем выходе (т.е. там где два регулятора напряжения подключенных через переключатель) напряжение также 25в. Заменил lm317t на новую, убрав второй регулятор, теперь схема работает, т.е. 12в, как и рассчитал. Теперь буду думать как правильно подключить регулятор для 5в через переключатель.
  4. Схемы не делал, просто на выходе поставил ещё один регулятор, возможно поэтому сгорел lm317t ?
  5. deemn72835

    Бп На Lm317T

    Собрал простой блок питания на регуляторе lm317t по этой схеме. На выходе было 12в, дальше захотел поставить переключатель, чтобы переключаться 12 - 5 вольт, на 5 вольт поставил готовый регулятор собранный отдельно. Все вместе соединил в один выход , т.е. чтобы переключалось и на выходе было нужное напряжение. Когда подключил, напряжения не было, после lm317t напряжение 25в. Вывод сгорел регулятор, подскажите как проверить.
  6. Разобрался, можно с фоторезистором, нужно было сделать делитель напряжения, подобрав необходимый резистор, тему можно закрывать.
  7. Есть фоторезистор, хочу использовать для включения/отключения напряжения высокого уровня, т.е. в темноте сопротивление резистора имеет большое значение и напряжение не поступает, при освещении сопротивление падает и напряжение появляется. Подключаю к драйверу двигателя L293D не работает, работает на обычный резистор, т.е. не срабатывает при затемнении, всегда проводит ток от плюса к L293D.
  8. Если добавить второй микросхему 555, можно подсоединить противоположно первой ? Как подать противоположное напряжение с двухполярным питанием?
  9. Подскажите как подключить двигатель постоянного тока на 5в к 555 таймеру для управления двигателем, чтобы управлять в обоих направлениях.
×
×
  • Создать...