Мелкие вопросы по МК и ПЛИС.

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение demiurg301 »

Помогите разобраться пожалуйста 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?
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Engineer_Keen »

demiurg301 писал(а):Что есть level interrupt?

Прерывание по уровню, т.е. когда например низкий уровень на ноге прерывание сработает, а от перепада 1-0 или 0-1 - нет.
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение demiurg301 »

Engineer_Keen писал(а):
demiurg301 писал(а):Что есть level interrupt?

Прерывание по уровню, т.е. когда например низкий уровень на ноге прерывание сработает, а от перепада 1-0 или 0-1 - нет.


Не работает :dont_know:
В активном режиме срабатывает - в power_down не хочет.
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Engineer_Keen »

Ну так в EICRB стоит 0x02 - прерывание по falling edge (по спаду), а надо 0x00 - по low level (низкий уровень).
Аватара пользователя
Av4arik
Поставщик валерьянки для Кота
Сообщения: 1954
Зарегистрирован: Чт янв 20, 2011 16:47:18
Откуда: Старый Оскол
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Av4arik »

чем отличается PIC16F629 от 12F629? прошивка от 12F на 16F подойдет?
Быстро, Качественно, Недорого.
Выбрать можно только 2 варианта.
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение demiurg301 »

Engineer_Keen писал(а):Ну так в EICRB стоит 0x02 - прерывание по falling edge (по спаду), а надо 0x00 - по low level (низкий уровень).



Ага, разобрался... Спасибо.
kreygen
Родился
Сообщения: 18
Зарегистрирован: Ср сен 07, 2011 20:21:10

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение kreygen »

Картинки уменьшаем!
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: Мелкие вопросы по МК и ПЛИС.

Сообщение demiurg301 »

Такой вопрос всплыл по прерываниям опятьже :)))

Есть вот прерывание по 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 такта срабатывает :))) Как с этим быть?
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25143
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение КРАМ »

Нужно использовать прерывание ПО ИЗМЕНЕНИЮ СОСТОЯНИЯ ПОРТА. Только не забывать в обработчике читать этот порт, а то флаг не сбросится.
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение demiurg301 »

КРАМ писал(а):Нужно использовать прерывание ПО ИЗМЕНЕНИЮ СОСТОЯНИЯ ПОРТА. Только не забывать в обработчике читать этот порт, а то флаг не сбросится.


НЕ катит. У мну low level выводит из powerdown. По изменению не проснётся.
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Engineer_Keen »

КРАМ писал(а):Нужно использовать прерывание ПО ИЗМЕНЕНИЮ СОСТОЯНИЯ ПОРТА.

Ему нельзя, у него power-down, там только по уровню.

Получается такая ситуация:
Срабатывает прерывание, в обработчике оно отключается обнулением бита в маске EIMSK, но в тоже время геркон все еще находится в замкнутом состоянии и это вызывает запись флага в регистре статуса.
В какой-то момент вы включаете прерывание записью в EIMSK, а ведь в регистре статуса остался флаг, вот прерывание и срабатывает.

Нужно перед той строчкой, где включается прерывание обнулять этот флаг.
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение demiurg301 »

Engineer_Keen писал(а):

Нужно перед той строчкой, где включается прерывание обнулять этот флаг.


Этот?
EIFR

Сделал так :

while(1)
{
...
EIFR|=0x10;
EIMSK|=0x10;
powerdown();
};

Не помогает. Проверял.
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Engineer_Keen »

Ну если во время "когда надо включить прерывание" геркон еще замкнут, то все верно :dont_know:
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение demiurg301 »

Engineer_Keen писал(а):Ну если во время "когда надо включить прерывание" геркон еще замкнут, то все верно :dont_know:


ДА. Чот я туплю...


*
Немного подумавши...
*

Аааа... Так в том то и проблема. Контроллер то - засыпает и этим прерыванием уже не выводится из сна. Замкнутый круг - видимо придётся переделывать на INT0-3 :(
Kasey
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Пн ноя 08, 2010 23:15:12

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Kasey »

Коты, помогите. Мне нужно записывать в энергонезависимую память 100 значений и перезаписывать старые, если их больше ста (цикл), а также по команде их считывать.Так вот у меня 64к такой памяти. Стирание ведется постранично (512 байт вроде). (может я чего-то путаю).
С какого адреса лучше записывать эти данные? Могу ли я случайно так стереть кусок своей программы? Нужно ли выделять массив памяти под данные и сколько? Информации читал пока мало и плохо в устройстве памяти разбираюсь (может ссылочку полезную кинете)... А нужно срочно...
__
Пробовал делать в Keil, но по указанному адресу данные не записывается (может я криво смотрю в симуляторе), впрочем, и считываются одни нули, а вот на мк тот же код отлично работал.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Gudd-Head »

Kasey писал(а):Коты, помогите.

Что за народ пошёл...
Ни конкретики МК, ни сколько надо байт записывать, ни как часто — нифига не указано.
Опять всё клещами придётся вытаскивать.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Kasey
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Пн ноя 08, 2010 23:15:12

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Kasey »

Gudd-Head, да я полагал что существуют какие-то общие принципы... мк ADuC7020 ядро ARM7. Данные идут с АЦП.
ПЛАНИРУЮ записывать числа типа 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: Мелкие вопросы по МК и ПЛИС.

Сообщение Gudd-Head »

Kasey писал(а):мк ADuC7020 ядро ARM7. ПЛАНИРУЮ записывать числа типа 0x1FFF где 1 - номер канала;
как часто - это я уже сам решу с помощью таймера или проще;

Внешнюю память типа FRAM использовать, не? EEPROM там нету???
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Kasey
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Пн ноя 08, 2010 23:15:12

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Kasey »

Внешнюю не использую. Использую ту, что описана в даташите и куда грузится сам код
ПАМЯТЬ FLASH/EE В МИКРОСХЕМЕ ADUC702X

Подобно памяти EEPROM, память Flash может программироваться в системе побайтно, однако сначала необходимо ее очистить; очистка производится постранично. Таким образом память Flash часто (и более корректно) именуется памятью Flash/EE.

В ИС ADuC702x имеется 64 kB памяти Flash/EE. Нижние 62 kB доступны для пользователя, верхние 2 kB памяти флэш/ЕЕ содержат встроенное заводское программное обеспечение для внутрисхемного последовательного программирования. В этих 2 kB памяти также находится программа конфигурирования процессора при подаче питания, которая загружает заводские калибровочные константы для различной периферии. Эти 2 kB программ скрыты от пользователя.
Ответить

Вернуться в «Разные вопросы по МК»