Перейти к содержанию

Ittido

Members
  • Постов

    166
  • Зарегистрирован

  • Посещение

Весь контент Ittido

  1. От заввисания процесора - да. Оконный же роботает от системного тактирования. Я тут подумал, если остановить генератор на 40 кГц разве это не приведёт к остановке IWDG.
  2. Нет временный не нужен. нужен постоянный, просто изредка нужно записывать параметры настройки. и я так понял что во время этого процесса прерывания отключаются (сброс сторожевого таймера в прерывании от таймера каждую милисекунду).
  3. Вот код. void InitWDG(uint16_t z) // {RCC_LSICmd(ENABLE); //Включить внутренний генератор 40 кГц while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)//Ожидаем готовности генератора {} /* Включаем Watchdog*/ IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); IWDG_SetPrescaler(IWDG_Prescaler_8); //Делитель 8 IWDG_SetReload(z); //z = 7 (1,4 мСек.) IWDG_ReloadCounter(); IWDG_Enable(); } А как остановить сторожевой таймер вы не знаете? Решено. Написал код и всё понял. Выкинул запуск внутреннего генератора из функции и всё заработало. Спасибо.
  4. Уточню. Во время старта я инициализирую сторожевой таймер со значением сброса каждую 1,4 мСек. Перед записью во флеш я вновь запускаю функцию инициализации сторожевого таймера (И в ней всё то на что вы мне указываете есть) с новым временем сброса - но это безрезультатно.
  5. Ittido

    IWDG и запись во FLASH

    Добрый день. Имеется следующая ситуация. Сторожевой таймер (iwdg) сбрасывается каждую милисекунду. Таймер отсчитывает 1,4 милисекунды для сброса. Всё работает до момента включения записи во flash новых параметров. Запись ведётся на одну страницу. Вопрос как можно остановить / отключить сторожевой таймер на время записи? Методом перебора тайминга таймера определил что запись занимает 0,0254 Сек. То есть если сбрасывать сторожевой таймер с периодом больше 0,0254 то сброса процессора не происходит. Пробовал переинициализировать таймер на время записи - безрезультатно. Новая инициализация не проходит. Создаётся впечатление что после того как он запущен, туда не достучаться.
  6. Из первого поста видно что процессор работает на частоте 1,2МГц а компилятору сказано что 8МГц. Поэтому 135 мСек длятся 1 секунду. Чтобы небыло рассогласования нужно указать компилятору реальную частоту работы процессора. В функциях задержки используются значения типа int а это 65535 максимум дальше опять 0(при инкременте). Рекомендую для задержки использовать цикл "for" в теле которого находится delay(); unsigned int t; //Переменная для минут for(t = 1500; t > 0; t--) //1500 минут = 25 часов {delay_ms(60000); //Задержка на 1 минуту } Да и точность любого внутреннего RC генератора всегда оставляет желать лучшего, на таких длительных интервалах ваше время может отклонятся от номинала в зависимости температуры окружающей среды.
  7. Присоединяюсь, НО на фото справа вверху от контроллера микросхема на 8 ног. Возможно это внешняя память, на фото смазано не видно надписей. Если внешней памяти нет, то нужно смотреть не залочена ли прошивка ATMegi. Но без программатора тут никак так что ищите тех кто занимается МК в вашей округе.
  8. Из ДШ на DS (±0.5°C accuracy from -10°C to +85°C) Скорей всего врёт и DS и ваш термометр.Истина где-то между. Нужна програмная калибровка для точных данных. Я проверяю DS Следующим образом. В небольшую пластиковую ёмкость набираю воду и опускаю в неё (изолированный) датчик и всё это дело в морозилку. Падение до нуля идёт сравнительно быстро и падение ниже нуля также. а вот переход воды из жидкого состояния в твёрдое займёт более получаса. и всё это время датчик не меняет свою температуру ну и показывает как он видит 0. А вы на какой высоте над уровнем моря проживаете. Для справки вода закипает при 100 на уровне моря, На высоте 500 метров она закипает уже при 98,3 градуса. На 3000 метров температура закипания 90 градусов. А на 6000 метров вода закипит при 80 градусов.
  9. Браво. Готовый проэкт я выложил в последнем посте и разжёван каждый шаг в коментах. Неужели нельзя самому скопировать и скомпилировать. Воистину НИКТО, НИКОГО, НИЧЕМУ не может научить. Могут только помочь научиться. Но для этого нужно иметь желание учиться. Иначе всё напрасно.
  10. Ittido

    Atmega32L

    А открыть в Пони bin и сохранить в hex.
  11. А как именно вы шьёте? Я к примеру использую загрузчик chip45boot2. И при каждом прошивании снимаю и подаю напряжение так как загрузчик работает первые 5 секунд после ресета проца а дальше управление передаётся основной программе. Можно и не выдёргивать питание а поставить кнопку ресет.
  12. Вот вариант. Chip type : ATtiny13 AVR Core Clock frequency: 4,800000 MHz Memory model : Tiny External RAM size : 0 Data Stack size : 16 *****************************************************/ #include <tiny13.h> #include <delay.h> unsigned char vremja; //Переменная для отсчёта времени в прерываниях unsigned char klavisha; //Переменная для подсчёта количества нажатий // Прерывание Timer 0 по переполнению каждые 0,054312 Сек interrupt [TIM0_OVF] void timer0_ovf_isr(void) {if(!PINB.1) //Если порт B1 выключен отсчитываем 5 сек {vremja++; //Счётчик времени +1 if(vremja == 92) //Если прошло 5 сек то {TCCR0B=0x00; //Остановить таймер vremja = 0; //Обнулить счётчик } } else //Иначе если порт B1 включён отсчитываем 3 сек {vremja++; //Счётчик времени +1 if(vremja == 55) //Если прошло 3 сек то {PORTB.1 = 0; //Выключить порт B1 TCCR0B=0x00; //Остановить таймер vremja = 0; //Обнулить счётчик } } } void main(void) {// Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif PORTB=0x00; DDRB=0x02; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 4,688 kHz TCCR0B=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=0x02; // Analog Comparator initialization // Analog Comparator: Off ACSR=0x80; ADCSRB=0x00; // Global enable interrupts #asm("sei") while (1) {if(PINB.0) //Если клавиша нажата то {delay_ms(10); //Задержка для антидребезга if(PINB.0) //Если клавиша точно нажата то {if(klavisha) //Если клавиша нажата не первый раз то {PORTB.1 = 1; //Включить порт В1 vremja = 0; //Обнулить счётчик для отсчёта 3 сек TCNT0 = 0; klavisha = 0; //Обнулить информацию о клавишах для последующих нажатий } else //Иначе если клавиша нажата первый раз то {klavisha++; //Клавиша = 1 TCCR0B = 0x05; //Запустить таймер для отсчёта 5 сек } while(PINB.0) //Ждём отпускания клавиши {} delay_ms(100); //Задержка для антидребезга } } }; }
  13. Зачем нужен таймер, что он должен отсчитывать. Для его использования нужно знать частоту на которой работает МК. Эту задачу можно решить и на задержках, если это всё что нужно от МК.
  14. Что конкретно он не делает. У вас в главной программе два условия хоть в какое то из них программа попадает? что на портах по управлению делается?
  15. Как вы вычислили 24 мкСек ? Кинул ваш код в AVRStudio и посмотрел. С момента первого фронта до отключения прерывания проходит 29 тактов. на частоте 1,2 это и будет 24 мкСек
  16. На какой частоте работает МK, если 1,2 то с момента первого фронта до отключения прерывания проходит 24 мкСек. И как насчёт импульсных помех. Да и по поводу предыдущих моих цитат вашего кода. Если кусок кода просто есть и не выполняет ничего то не лучше ли его выкинуть отредактировав. Чтоб читающие ваш код не спотыкались об уже оговорённое. Какое питание у вашего Мк (имею в виду стабилизатор линейный/импульсный) У меня были случаи зависания МК при линейном стабилизаторе( атмега8 и тини13 даже wdr не помагал), менял на импульсный и проблема исчезала.
  17. Повторяюсь ещё раз //Выбираем режим срабатывания по нарастающему фронту ldi R16, (1<<ISC01)|(1<<ISC00); out MCUCR, R16; Это для прерывания по INT0. Вы же используете прерывание PCINT. PCINT не имеет возможности настройки по фронту/по спаду/по любому перепаду/или по низкому уровню. Эта настройка доступна только для INT0. PCINT может только - по любому перепаду на ноге. То есть когда вы хлопнули один раз вы два раза попали в прерывание (по фронту и по спаду), когда хлопаете 3 раза соответственно 6 раз в прерывание.Если вы хотите инкрементировать только по фронту, то попадая в прерывание проверяйте состояние входа а потом инкрементируйте.
  18. Какое внешнее прерывание вы используете на PB1 - INT0 или PCINT1. А то сложно что-то сказать не зная идею. Во время инициализации вы настраиваете прерывание по восходящему фронту INT0. Прерывания PCINT работают по обоим перепадам (один режим). Обработчик прерывания у вас выбран PCINT //Выбираем режим срабатывания по нарастающему фронту ldi R16, (1<<ISC01)|(1<<ISC00); out MCUCR, R16;
  19. Вот h. писал давно, но он работает. Проц. работает на частоте 8 МГц. Написано в CVAVR под АTMega162. Так что переопределяйте выводы. ds1302.rar
  20. Почему же не может. Очень даже может в случаях когда "есть такое же но без крыльев". или готовое решение стоит в 10 а то и в 100 раз дороже чем спаять самому.
  21. Ittido

    Twi/i2C Виснет.

    Подтяжка есть. LCD я думаю не влияет так как связь с DS3231 устанавливается (время передаётся), ACK ATMega выдаёт в конце каждого байта но когда я получаю байт даты я отправляю СТОП на линию, но он не проходит. Написал и сам нашёл решение, поменял получение последнего байта без ACK и всё заработало. Тему можно считать закрытой.
  22. Ittido

    Twi/i2C Виснет.

    Добрый день. Пытаюсь сделать конвеер для аппаратного TWI модуля ATMega8. Контроллер в режиме мастера периодически работает с 4 разными устройствами на шине. LCD1602 висит также на шине I2C. Инициализация проходит информация на LCD выводится. Далее идёт процесс опроса времени с DS3231. Время передаётся но в конце при передаче СТОП на линию І2С. СТОП не проходит. Логический анализатор показывает на линии SCL - 1, SDA - 0. В регистре статуса F8. Ожидание ни к чему не приводит. Продолжение кода тоже. Как с этим бороться может кто сталкивался.
  23. А какова себестоимость данного девайса? Просто у китайцев такой же по функциональности прибор на STM8 я покупаю с доставкой в Украину за 1,84$ если покупать на рынке контроллер и DS то уже не вписываешся. Подозреваю что кроме полученного бессценного опыта выгоды никакой.
×
×
  • Создать...