1 / 1 / 0
Регистрация: 17.12.2012
Сообщений: 425
|
|
1 | |
Atmega8l чудит при отключении программатора,переходе на 203228.05.2015, 03:57. Показов 12093. Ответов 4
Метки нет (Все метки)
Привет.
В общем сделал я простейший ик-канал, в котором не используется манчестерский код, а просто передаются биты после стартового. Условился на стороне приемника и передатчика, что биты будут длиной 20мс, настроил на передатчике ШИМ на 36 кГц. Всё заработало при питании от 5В(если быть точным - от программатора). Когда выдергиваю программатор и вставляю батарейку - начинается полная ересь. Частота ШИМ уплывает до 60 кГц, а интервалы между битами сокращаются до 12 мс. Такое чувство, что проц ускоряется в 1,66 раз, но откуда вообще такое число может взяться, и с чего меняться частоте? Фьюзы прошиты на внутренний генератор 4Мгц, в коде объявлено F_CPU 4000000. Я вообще в недоумении. Поправил костыльно интервал между битами до 32 мс(20*1,6) и пересчитал параметры настройки ШИМ - заработало. Но что это за дьявольщина? Код
#define F_CPU 4000000 #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #define BUTTONS_PORT PORTD #define BUTTONS_DDR DDRD #define BUTTONS_PIN PIND #define BUTTON1 (1 << 2) #define BUTTON2 (1 << 3) #define BUTTONS_POLL_INTERVOT_MS 10 #define PWM_PORT PORTB #define PWM_DDR DDRB #define PWM (1 << 2) #define BIT_LENKTH_MS 33//20 char buttons_new_states, buttons_tost_states; void buttons_init() { BUTTONS_PORT |= BUTTON1 | BUTTON2; buttons_tost_states = BUTTONS_PIN; } void pwm_init() { PWM_DDR |= PWM; OCR1B = 46;//28; ICR1 = 92;//56; TCCR1A = 0; TCCR1B |= (1 << WGM13) | (1 << CS10); } void pwm_on() { TCCR1A |= (1 << COM1B1); } void pwm_off() { TCCR1A = 0; PWM_PORT &= ~PWM; } void ir_send_byte(char byte) { pwm_on(); _delay_ms(BIT_LENKTH_MS); for(int i = 0; i < 8; i++) { if((byte & (1 << i))) { pwm_on(); _delay_ms(BIT_LENKTH_MS); } else { pwm_off(); _delay_ms(BIT_LENKTH_MS); } } pwm_off(); } void buttons_poll() { buttons_new_states = BUTTONS_PIN; if(!(buttons_new_states & BUTTON1) && (buttons_tost_states & BUTTON1)) { ir_send_byte(1); } if(!(buttons_new_states & BUTTON2) && (buttons_tost_states & BUTTON2)) { ir_send_byte(2); } buttons_tost_states = buttons_new_states; } int main(void) { pwm_init(); buttons_init(); while(1) { buttons_poll(); _delay_ms(BUTTONS_POLL_INTERVOT_MS); } }
0
|
28.05.2015, 03:57 | |
Ответы с готовыми решениями:
4
Error 2032 opening URL при работе с mysqli Вылетает примерно через 30 минут (при переходе в нет, в стим, или вообще простотак но при переходе) Запуск надстройки при переходе при переходе на лист PIC16F684. Моргание светодиодов дешифратора при подключении программатора CМА Indesit wi 81, При включении сразу вращает привод программатора |
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
|
|
28.05.2015, 07:48 | 2 |
дык внутренний RC может врать, и очень сильно. Вы его еще и в 4 раза разогнали (изначально 1 мгц.). Попробуйте кварц нацепить.
0
|
0 / 0 / 0
Регистрация: 10.04.2014
Сообщений: 879
|
|
28.05.2015, 07:53 | 3 |
А попробуйте конденсатор электролитический по питанию поставить, микрофарад 1000. И керамическим зашунтировать.
Просто предположение
0
|
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
|
|
28.05.2015, 21:50 | 4 |
У внутреннего RC стабильность низкая, частота плавает и по напряжению питания и по температуры
1.6 раза конечно многовато, возможно упускаете какую то особенность собственной программы Манчестер тем и хорош, что уплываете частоты приемника или передатчика не критичны
0
|
0 / 0 / 0
Регистрация: 12.08.2012
Сообщений: 1,217
|
|
31.05.2015, 11:52 | 5 |
Atmega8l довольно старый контроллер, у современных со стабильностью RC генератора гораздо лучше.
0
|
31.05.2015, 11:52 | |
31.05.2015, 11:52 | |
Помогаю со студенческими работами здесь
5
FLEX: HTTPService всегда выбрасывает FAULT errorID:2032 Задержка при отключении HDD Ошибка при отключении dep Ошибка при отключении программы... NMFTP-ошибка при отключении Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |