Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/66: Рейтинг темы: голосов - 66, средняя оценка - 4.64
1 / 1 / 0
Регистрация: 17.12.2012
Сообщений: 425
1

Atmega8l чудит при отключении программатора,переходе на 2032

28.05.2015, 03:57. Показов 12093. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет.
В общем сделал я простейший ик-канал, в котором не используется манчестерский код, а просто передаются биты после стартового.
Условился на стороне приемника и передатчика, что биты будут длиной 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.05.2015, 03:57
Ответы с готовыми решениями:

Error 2032 opening URL при работе с mysqli
Добрый вечер. Пытаюсь вызвать из клиента на flash функцию php c запросом в БД через mysqli. Всё...

Вылетает примерно через 30 минут (при переходе в нет, в стим, или вообще простотак но при переходе)
Здравствуйте у меня windows вылетает на синий экран, внизу появляется отсчет до 100 потом он сам...

Запуск надстройки при переходе при переходе на лист
Добрый вечер! Подскажите, есть ли способ автоматического запуска надстройки при переходе к...

PIC16F684. Моргание светодиодов дешифратора при подключении программатора
прошил PIC16F684 на зажигание светодиода, если на входе еденичка то зажигает светодиод, если ноль...

CМА Indesit wi 81, При включении сразу вращает привод программатора
При включении кнопки,сразу вращается привод программатора без перерыва. Ошибку не выдаёт....

4
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.05.2015, 11:52
Помогаю со студенческими работами здесь

FLEX: HTTPService всегда выбрасывает FAULT errorID:2032
Доброго времени суток, ребята. Произошло следующее: Ещё вчера, я наладил связь между скриптиком...

Задержка при отключении HDD
Здравствуйте!вопрос вот в чем. если жесткий диск или Raid массив отключить от компа,то система...

Ошибка при отключении dep
здравствуйте. пытаюсь отключить dep командой bcdedit.exe /set {current} nx AlwaysOff но получаю...

Ошибка при отключении программы...
Доброго времени суток Господа, И как всегда ошибка, но только с ней я столкнулся в конце.... Ну...

NMFTP-ошибка при отключении
пишу клиент ФТП через компонент NMFTP у меня при отключении (NMFTP-&gt;Disconnect()) возникает ошибка:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru