Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Помогите начинающему понять, почему такая программа убила ATMega8...

Отправлено DC 16 марта 2007 г. 09:04


Сильно над "сложностью" программы не смейтесь... Все, неверное, когда-то с мигания светодиодом начинали :)

Итак: скомпилено в СodeVisionAVR, зашито ей же через самодельный STK200/300. Кварц 16 МГц, кроме светодиода ничего больше к портам не подключено, керамика по питанию присутствует.

После прошивки AtMega8, в некоторые промежутки времени светодиод светился на половину яркости, похоже что оба ключа порта были приоткрыты одновременно. Хотел померить напряжение и неуспел... Мега нагрелась как кипятильник, перестала работать и шиться (теперь только греется при подаче питания). Ограничения тока питания схемы нету :( Теперь уже, безусловно, сделаю, но всё же - из за чего могут быть проблемы? Может слишком часто в порт пишу и один из ключей порта не успевает закрываться, а второй уже открывается и получаю "тиристорный эффект"? Тогда какая же максимальная частота записи в порт может быть?

Помогите, плиз. Заранее спасибо.

Вот программа:
___________________________
#include mega8.h //mega8.h в скобках, чёт в конфу не вставляются...

#define PB1 1 //светодиод на PB1, ток примерно 5мА, вкл.- "1"
#define sd_on PORTB = PORTB|0b00000010; //включить светодиод
#define sd_off PORTB = PORTB^0b00000010; //выключить светодиод
#define _sei #asm("sei"); //разрешить прерывания

unsigned char RTC;//часы
unsigned int div; //доп. делитель

interrupt [10] void timer0_overflow(void)
//увеличиваем RTC раз в секунду до значения 3, потом обнуляем
//итоговый делитель 16000000/1024/256/61 = 1 секунда
{
if (div++==61)
{
div=0;
if (RTC++==4) RTC=0;
}
}

void InitPorts(void)
//все порты в "0" и на вывод
{
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0xFF;
}

void InitTimerRTC(void)
{
TCCR0=0x05; //входная частота таймера Fclk/1024 (Fclk=16 МГц)
TCNT0=0x00; //делитель на 256
TIMSK=0x01; //разрешаем таймер 0
}

void main(void)
{
InitPorts();
InitTimerRTC();
_sei;
RTC=0;
div=0;
while (1)
{
switch (RTC)
{
case 0: sd_on;
case 1: sd_off;
case 2: sd_on;
case 3: sd_off;
}
}
}
____________________________


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
увеличьте 2 вдвое:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru