Инициализация ATMega8515
Инициализация ATMega8515
Добрый день. Нахимичил тут четырёхканальную систему управления нагрузками по ИК каналу от пульта с функцией запоминания включённого канала на случай пропадания питания. Мне непонятно поведение микроконтроллера при включении. Для отладки я ипользовал отладочную плату EasyAVR5A. На выход микроконтроллера (port B) я подключил светодиоды каждый из которых имитирует включение канала. Так вот при включении вроде происходит чтение из eeprom загорается нужный светодиод но вот как он загорается... Сначала яркость его уменьшается, видно легкое мерцание потом вообще он не горит, а потом нормально включается. При нажатии кнопки "reset" всё работает нормально. Включал различные опции при запуске 6 тактовых импульсов+4.1ms задержка , 6 тактовых импульсов+65 ms задержка, вкючал монитор питания на 4.0 V. Всё бестолку только менялся характер мерцания светодиода и всё равно происходилое его гашение потом включение. Что самое интересное нажимая и удерживая кнопку "reset" а потом подавая напряжение питания светодиод всё равно на какоето мгновение загорается и гаснет. Мне казалось что сброс должен происходить сразу при подачи питания. Объясните пожалуйста почему так происходит. Нужно добиться чёткого включения светодиода, а в дальнейшем релюшки.
- Реклама
- Engineer_Keen
- Друг Кота
- Сообщения: 3872
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: Инициализация ATMega8515
Очевидно что при включении, перед тем как начать нормально управлять нагрузками МК дергает этими ножками. Без кода и схемы сложно судить, может он там по SPI с чем-то обменивается, а SPI как раз на порту B сидит.
Re: Инициализация ATMega8515

В данной системе задействованы два таймера и четыре прерывания. Код для обработки протокола RC5 взял из статьи Aheir-а "Некоторые протоколы ик пультов. Часть вторая" чуть-чуть пришлось доработать (на самом деле схема немного сложнее). Кнопки на схеме дублируют кнопки на пульте как в телвизоре что бы можно было управлять и без пульта. На LCD отображается что в данный момент включено. Ни о каком SPI нет и речи я ещё до этого не вырос. Программа написана в CodeVisionAVR 2.05 и инициализация там вроде стандартная
Код: Выделить всё
#include <mega8515.h>
#include <delay.h>
#include <lcd.h>
#include <rc-5.c>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
eeprom unsigned char eep_port=0;
bit btn_push=0; // Флаг нажатой кнопки, если нажата то btn_push=1, если нет то 0.
void channelON(unsigned char num){
if(btn_push==0){
delay_us(250);
PORTB=num;
eep_port=num;
channelDISP(PORTB); // функция для отбражения включённого канала на диплее.
}
}
void main(void)
{
PORTA=0xFF;
DDRA=0x00;
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0xFF;
PORTD=0xFF;
DDRD=0x00;
PORTE=0xFF;
DDRE=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x03;
OCR1AL=0x7F;
OCR1BH=0x00;
OCR1BL=0x00;
GICR|=0x40;
MCUCR=0x01;
EMCUCR=0x00;
GIFR=0x40;
TIMSK=0xC2;
mode=eep_mode;
PORTB=eep_port;
lcd_init(16);
channelDISP(PORTB);
#asm("sei")
while (1){
if(PINA.0==0||command==0x3E){ channelON(1); btn_push=1; }
if(PINA.1==0||command==0x38){ channelON(2); btn_push=1; }
if(PINA.2==0||command==0x39){ channelON(4); btn_push=1; }
if(PINA.3==0||command==0x3B){ channelON(8); btn_push=1; }
if((PINA==0xFF)&&(command==0x00)&&(btn_push==1)){ delay_us(250); btn_push=0; }
}
}
Последний раз редактировалось radiolim Ср апр 06, 2011 06:43:29, всего редактировалось 2 раза.
- Engineer_Keen
- Друг Кота
- Сообщения: 3872
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: Инициализация ATMega8515
А что после "и.т.д"? Там же самая развязка сюжета должна быть 
Re: Инициализация ATMega8515
Немного дописал код постами выше, хотя врядли это что-то даст. В переменной "command" (она определена в коде rc5) сидит код посылаемый пультом, в дальнейшем она обнуляется остальное думаю и так ясно.
- Реклама

