Мелкие вопросы по МК и ПЛИС.
-
demiurg301
- Опытный кот
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Re: Мелкие вопросы по МК и ПЛИС.
Помогите разобраться пожалуйста c прерыванием Atmega128
Подцепил кнопку к выводу INT4 и подтяжку в 20К.
Нажимаю кнопку - срабатывает прерывание - всё нормально
Ухожу в power-down - почему то по нажатию не выходит из sleep.
Вот такие настройки
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: Off
// INT2: Off
// INT3: Off
// INT4 Mode: Falling Edge
// INT5: Off
// INT6: Off
// INT7: Off
EICRA=0x02;
EICRB=0x02;
EIMSK=0x11;
EIFR=0x11;
В даташите в таблице про выход из power-down вот что написано :
Only INT3:0 or level interrupt INT7:4
Что есть level interrupt?
Подцепил кнопку к выводу INT4 и подтяжку в 20К.
Нажимаю кнопку - срабатывает прерывание - всё нормально
Ухожу в power-down - почему то по нажатию не выходит из sleep.
Вот такие настройки
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: Off
// INT2: Off
// INT3: Off
// INT4 Mode: Falling Edge
// INT5: Off
// INT6: Off
// INT7: Off
EICRA=0x02;
EICRB=0x02;
EIMSK=0x11;
EIFR=0x11;
В даташите в таблице про выход из power-down вот что написано :
Only INT3:0 or level interrupt INT7:4
Что есть level interrupt?
- Engineer_Keen
- Друг Кота
- Сообщения: 3868
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: Мелкие вопросы по МК и ПЛИС.
demiurg301 писал(а):Что есть level interrupt?
Прерывание по уровню, т.е. когда например низкий уровень на ноге прерывание сработает, а от перепада 1-0 или 0-1 - нет.
-
demiurg301
- Опытный кот
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Re: Мелкие вопросы по МК и ПЛИС.
Engineer_Keen писал(а):demiurg301 писал(а):Что есть level interrupt?
Прерывание по уровню, т.е. когда например низкий уровень на ноге прерывание сработает, а от перепада 1-0 или 0-1 - нет.
Не работает
В активном режиме срабатывает - в power_down не хочет.
- Engineer_Keen
- Друг Кота
- Сообщения: 3868
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: Мелкие вопросы по МК и ПЛИС.
Ну так в EICRB стоит 0x02 - прерывание по falling edge (по спаду), а надо 0x00 - по low level (низкий уровень).
- Av4arik
- Поставщик валерьянки для Кота
- Сообщения: 1954
- Зарегистрирован: Чт янв 20, 2011 16:47:18
- Откуда: Старый Оскол
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
чем отличается PIC16F629 от 12F629? прошивка от 12F на 16F подойдет?
Быстро, Качественно, Недорого.
Выбрать можно только 2 варианта.
Выбрать можно только 2 варианта.
-
demiurg301
- Опытный кот
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Re: Мелкие вопросы по МК и ПЛИС.
Engineer_Keen писал(а):Ну так в EICRB стоит 0x02 - прерывание по falling edge (по спаду), а надо 0x00 - по low level (низкий уровень).
Ага, разобрался... Спасибо.
Re: Мелкие вопросы по МК и ПЛИС.
Картинки уменьшаем!
ploop
Есть несколько мелких вопросов по подключению дисплея к мк(stm32f100rb). Есть довольно муторный и недокументированный дисплей от motorola c155/c156. Ранее он уже обсуждался на форуме но завести его так и не смогли. Дисплей подключается по i2c.
Первое, хотелось бы узнать, обязательно ли вешать кондей на VLCD?
Второе, обязательно ли вешать резисторы на SDO и SCLK? Мк и так подаёт нужное питание в 3.3 в. (к слову, SDO и SCLK я правильно принимаю за SDA и CLK?)
Вот схемка подключения дисплея из даташита c155:
http://s59.radikal.ru/i163/1201/97/c4ddff5c5023.jpg
Дальше немного програмной части. I2C категорически виснет на проверке загруженности:
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
при этом если дотронуться до контактов CLK и SDA то выходит из цикла, но после старта и очередной проверки на свободность падает замертво. Вот код инициализации интерфейса и подачи напряжения на дисплей:
Тактирование:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
сама работа с дисплеем:
ploop
Есть несколько мелких вопросов по подключению дисплея к мк(stm32f100rb). Есть довольно муторный и недокументированный дисплей от motorola c155/c156. Ранее он уже обсуждался на форуме но завести его так и не смогли. Дисплей подключается по i2c.
Первое, хотелось бы узнать, обязательно ли вешать кондей на VLCD?
Второе, обязательно ли вешать резисторы на SDO и SCLK? Мк и так подаёт нужное питание в 3.3 в. (к слову, SDO и SCLK я правильно принимаю за SDA и CLK?)
Вот схемка подключения дисплея из даташита c155:
http://s59.radikal.ru/i163/1201/97/c4ddff5c5023.jpg
Дальше немного програмной части. I2C категорически виснет на проверке загруженности:
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
при этом если дотронуться до контактов CLK и SDA то выходит из цикла, но после старта и очередной проверки на свободность падает замертво. Вот код инициализации интерфейса и подачи напряжения на дисплей:
Тактирование:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
сама работа с дисплеем:
Код: Выделить всё
GPIO_InitTypeDef gpio;
GPIO_StructInit(&gpio);
gpio.GPIO_Mode = GPIO_Mode_Out_PP;
gpio.GPIO_Pin = DISPLAY_VDD;
gpio.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &gpio);
GPIO_WriteBit(GPIOB, DISPLAY_VDD, 1);//Подаём питание на дисплей
Delay(5);//Ждём чуть-чуть
//Активируем nCS, nRESET
GPIO_StructInit(&gpio);
gpio.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
gpio.GPIO_Speed = GPIO_Speed_2MHz;
gpio.GPIO_Mode = GPIO_Mode_Out_PP;;
GPIO_Init(GPIOC, &gpio);
GPIO_WriteBit(GPIOC, GPIO_Pin_6|GPIO_Pin_7, 1);
//активируем i2c
GPIO_StructInit(&gpio);
gpio.GPIO_Pin = DISPLAY_SCL | DISPLAY_SDA;
gpio.GPIO_Speed = GPIO_Speed_10MHz;
gpio.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &gpio);
I2C_InitTypeDef I2C_InitStructure;
/* I2C configuration */
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x77;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 200000;
I2C_Cmd(I2C2, ENABLE);
/* Apply I2C configuration after enabling it */
I2C_Init(I2C2, &I2C_InitStructure);
GPIO_WriteBit(GPIOC, LED1, 1);
GPIO_WriteBit(GPIOC, LED2, 0);
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));//Зависает
/* Send START condition */
I2C_GenerateSTART(I2C2, ENABLE);
/* Test on EV5 and clear it */
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
GPIO_WriteBit(GPIOC, LED1, 0);
GPIO_WriteBit(GPIOC, LED2, 1);
/* While the bus is busy */
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));//зависает окончательно
GPIO_WriteBit(GPIOC, LED1, 0);
GPIO_WriteBit(GPIOC, LED2, 0);
/* Send START condition */
I2C_GenerateSTART(I2C2, ENABLE);
/* Test on EV5 and clear it */
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
/* Send EEPROM address for write */
I2C_Send7bitAddress(I2C2, 0x0b, I2C_Direction_Transmitter);
/* Test on EV6 and clear it */
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
-
demiurg301
- Опытный кот
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Re: Мелкие вопросы по МК и ПЛИС.
Такой вопрос всплыл по прерываниям опятьже
Есть вот прерывание по low level:
Код такой.
Значица надобно словить прерывание и отключить его. А когда надо - > включить обратно. Сигнал может быть и длительный Т.е. допустим геркон замкнулся - и постоянная подтяжка на ноль.
Проблема в чём - когда я включаю его обратно - тут же срабатывает прерывание выключает это прерывание и уходит спать. Если же не выключать его - контроллер виснет в прерывании - каждые 4 такта срабатывает
Как с этим быть?
Есть вот прерывание по low level:
Код такой.
Код: Выделить всё
interrupt [EXT_INT4] void ext_int4_isr(void)
{
// Place your code here
EIMSK&=0x01; //отключаю прерывание
SetBit(MICRO_CONTROL,LED);
delay_ms(200);
ClearBit(MICRO_CONTROL,LED);
};
void main(void)
{
...............................
инициализация контроллера и всякий хлам :)
...............................
while(1)
{
//Ещё всякий разный код
.....
EIMSK=0x11;
EIFR=0x11;
powerdown();
};
};Значица надобно словить прерывание и отключить его. А когда надо - > включить обратно. Сигнал может быть и длительный Т.е. допустим геркон замкнулся - и постоянная подтяжка на ноль.
Проблема в чём - когда я включаю его обратно - тут же срабатывает прерывание выключает это прерывание и уходит спать. Если же не выключать его - контроллер виснет в прерывании - каждые 4 такта срабатывает
- КРАМ
- Друг Кота
- Сообщения: 25132
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Мелкие вопросы по МК и ПЛИС.
Нужно использовать прерывание ПО ИЗМЕНЕНИЮ СОСТОЯНИЯ ПОРТА. Только не забывать в обработчике читать этот порт, а то флаг не сбросится.
-
demiurg301
- Опытный кот
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Re: Мелкие вопросы по МК и ПЛИС.
КРАМ писал(а):Нужно использовать прерывание ПО ИЗМЕНЕНИЮ СОСТОЯНИЯ ПОРТА. Только не забывать в обработчике читать этот порт, а то флаг не сбросится.
НЕ катит. У мну low level выводит из powerdown. По изменению не проснётся.
- Engineer_Keen
- Друг Кота
- Сообщения: 3868
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: Мелкие вопросы по МК и ПЛИС.
КРАМ писал(а):Нужно использовать прерывание ПО ИЗМЕНЕНИЮ СОСТОЯНИЯ ПОРТА.
Ему нельзя, у него power-down, там только по уровню.
Получается такая ситуация:
Срабатывает прерывание, в обработчике оно отключается обнулением бита в маске EIMSK, но в тоже время геркон все еще находится в замкнутом состоянии и это вызывает запись флага в регистре статуса.
В какой-то момент вы включаете прерывание записью в EIMSK, а ведь в регистре статуса остался флаг, вот прерывание и срабатывает.
Нужно перед той строчкой, где включается прерывание обнулять этот флаг.
-
demiurg301
- Опытный кот
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Re: Мелкие вопросы по МК и ПЛИС.
Engineer_Keen писал(а):
Нужно перед той строчкой, где включается прерывание обнулять этот флаг.
Этот?
EIFR
Сделал так :
while(1)
{
...
EIFR|=0x10;
EIMSK|=0x10;
powerdown();
};
Не помогает. Проверял.
- Engineer_Keen
- Друг Кота
- Сообщения: 3868
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: Мелкие вопросы по МК и ПЛИС.
Ну если во время "когда надо включить прерывание" геркон еще замкнут, то все верно 

