Сб июл 14, 2018 22:46:21
Вс июл 15, 2018 08:23:11
Вс июл 15, 2018 13:39:18
ISR (TIMER2_COMPA_vect) // вектор прерывания по совпадению таймера 2
{
_delay_ms(500);
}
ISR (USART_UDRE_vect)
{
_delay_ms(500);
}
Вс июл 15, 2018 15:36:02
Вс июл 15, 2018 15:53:31
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#define LEDOFF PORTB &= ~(1 << 1)
#define LEDON PORTB |= (1 << 1)
volatile uint16_t ms;
ISR ( TIMER0_COMPA_vect )
{
// event to be executed every 1ms here
if ( ms != 0 )
ms--;
}
void delay_ms ( uint16_t nms )
{
ms = nms;
while ( ms );
}
void Tim0_Init()
{
// Tt0 = 1/(Fcpu/k) = 1/(8000000/64) = 0,000008s = 0.008ms
// n = t/Tto - 1 = 1/0,008 - 1 = 124
// Set the Timer Mode to CTC
TCCR0A |= ( 1 << WGM01 );
// Set the value that you want to count to
OCR0A = 124;
// Set the ISR COMPA vect
TIMSK0 |= ( 1 << OCIE0A );
// set prescaler to 64 and start the timer
TCCR0B |= ( 1 << CS01 ) | ( 1 << CS00 );
}
int main()
{
CLKPR = 0x80;
CLKPR = 0x00;
// Analog Comparator: Off
ACSR = 0x80;
ADCSRB = 0x00;
DDRB |= ( uint8_t ) ( 1 << 1 );
Tim0_Init();
sei(); // enable interrupts
while ( 1 )
{
LEDON;
delay_ms ( 1000 );
LEDOFF;
delay_ms ( 1000 );
}
}
Вс июл 15, 2018 15:54:49
Вс июл 15, 2018 18:28:40
А #include <avr/interrupt.h> не забыл?
// Tt0 = 1/(Fcpu/k) = 1/(8000000/64) = 0,000008s = 0.008ms
// n = t/Tto - 1 = 1/0,008 - 1 = 124
// Set the Timer Mode to CTC
TCCR0A |= ( 1 << WGM01 ); //включаем режим "сброс таймера при совпадении"
// Set the value that you want to count to
OCR0A = 130;
// Set the ISR COMPA vect
TIMSK0 |= ( 1 << OCIE0A );
// set prescaler to 64 and start the timer
TCCR0B |= ( 1 << CS01 ) | ( 1 << CS00 );
Пн июл 16, 2018 08:46:24
Пн июл 16, 2018 09:32:56
Пн июл 16, 2018 09:36:51
нет даже равных протеусу, про более продвинутые и речь не идетDENIS451 писал(а):есть ещё какие нибудь более продвинутые эмуляторы
Вт июл 17, 2018 13:56:25
Вт июл 17, 2018 23:49:56
Ср июл 18, 2018 07:42:24
Ср июл 18, 2018 07:46:13
можно придумать 100500 причин сделать плохо, но лучше подумать о том, почему надо делать хорошо.ozonn писал(а):Но если у тебя одно прерывание, то почему бы там не поставить задержку?
Ср июл 18, 2018 09:22:12
Ср июл 18, 2018 09:25:50
Ср июл 18, 2018 09:31:00
прочтите все моё сообщение - ответ там был данozonn писал(а):а если не может?
Чт июл 19, 2018 05:09:32
Сейчас нет. Потом, в процессе отладки или доработки понадобится второе, и приплыли. Поэтому лучше сразу привыкать делать все правильно. А правильная работа с прерываниями, по-хорошему, должна строиться на базе очень коротких прерывающих программ. Получил прерывание, снял что-либо из регистров оборудования (ну или выдал что-то в регистры), произвел коротенькие вычисления, (может быть) где-то отметился, и все, выходи. А основная программа должна мониторить те самые переменные, в которых отмечаются прерывающие программы и, при появлении отметки, выполнять какие-то большие действия. В том числе, при нужде, и подождать может, хотя, при грамотном построении всей программы, это можно возложить на таймерное прерывание. Таймерная программа прерывания подсчитывает время, как набежит нужная для задержки величина, таймерная программа отметится где надо, а основная, по получению этой отметки, поймет, что нужное время задержки прошло.ozonn писал(а):а если нет других прерываний?
Чт июл 19, 2018 07:46:00
Чт июл 19, 2018 08:40:54
в том числе задавать вопросы и высказывать предположения.ozonn писал(а):я это все к тому, что надо все делать с умом