Proteus: вопросы и ответы
Re: Proteus: вопросы и ответы
Доброго времени суток! Поддерживаю вопрос Valeriy L по поводу можно ли сделать видными скрытые выводы микроконтроллеров (в моем случае AVR )... Видел графу где можно в письменном виде задать контакт к которому присоединить скрытый вывод, но что то это не то... Пробовал писать к примеру резистор, после этого под микроконтроллером появилась надпись VCC-R10 -следовательно появилась связь между выводом VCC и резистором R10... Но в данном случае не понятно с каким из выводов резистора VCC соединилось?
Все гениальное - просто
Re: Proteus: вопросы и ответы
Valeriy L писал(а):как сделать активными выводы питания Vdd и GND для PIC12F629. Что-бы я их мог использовать в проекте.
CB1 писал(а):Поддерживаю вопрос Valeriy L по поводу можно ли сделать видными скрытые выводы микроконтроллеров (в моем случае AVR )...
Тэкс, кто третьим будет??? В стопитьсотый раз повторюсь, в том числе и здесь на Коте - не парьте себе и другим мосК. Видимость выводов МК никаких преимуществ Вам не даст, поскольку использовать их как активные, т.е. управлять через них питанием МК Вы не сможете. Так задуманы и реализованы модели. Если про Пики в хелпе Лабцентр об этом скромно умолчал, то для AVR чётко прорисано (см. раздел AVR MODEL HELP -> General Model Limitations):
Power supply voltage changing is not supported.
Там есть и другие ограничения, касающиеся питания, в частности BOR. Я уже неоднократно и объяснял, как такое обойти - есть вывод RESET (у PIC - MCLR) - вот на него "тумблер" на землю - им и гасите, эффект практически тот же.
Можно ли верить Proteus'у ?
Начал изучать микроконтроллеры и решил освоить прерывания, хочу сделать задержку без delay_ms().
У меня появился вопрос насколько точно работает осциллограф в протеусе? Можно ли доверять ему?
Хочу сделать таймер на прерывании как можно точнее.
Приведу два примера: один с использованием delay_ms() второй с использованием прерывания.
С использование delay_ms()

С использованием прерывания