-
demiurg301
- Опытный кот
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Re: Мелкие вопросы по МК и ПЛИС.
Engineer_Keen писал(а):Ну если во время "когда надо включить прерывание" геркон еще замкнут, то все верно
ДА. Чот я туплю...
*
Немного подумавши...
*
Аааа... Так в том то и проблема. Контроллер то - засыпает и этим прерыванием уже не выводится из сна. Замкнутый круг - видимо придётся переделывать на INT0-3
Re: Мелкие вопросы по МК и ПЛИС.
Коты, помогите. Мне нужно записывать в энергонезависимую память 100 значений и перезаписывать старые, если их больше ста (цикл), а также по команде их считывать.Так вот у меня 64к такой памяти. Стирание ведется постранично (512 байт вроде). (может я чего-то путаю).
С какого адреса лучше записывать эти данные? Могу ли я случайно так стереть кусок своей программы? Нужно ли выделять массив памяти под данные и сколько? Информации читал пока мало и плохо в устройстве памяти разбираюсь (может ссылочку полезную кинете)... А нужно срочно...
__
Пробовал делать в Keil, но по указанному адресу данные не записывается (может я криво смотрю в симуляторе), впрочем, и считываются одни нули, а вот на мк тот же код отлично работал.
С какого адреса лучше записывать эти данные? Могу ли я случайно так стереть кусок своей программы? Нужно ли выделять массив памяти под данные и сколько? Информации читал пока мало и плохо в устройстве памяти разбираюсь (может ссылочку полезную кинете)... А нужно срочно...
__
Пробовал делать в Keil, но по указанному адресу данные не записывается (может я криво смотрю в симуляторе), впрочем, и считываются одни нули, а вот на мк тот же код отлично работал.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Мелкие вопросы по МК и ПЛИС.
Kasey писал(а):Коты, помогите.
Что за народ пошёл...
Ни конкретики МК, ни сколько надо байт записывать, ни как часто — нифига не указано.
Опять всё клещами придётся вытаскивать.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Мелкие вопросы по МК и ПЛИС.
Gudd-Head, да я полагал что существуют какие-то общие принципы... мк ADuC7020 ядро ARM7. Данные идут с АЦП.
ПЛАНИРУЮ записывать числа типа 0x1FFF где 1 - номер канала;
как часто - это я уже сам решу с помощью таймера или проще;
а еще у меня есть рабочий массив [16], который показывает текущие данные с каналов АЦП.
Вот если бы его загонять в память каждый раз... как-то так:
Это пока набросок:
Вот какие мне брать адреса? И хватит ли мне места под строку... (я вообще не понимаю как он там записывает в эти адреса)
ПЛАНИРУЮ записывать числа типа 0x1FFF где 1 - номер канала;
как часто - это я уже сам решу с помощью таймера или проще;
а еще у меня есть рабочий массив [16], который показывает текущие данные с каналов АЦП.
Вот если бы его загонять в память каждый раз... как-то так:
Это пока набросок:
Код: Выделить всё
sprintf ( (char*)massive, "АЦП%X - |%1.2f V| ", chann, (float)ADC_Results[chann]*2.56/0x1000);
//это сама строка, chann - номер канала, он выше задается
nLen = strlen((char*)massive);
for ( i = 0 ; i < nLen ; i++ )
{
DATA = massive[i];
clear (ADDR); save(ADDR, DATA);
//понятное дело, ADDR должен каждый раз меняться, но на сколько?
}
void save(unsigned short int addr, unsigned char data){
FEEADR = addr; // set data address
FEEDAT = data; // set data value
FEECON = 0x02; // single Write command
while(!(FEESTA & 0x01)){}
return;
} Вот какие мне брать адреса? И хватит ли мне места под строку... (я вообще не понимаю как он там записывает в эти адреса)
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Мелкие вопросы по МК и ПЛИС.
Kasey писал(а):мк ADuC7020 ядро ARM7. ПЛАНИРУЮ записывать числа типа 0x1FFF где 1 - номер канала;
как часто - это я уже сам решу с помощью таймера или проще;
Внешнюю память типа FRAM использовать, не? EEPROM там нету???
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Мелкие вопросы по МК и ПЛИС.
Внешнюю не использую. Использую ту, что описана в даташите и куда грузится сам код
ПАМЯТЬ FLASH/EE В МИКРОСХЕМЕ ADUC702X
Подобно памяти EEPROM, память Flash может программироваться в системе побайтно, однако сначала необходимо ее очистить; очистка производится постранично. Таким образом память Flash часто (и более корректно) именуется памятью Flash/EE.
В ИС ADuC702x имеется 64 kB памяти Flash/EE. Нижние 62 kB доступны для пользователя, верхние 2 kB памяти флэш/ЕЕ содержат встроенное заводское программное обеспечение для внутрисхемного последовательного программирования. В этих 2 kB памяти также находится программа конфигурирования процессора при подаче питания, которая загружает заводские калибровочные константы для различной периферии. Эти 2 kB программ скрыты от пользователя.