если у вас будет на portb.5 ==0 , то будет происходить ресет микроконтролера, если вы конечно не отключите во фьюзах ресет. но тогда повторная перезапись микроконтролера будет затруднительна, я бы посоветовал выбрать вам другой порт для индикации нуля. а порт 5 оставил бы под ресет.
уважаемые коты , помогите разбудить тини 13 по ватчдогу??Спойлер#include <tiny13.h> #include <delay.h> #include <sleep.h> #define ADC_VREF_TYPE 0x62 //режим включен внутренний ион на 1.1, вывод данных в порт адц 2 РВ4
unsigned char napruga;
// Read the 8 most significant bits // of the AD conversion result unsigned char read_adc(unsigned char adc_input) //програма созданая в визарде для выведения значений ацп в переменную read_adc { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCH; //8 битный результат }
// Declare your global variables here
void main(void) {
// Declare your local variables here char v; // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=0x80; CLKPR=0x00;
// Analog Comparator initialization // Analog Comparator: Off ACSR=0x80; ADCSRB=0x00; DIDR0=0x00;
// ADC initialization // ADC Clock frequency: 150,000 kHz // ADC Bandgap Voltage Reference: Off // ADC Auto Trigger Source: ADC Stopped // Only the 8 most significant bits of // the AD conversion result are used // Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On DIDR0&=0x03; DIDR0|=0x00; ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x86; // Watchdog Timer initialization // Watchdog Timer Prescaler: OSC/64k // Watchdog Timer interrupt: On
napruga= read_adc(2); //присваиваем read_adc переменной напруга в скобочках указывается какой адц работает у нас (адц 2)
if(napruga > 85) PORTB.0= 1; else PORTB.0= 0; if(napruga > 65) PORTB.1= 1; else PORTB.1= 0; if(napruga > 57) PORTB.2= 1; else PORTB.2= 0; if(napruga >53 ) PORTB.3= 1; else { for (v=0;v<=6;v++) //задержка на мигание светодиодом пследним { //мигаем 5 раз и переходим дальше PORTB.3= 1; delay_ms(100); PORTB.3= 0; delay_ms(1100); }; }; delay_ms(3000); //задержка выведения показаний на светодиоды //тушим все порты(светодиоды) PORTB.0=0; delay_ms(150); PORTB.1=0; delay_ms(150); PORTB.2=0; delay_ms(150); PORTB.3=0; delay_ms(150);
PORTB=0x00; MCUCR=0x30; //включаем режим сна повер довн #asm ("sleep") //спим до нажия на кнопку ресет которая перезапустит программу }
в визарде настроено прерываение по ватчдогу через 8 сек после сна. но прерываение не происходит((( в прерывании нужно вызывать функцию проверки ацп и сели папряжение больше 2.5в то снова заснуть. если ниже тогда будем мигать светодиодом на порте Б3. вот то что визард создает для прерывания по ватчдогу Спойлер// Watchdog timeout interrupt service routine interrupt [WDT] void wdt_timeout_isr(void) { WDTCR|=0x40; // Place your code here
Ребят, помогите разобраться с таймерами. Перерыл весь инет, нашел пару более менее статей написанных доступным языком, но некоторые моменты всеравно не ясны. Я хочу использовать таймер в следующих целях: На один из входов (а) МК поступает сигнал (в течении например 0,005-0,01 секунды) и будет повторяться через промежуток 0,01-0,015 сек. После поступления сигнала на вход (а) мне нужно подать напряжение на выход МК (б) либо сразу, либо через 0,002 секунды например в течении 0,003 секунд. Не понимаю какой выбрать таймер и его режим для этой задачи. Использовать хочу МК Atmega 8. Так понимаю по умолчанию частота 1МГц работы внутреннего тактового генератора. То есть брать предделитель 256 нормально. Это получается 1024000/256=4000Гц. Т.е. один такт за 0,00025 секунды и если мне понадобится отсчитать интервал времени 0,005 секунды, то это пройдет 20 тактов. Еще как раз запас есть, если интервал времени потребуется меньше отсчитывать. Верно? И как задать условие, что если досчитает до 20, подать напряжение туда то. Как обратиться к этой переменной? Глупый вопрос наверное. Вообщем то работал и с датчиками, и с прерыванием. Проблем не было. Но опыта еще маловато. Может у кого пример с комментариями есть? Буду очень благодарен. Это все лучше делать используя CodeWizardAVR?
Кто может обяснить на пальцах как работь с бутлоадером. Есть проэкт в CodeVision AVR программирую из CVAVR, есть бутлоадер здесь же. Я так понимаю нужно программировать бутлоадер с определённого адреса а основной код с 0-го адреса. Как указать в коде или при программировании что куда программировать???. Прошу не пинать программирую на Си давно но с этой темой работаю впервой, поиски не дают внятного ответа (может не правильно искал). Все решения котоые я нашол то нужно программировать бутлоадер отдельным программатором.
Насколько знаю, бутлоадер создаётся как отдельное приложение. При компиляции и создании HEX в него помещается с нужного адреса boot-сектора в соответствии с настройками проекта. Boot прошивается программатором, приложение можно уже залить через boot.
Для удобства прошивки серии hex boot-а и hex приложения можно соединить в один файл сторонними инструментами. Однако в одной программе их лучше не соединять т.к. они используют разные таблицы прерываний. Были вроде еще какие-то другие противоречия между ними.
Явно указать адрес подпрограммы или константных данных можно с помощью ассемблерной директивы .ORG Я пробовал, вроде работает.
Если проблема с прерываниями то я думаю она решаема. Так всё таки есть возможность обединения бутлоадера и основного кода, или нет в CVAVR. Ведь не обязательно указывать стартовать с бутлоадера, а запускать его из основного кода.
Я думаю, что принципиального ограничения тут нет. 1. Прерывания можно отключить все и использовать исключительно опрос флагов состояния. 2. Подпрограммы бутлодера разместить в пределах бут-сектора и просто сделать вызов СИ-шной функции или JMP/RJMP на неё.
Над чем подумать стоит. Для бута надо напрямую обращаться к регистрам процессора. При этом объявление регистровых переменных совсем не гарантирует назначение им РОН. Всё на усмотрение СИ-шного оптимизатора.
Откуда такие мысли, что лень прочитать? вы обвели, но я так и не понял, прочитать не могу! шо там написано? Черт возьми, что-то интересное там написано...,и про другое тоже, только как - бы его, и остальные интерестности про которые там написано еще и применить???????