У меня появился вопрос насколько точно работает осциллограф в протеусе? Можно ли доверять ему?
Хочу сделать таймер на прерывании как можно точнее.
Приведу два примера: один с использованием delay_ms() второй с использованием прерывания.
С использование delay_ms()
Код: Выделить всё
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRC |= (1<<5);
PORTC |= (1<<5);
while(1)
{
_delay_ms(20);
PORTC ^= (1<<5);
}
}
С использованием прерывания
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
unsigned long long millis = 0; //От 0 до 18 446 744 073 709 551 615
unsigned long long prevMillis = 0;
ISR (TIMER2_COMP_vect)
{
millis++; //миллисекунды
}
void timer2_init (void)
{
//*** Настройки для 8MHz ***//
TCCR2 |= (1<<1) | (1<<0); //установка предделителя = 64
TIMSK |= (1<<7); //разрешает прерывания по событию совпадение
TCCR2 |= (1<<3); //сброс при совпадении TCNT2 с OCR2
OCR2 = 249; //подгонялось вручную для 8MHz
TCNT2 = 0b00000000; //т.к. счетчик уже считает, то сброс счетчика после настройки.
}
void port_init (void)
{
DDRC |= (1<<5);
PORTC |= (1<<5);
}
int main(void)
{
timer2_init(); //настройка таймера2 для подсчета миллисекунд
port_init(); //настройка портов
sei(); //разрешение прерываний
while(1)
{
if (millis - prevMillis > 20)
{
prevMillis = millis;
PORTC ^= (1<<5); //инверсия одного бита
}
}
}
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Можно ли верить Proteus'у ?
Плохой подход.Код: Выделить всё
millis++; //миллисекунды
..............
..............
if (millis - prevMillis > 20)
1. Никогда не забывайте об атомарном доступе к многобайтным переменным.
2. Представьте, что произойдёт, когда переменная millis переполнится.
Можно. По крайней мере, до десятых (а может и сотых) микросекунд точно будет мерить.Можно ли доверять ему?
ЗЫ: В протеусе, для таких случаев, есть инструмент - COUNTER TIMER. Им можно мерить длину импульса с разрешением в 1 us.
ЗЫЗЫ: А вообще, по протеусу, так то, уже существует тема. Давайте туда "переедем" ?
Re: Можно ли верить Proteus'у ?
ЗЫЗЫ: А вообще, по протеусу, так то, уже существует тема. Давайте туда "переедем" ?
Понял, буду задавать вопросы в той теме.
Плохой подход.
1. Никогда не забывайте об атомарном доступе к многобайтным переменным.
2. Представьте, что произойдёт, когда переменная millis переполнится.
Может быть я не правильно рассчитал переполнение переменной? Но вроде бы она очень не скоро должна переполниться, разве нет? unsigned long long millis переполнится через 5849,42 лет верно?
Каким образом тогда можно выполнить задержку без _delay_ms() и ей подобных ф-й?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Можно ли верить Proteus'у ?
Если она 8 байт, то действительно что-то очень долго получается. Контроллер успеет сгнить 1000 разНо вроде бы она очень не скоро должна переполниться, разве нет?
Тогда всё нормально. Только об атомарном доступе позаботьтесь и всё.
Re: Можно ли верить Proteus'у ?
Тогда всё нормально. Только об атомарном доступе позаботьтесь и всё.
Можно запретить прерывания. Я правильно понимаю?
Код: Выделить всё
while(1)
{
cli()
if ((millis - prevMillis) > 20)
{
prevMillis = millis;
PORTC ^= (1<<5); //инверсия одного бита
}
sei()
}
Почитал сейчас про атомарный доступ код для компилятора IAR.
Код: Выделить всё
__monitor unsigned long get_system_timer(void)
{
return system_timer;
}
Хотелось бы сделать такую же функцию в Atmel Studio. Как это можно сделать?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Можно ли верить Proteus'у ?
Правильно.Можно запретить прерывания. Я правильно понимаю?
Только прерывания достаточно запрещать на время работы с переменной, используемой в прерывании. На весь кусок запрещать нет смысла.
Просто создайте функцию, запрещающую прерывание на время чтения переменной и возвращающую это значение.Хотелось бы сделать такую же функцию в Atmel Studio. Как это можно сделать?
Re: Можно ли верить Proteus'у ?
Аlex писал(а):Просто создайте функцию, запрещающую прерывание на время чтения переменной и возвращающую это значение.
Так можно сделать?
Код: Выделить всё
unsigned long long get_millis(void)
{
cli();
return millis;
sei();
}
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Можно ли верить Proteus'у ?
Неужели попробовать будет дольше, чем ждать ответа на форуме ? 
ЗЫ: После return, дальше, программа не выполняется. Вот и думайте, можно так или нет
ЗЫ: После return, дальше, программа не выполняется. Вот и думайте, можно так или нет
Re: Можно ли верить Proteus'у ?
Аlex писал(а):Неужели попробовать будет дольше, чем ждать ответа на форуме ?
ЗЫ: После return, дальше, программа не выполняется. Вот и думайте, можно так или нет
Попробовать конечно не сложно, только у меня из-за return и появился вопрос. Тогда может быть так?
Код: Выделить всё
unsigned long long get_millis(void)
{
cli();
unsigned long long tmp = millis;
sei();
return tmp
}
Вопросы у меня появляются потому, что я не знаю как узнать при отладке когда прерывания разрешены/запрещены
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Можно ли верить Proteus'у ?
Но при отладке видно же докуда (не)доходит программа.
Re: Можно ли верить Proteus'у ?
Аlex писал(а):Но при отладке видно же докуда (не)доходит программа.
Действительно)
Мой последний кусок кода будет правильным?
Re: Можно ли верить Proteus'у ?
Я наверное задаю вопросы быстрее чем думаю
Нашел в Atmel studio окошко Processor там есть Status register и 7-й бит Global interrupt enable
Нашел в Atmel studio окошко Processor там есть Status register и 7-й бит Global interrupt enable
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Можно ли верить Proteus'у ?
Ellissar писал(а):Хотелось бы сделать такую же функцию в Atmel Studio. Как это можно сделать?
изучить документацию на WinAVR и использовать макрос ATOMIC_BLOCK:
Код: Выделить всё
#include <ulil/atomic.h>
ATOMIC_BLOCK(ATOMIC_RESTORE_STATE){
// тут пишется код, который будет выполнен атомарно
}если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Можно ли верить Proteus'у ?
ATOMIC_BLOCK интересная штука, но в неё тоже нельзя включить return millis;. Поэтому решил использовать cli() и sei().
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Можно ли верить Proteus'у ?
в нее можно включать return что угодно!!!
а вот ваш вариант с cli-sti может дать побочный эффект, потому как уже вам нужно будет контролировать, были ли разрешены прерывания перед обращением к вашей функции или нет, потому как ваша функция всегда БУДЕТ разрешать прерывания, или наоборот, БУДЕТ их запрещать.
ATOMIC_BLOCK в показанном мной варианте использования всегда восстановит то состояние прерываний, которое было до обращения к нему. вдумайтесь
а вот ваш вариант с cli-sti может дать побочный эффект, потому как уже вам нужно будет контролировать, были ли разрешены прерывания перед обращением к вашей функции или нет, потому как ваша функция всегда БУДЕТ разрешать прерывания, или наоборот, БУДЕТ их запрещать.
ATOMIC_BLOCK в показанном мной варианте использования всегда восстановит то состояние прерываний, которое было до обращения к нему. вдумайтесь
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Можно ли верить Proteus'у ?
ARV писал(а):в нее можно включать return что угодно!!!
пробую так:
Код: Выделить всё
unsigned long long get_millis(void)
{
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
return millis;
};
}
только при выходе из функции прерывания должны быть разрешенными(разрешаю прерывания в ф-и main), а они запрещены. Я что-то делаю не так?
Работает нормально только в таком виде
Код: Выделить всё
unsigned long long get_millis(void)
{
unsigned long long tmp;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
tmp = millis;
};
return tmp;
}
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Можно ли верить Proteus'у ?
ATOMIC_BLOCK в показанном мной варианте использования всегда восстановит то состояние прерываний, которое было до обращения к нему. вдумайтесь
Не, ну всегда же можно прочитать состояние, а потом восстановить.
"Горшки тоже не боги обжигают" (с)
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Можно ли верить Proteus'у ?
Я что-то делаю не так?
Аlex писал(а): После return, дальше, программа не выполняется !
А макрос тоже "человек", ему тоже хочется закончиться до конца
Если у вас в программе всегда будут разрешены прерывания, то не парьтесь, сделайте просто запрет-разрешение. Если хотите по-нормальному, то до запрета читайте бит разрешения прерываний, сохраняйте его, а потом вместо разрешения - восстанавливайте.