Jump to content

Ittido

Members
  • Content Count

    166
  • Joined

  • Last visited

Community Reputation

10 Обычный

About Ittido

  • Rank
    Осваивающийся
  • Birthday 12/28/1978

Информация

  • Пол
    Мужчина
  • Город
    Украина

Recent Profile Visitors

2450 profile views
  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. Добрый день. Имеется следующая ситуация. Сторожевой таймер (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 мкСек
×
×
  • Create New...