если у вас будет на 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 на неё.
Над чем подумать стоит.
Для бута надо напрямую обращаться к регистрам процессора. При этом объявление регистровых переменных совсем не гарантирует назначение им РОН. Всё на усмотрение СИ-шного оптимизатора.
Откуда такие мысли, что лень прочитать? вы обвели, но я так и не понял, прочитать не могу! шо там написано?
Черт возьми, что-то интересное там написано...,и про другое тоже, только как - бы его, и остальные интерестности про которые там написано еще и применить???????