Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс. e-mail:jobsmp@pochta.ru |
Итак: скомпилено в С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;
}
}
}
____________________________