Всем, доброго времени суток. Недавно заинтересовался микроконтроллерами, но столкнулся с проблемой работы порта на вход. МК: ATTINY2313a Программатор: USBasp Датчик движения: HC-SR501 RGB светодиод с общим анодом.на 5В Подключил светодиод, задал на ножку PB0 порт на выход DDRB = 0xFF. Затем посылаю сигнал, светодиод моргает, все работает. Но если пытаюсь подключить датчик движения (провод data на ножку PD2), то на вход МК не реагирует. Порт выставлен на прием DDRD = 0x00; Наличие сигнала проверяю строчкой if(PIND2 == 1) { // код для мограния светодиода } Подключаю все напрямую, без резисторов. В документации читал, что порт на вход может принимать до 5В. Уже пробовал вытащить data провод от датчика и периодически подсоединять 5В на ножку МК. Код моргания светодиода все равно не выполняется. Датчик рабочий, т.к. при подключение к ардуино работает исправно. Подскажите пожалуйста, что я делаю не так?
спасибо, изменения видны. Но почему-то светодиод сам загорается, даже если нет движения с различным периодом, от 5 до 20 секунд
Код (C++): #include <avr/io.h> #include <avr/delay.h> #define PIND2 2 int main(void) { DDRB = 0b00000001; DDRD = 0x00; while (1) { PORTB = 0b00000001; if(PIND & (1 << 2)) { PORTB = 0b00000000; _delay_ms(1000); } } } А как его подключить? К диоду или к датчику? На сколько Ом?
Сделал следующим образом, подключил питание и землю к ардуино, всю эту схему подключил к зарядке от сотки. вынес на балкон, датчик стал реагировать на движения, но правда загорается светодиод по 2 раза с интервалом в 5 секунд (скорее всего потому что я крутил резисторы на датчике). На поведение датчика до этого момента, я грешу на программатор, мне кажется он сбрасывает состояние МК или что-то в этом роде. Да и работает он с какими то непонятными ошибками Код (Text): avrdude: warning: cannot set sck period. please check for usbasp firmware update. avrdude: AVR device initialized and ready to accept instructions avrdude: Device signature = 0x1e910a avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed To disable this feature, specify the -D option. avrdude: erasing chip avrdude: warning: cannot set sck period. please check for usbasp firmware update. avrdude: reading input file "E:\Arduino\SinaProg 2.1.1\MoveSensor.hex" avrdude: input file E:\Arduino\SinaProg 2.1.1\MoveSensor.hex auto detected as Intel Hex avrdude: writing flash (94 bytes): avrdude: 94 bytes of flash written avrdude: verifying flash memory against E:\Arduino\SinaProg 2.1.1\MoveSensor.hex: avrdude: load data flash data from input file E:\Arduino\SinaProg 2.1.1\MoveSensor.hex: avrdude: input file E:\Arduino\SinaProg 2.1.1\MoveSensor.hex auto detected as Intel Hex avrdude: input file E:\Arduino\SinaProg 2.1.1\MoveSensor.hex contains 94 bytes avrdude: reading on-chip flash data: avrdude: verifying ... avrdude: 94 bytes of flash verified avrdude: safemode: Fuses OK avrdude done. Thank you.
А так? Код (C++): #define F_CPU 1000000UL // 1 MHz #include <avr/io.h> #include <avr/delay.h> void main(void) { DDRB=0xFF; //Порт D на выход while (1) //Погнали! { if (PIND.2==0) //Если на втором пине ноль { PORTB.0=1; } // Тушим светодиод else //Если на втором пине единичка { PORTB.0=1; //то мигаем _delay_ms(200); PORTB.0=0; _delay_ms(200); } }; }
"#define PIND2 2" в код вставлять не надо. Это я привел, что этот макрос значит, чтобы было понятно, что предыдущий код делает.
Почему?Вначале было взято из CD книги Белова упр.4 выглядело так Код (C++): /***************************************************** This program was produced by the CodeWizardAVR V1.24.4 Standard Automatic Program Generator © Copyright 1998-2004 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com e-mail:office@hpinfotech.com Project : Prog4 Version : 1 Date : 06.01.2006 Author : Belov Company : Book Comments: Пример 4 Мигающий светодиод Chip type : ATtiny2313 Clock frequency : 4,000000 MHz Memory model : Tiny External SRAM size : 0 Data Stack size : 32 *****************************************************/ #include <tiny2313.h> #include <delay.h> // Declare your global variables here void main(void) { // Declare your local variables here // Crystal Oscillator division factor: 1 CLKPR=0x80; CLKPR=0x00; // Input/Output Ports initialization // Port A initialization // Func2=In Func1=In Func0=In // State2=T State1=T State0=T PORTA=0x00; DDRA=0x00; // Port B initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1 PORTB=0xFF; DDRB=0xFF; // Port D initialization // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State6=P State5=P State4=P State3=P State2=P State1=P State0=P PORTD=0x7F; DDRD=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0A output: Disconnected // OC0B output: Disconnected TCCR0A=0x00; TCCR0B=0x00; TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off // Interrupt on any change on pins PCINT0-7: Off GIMSK=0x00; MCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // Universal Serial Interface initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; while (1) { if (PIND.0==1) { PORTB.0=1; } // Тушим светодиод else { PORTB.0=1; delay_ms(200); PORTB.0=0; delay_ms(200); } }; } Под Кодвижн. Я немного поправил потому как у Человека видимо Winawr или AVR Studio. Мож где и ошибся....Но общий смысл думаю понятен?
AVS, равно как и IDE не понимают такое: Код (C++): PORTB.0=1; Это чисто Кодевижнские костылики, подозреваю, что аналог digitalWrite(), то есть функция а не прямая отправка бита в регистр. То есть и работает медленнее чем: Код (C++): PORTB |= 1;
Если не изменяли по умолчанию fuse биты, то тактовая частота 1MHz. WinAVR Код (C++): #include <avr/io.h> #define F_CPU 1000000UL #include <util/delay.h> #define WRPOTRTB PORTB // Регистр ПОРТ B #define MODEPORTB DDRB // Регистр направления данных порта В #define READPINB PINB // Регистр состояние пинов порта /* до тех пор пока датчик не сработал на линии датчика низкий уровень, если датчик сработал, то на линии датчика устанавливается высокий уровень */ #define HCSR_PIN PB0 // к этому пину подключен датчик движения #define LED_PIN PB1 // к этому пину подключен светодиод int main(void) { // настраиваем пин LED_PIN как выход, пин HCSR_PIN как выход, другие порты также входы MODEPORTB |= ( 1 << LED_PIN ); while (1) { // если датчик сработал, if ( READPINB & ( 1 << HCSR_PIN ) ) { WRPOTRTB |= ( 1 << LED_PIN ); //то включаем светодиод } else { WRPOTRTB &= ~ ( 1 << LED_PIN ); // иначе выключаем светодиод } _delay_ms(10); } }
Хех!Только что проверил-Winawr сжевал и даже НЕХ код выдал Код (C++): :1000000012C017C016C015C014C013C012C011C052 :1000100010C00FC00EC00DC00CC00BC00AC009C07C :1000200008C007C006C011241FBECFEDCDBF02D04F :100030000FC0E6CF8FEF81BB4FEF24E234EF42BB1E :10004000C9010197F1F712BAC9010197F1F7F7CF8A :04005000F894FFCF52 :00000001FF Так получается понимает?Этож битовые операции... А вообще такую фигню лучше на Асме писать и быстрее и шансов запутаться меньше.
и да, ребята, всем спасибо, за вашу помощь и отзывчивость. Я наверное недели 2 голову ломал, что не так! Еще и время свободное редко выпадает, вот ходил и грузился, что я не так сделал.