Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 09.11.2009, 13:36  
altyam
Прохожий
 
Регистрация: 11.08.2007
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
altyam на пути к лучшему
По умолчанию Симуляция PIC-микроконтроллеров в Proteus

Здравствуйте, участники форума. Я начал осваивать Proteus сравнительно недавно и у меня возник вопрос по PICам. Пытаюсь промоделировать схему с PIC16F877, котороая выводит на ЖКИ время в формате часы-минуты-секунды. Для отсчета секундных интервалов я использую Таймер 1 с внешним кварцем 32кГц (по прерываниям через 1 секунду вызывается функция, которая инкрементирует время и выводит его на ЖКИ). Так вот - проблема в том, что Протеус как-будто "не видит", что Таймер 1 использует внешнее тактирование, программа написана правильно. Никто не пробовал моделировать схемы на PICах, в которых используется Таймер 1 с внешним кварцем?
Реклама:
altyam вне форума  
Непрочитано 09.11.2009, 18:19  
Halex07
Супер-модератор
 
Аватар для Halex07
 
Регистрация: 03.05.2007
Сообщений: 2,695
Сказал спасибо: 28
Сказали Спасибо 4,508 раз(а) в 956 сообщении(ях)
Halex07 на пути к лучшему
По умолчанию Re: Симуляция PIC-микроконтроллеров в Proteus

Сообщение от altyam Посмотреть сообщение
Для отсчета секундных интервалов я использую Таймер 1 с внешним кварцем 32кГц
Если Вы действительно прилепили в проекте Протеус внешний кварц (модель CRYSTAL), то выкиньте его на... из схемы изамените генератором Clock с нужной частотой, только соеринтируйтесь по даташиту МК на какую ногу контроллера его повесить. Или "проект в студию"
Halex07 вне форума  
Непрочитано 10.11.2009, 12:12  
altyam
Прохожий
 
Регистрация: 11.08.2007
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
altyam на пути к лучшему
По умолчанию Re: Симуляция PIC-микроконтроллеров в Proteus

Спасибо за ответ. Я сейчас читаю-перевожу книгу Peter H. Anderson - PIC16F877x Tutorial by Example и моделирую схему, представленные в ней в Proteus. Ниже представлен текст программы с комментариями (hex-файл создавался с помощью компилятора CCS). Да, я действительно использовал модель CRYSTAL и Таймер 1 не тактировался вообще - т.е. переполнений не было. Эта программа заточена под 4-хстрочный дисплей, но в Proteus я использовал 2-хстрочный. В железе эта программа работает.

// Программа TIMER1_1.C
//Используется таймер TMR1, который тактируется внешним кристаллом 32.768 кГц
// с выводов T1OSC0 и T1OSC1.
// На экране ЖКИ отображается время в формате "часы-минуты-секунды".
// Разработано, Peter H. Anderson, Baltimore, MD, Dec, '00
#case // Компилятор чувствителен к регистру букв
#device PIC16F877 *=16 // Используем МК PIC16F877
#include ‹defs_877.h› // Описание регистров и битов PIC16F877
#include ‹lcd_out.h› // Прототипы функций для работы с ЖКИ

#define TRUE !0 // Теперь TRUE – это 1
#define FALSE 0 // Теперь FALSE – это 0

struct TM // Объявляем структурный тип ТМ
{
byte hr; // 8 бит для хранения часов
byte mi; // 8 бит для хранения минут
byte se; // 8 бит для хранения секунд
};

void blip_tone(void);
void increment_time(struct TM *t); // Структурный тип передается по ссылке

byte timer1_int_occ;//Глобальная переменная – видна во всех функциях программы

void main(void) // Начало программы
{ // Начало main
long elapsed_t; // 32 бита для хранения истекшего времени
struct TM t; // Создаем переменную типа структуры ТМ

pcfg3=0; pcfg2=1; pcfg1=0; pcfg0=0;//Режим АЦП 3/0 – 3 аналог. входа RA3, RA1, RA0

lcd_init(); // Инициализация ЖКИ

portd0 = 0;// Выводим на контакт спикера RD0 лог. 0
trisd0 = 0; // RD0 – режим вывод

// Настраиваем таймер TMR2
PR2 = 250; // Время переполнения 250*4 мксек =1 мсек (при Fosc=4 МГц)

// Коэффициент деления постделителя TMR2 равен 1:1
toutps3 = 0; toutps2 = 0; toutps1 = 0; toutps0 = 0;

// Коэффициент деления предделителя TMR2 равен 1:4
t2ckps1 = 0; t2ckps0 = 1;

// Настраиваем таймер TMR1
t1oscen = 1;// Разрешаем тактирование таймера от внешнего кварца
tmr1cs = 1;// Выбираем внешнее тактирование для этого таймера

t1ckps1 = 0; t1ckps0 = 0;// Коэффициент деления предделителя TMR1 равен 1:1

tmr1if=0;//Чтобы не было ложного входа в обработчик – сбрасываем флаг от TMR1
TMR1L = 0x00; // Инициализируем таймер числом 0х8000 (3276
TMR1L = 0x80;

tmr1ie = 1; // Разрешаем прерывания по переполнению таймера TMR1
peie = 1; // Разрешаем прерывания от периферийных устройств
gie = 1; // Глобальное разрешение прерываний

timer1_int_occ = FALSE; // Глобальная переменная равна 0 (FALSE)

elapsed_t = 0; // Начинаем отсчет времени с 0
t.hr = 0; t.mi = 0; t.se = 0; // Минуты=секунды=часы=0

tmr1on = 1; // Включаем таймер TMR1 – с этого момента он начинает считать

//В программе можно использовать 4-хстрочный индикатор – он более информативен
lcd_clr_line(2); // Очищаем строку 3 индикатора и …
printf(lcd_char, "Impress the spouse"); // выводим строку Impress the spouse
lcd_clr_line(3); // Очищаем строку 4 и …
printf(lcd_char, "with a personal msg!"); // выводим строку with a personal msg!

while(1) // Бесконечный цикл
{ // Начало while
if (timer1_int_occ) // Если глоб перем. timer1_int_occ равна 1, то…
{ // Начало if
timer1_int_occ = FALSE; // Опять обнуляем глоб. перем. timer1_int_occ
++elapsed_t; // Инкрементируем прошедшее время
increment_time(&t);//Передаем адрес структурной переменной в increment_time()
lcd_clr_line(0); // Очищаем строку 0 индикатора и…
printf(lcd_char, "%ld ", elapsed_t); // выводим истекшее время

lcd_clr_line(1); // Очищаем строку 1 индикатора и…
lcd_dec_byte(t.hr, 2); // выводим кол-во часов в 2х разрядах
lcd_char(':'); // Выводим «:»
lcd_dec_byte(t.mi, 2); // выводим кол-во минут в 2х разрядах
lcd_char(':'); // Выводим «:»
lcd_dec_byte(t.se, 2); // И выводим кол-во секунд в 2х разрядах
blip_tone(); // Вызываем blip_tone()
} // Конец if
} // Конец while
} // Конец main

void blip_tone(void)
{ // Начало blip_tone
tmr2ie = 1; // Разрешаем прерывания от таймера TMR2
peie = 1; // Разрешаем прерывания от периферийных устройств
tmr2on = 1; // Включаем таймер TMR2
gie = 1; // Глобальное разрешение прерываний

delay_ms(200); // Пауза 200 мсек – за это время таймер TMR2 переполнится 200 раз

tmr2ie = 0; // Запрещаем прерывания от таймера TMR2
tmr2on = 0; // Выключаем таймер TMR2
} // Конец blip_tone

void increment_time(struct TM *t) // Функция считает время в формате «ч-м-с»
{ // Начало функции
++t-›se; // Инкрементируем секунды
if (t-›se › 59) // Если секунд больше 59, то…
{ // Начало if1
t-›se = 0; // обнуляем счетчик секунд и…
++t-›mi; // инкрементируем минуты
if (t-›mi › 59) // Если минут больше 59, то…
{ // Начало if2
t-›mi = 0; // обнуляем минуты и…
++t-›hr; // инкрементируем часы
if (t-›hr › 23) // Если часов больше 23, то…
{ // Начало if3
t-›hr = 0; // обнуляем часы
} // Конец if3
} // Конец if2
} // Конец if1
} // Конец функции

#int_timer1
timer1_int_handler(void) // Обработчик прерывания от таймера TMR1
{
timer1_int_occ = TRUE; // Разрешаем вход в блок if функции main
TMR1H = 0x80; // Инициализируем таймер TMR1
}

#int_timer2
timer2_int_handler(void)
{
portd0 = !portd0; // Инвертируем бит RD0 – динамик щелкает…
}
#include ‹lcd_out.c›
Миниатюры:
Нажмите на изображение для увеличения
Название: Clock.JPG
Просмотров: 702
Размер:	92.0 Кб
ID:	1926  
altyam вне форума  
Непрочитано 08.04.2011, 12:13  
pro__
Прохожий
 
Регистрация: 21.02.2008
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
pro__ на пути к лучшему
По умолчанию Re: Симуляция PIC-микроконтроллеров в Proteus

Такая же штука, написал простейшую прогу, которая инкрементирует переменную по таймеру - не работает в Proteus.
Вот код:
#include ‹p18cxxx.h›

#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config BOREN = ON
#pragma config MCLRE = ON

void MyHighInt (void);

#pragma interrupt MyHighInt
#pragma code high_vector = 0x08

void high_vector(void)
{
_asm GOTO MyHighInt _endasm
}

#pragma code

unsigned int count1=0;

void MyHighInt(void)
{
count1++;
if (PIR1bits.TMR1IF==1)
{
count1++;
TMR1H=0x80;
PIR1bits.TMR1IF = 0;
count1++;
}
}

void main()
{
ADCON1 = 0x0f;
RCONbits.IPEN=1;
TMR1L=0;
TMR1H=0x80;
T1CON=0x0F;

IPR1bits.TMR1IP =1;
PIE1bits.TMR1IE=1;
INTCONbits.GIEH=1;

while(1)
{
//
}
}
pro__ вне форума  
Непрочитано 08.04.2011, 12:46  
pro__
Прохожий
 
Регистрация: 21.02.2008
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
pro__ на пути к лучшему
По умолчанию Re: Симуляция PIC-микроконтроллеров в Proteus

Кто нибудь знает как это лечится, чтобы заработало в Proteus?
Компилятор "mcc18", проц. PIC18F4525.
pro__ вне форума  
Непрочитано 08.04.2011, 13:12  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Симуляция PIC-микроконтроллеров в Proteus

Все там работает. Проверял лично на PIC16F870 год назад. Кварц не моделируем. Так же не моделируем кофемолки, пылесосы и стиральные машинки. Вместо них ставим примитивы. В вашем случае, как уже сказали, CLOCK 32768 на ногу RC1/T1OSI/CCP2.
Easyrider83 вне форума  
Непрочитано 08.04.2011, 13:53  
pro__
Прохожий
 
Регистрация: 21.02.2008
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
pro__ на пути к лучшему
По умолчанию Re: Симуляция PIC-микроконтроллеров в Proteus

ООО ребята я извиняюсь, видно код гнилой написал - вот рабочая версия, все в PROTEUS пашет!!!

#include ‹p18f4525.h›
#include ‹stdio.h›

#pragma config WDT = OFF

unsigned int count1=0;

void Init(void);
void timer(void);

#pragma code high_vector = 0x08
void interrupt (void)
{
_asm GOTO timer _endasm
}

#pragma code
#pragma interrupt timer
void timer(void)
{
//printf("Hallow! \n");
if (PIR1bits.TMR1IF==1)
{
TMR1H=0x39;
TMR1L=0xfa;
PIR1bits.TMR1IF = 0;
count1++;
}
}

void main()
{
//printf("GO \n");

Init();

IPR1bits.TMR1IP =1;
PIE1bits.TMR1IE=1;
INTCONbits.GIEH=1;

while(1)
{
//printf("Start2 \n");
//
}

}

void Init()
{
TMR1H=0x39;
TMR1L=0xfa;
PIR1bits.TMR1IF=0;
PIE1bits.TMR1IE=1;
INTCON=0xC0;
T1CON=0x91;
}
pro__ вне форума  
Непрочитано 08.04.2011, 14:00  
Halex07
Супер-модератор
 
Аватар для Halex07
 
Регистрация: 03.05.2007
Сообщений: 2,695
Сказал спасибо: 28
Сказали Спасибо 4,508 раз(а) в 956 сообщении(ях)
Halex07 на пути к лучшему
По умолчанию Re: Симуляция PIC-микроконтроллеров в Proteus

Сообщение от pro__ Посмотреть сообщение
ООО ребята я извиняюсь, видно код гнилой написал - вот рабочая версия, все в PROTEUS пашет!!!
Ну еСЧе бы, одно вот это чего стоит в первом варианте:
Код:
#include ‹p18cxxx.h›
Это называется пойди туда, не знаю куда.
Halex07 вне форума  
Непрочитано 08.04.2011, 14:38  
st_1
Заблокирован
 
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
st_1 на пути к лучшему
По умолчанию Re: Симуляция PIC-микроконтроллеров в Proteus

Сообщение от Halex07 Посмотреть сообщение
Это называется пойди туда, не знаю куда.
Это называется "ляпнул то, сам не знаю что"... Не знаете - не советуйте... Или читайте доку на МСС18 и посмотрите что к чему...
st_1 вне форума  
Непрочитано 08.04.2011, 15:34  
pro__
Прохожий
 
Регистрация: 21.02.2008
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
pro__ на пути к лучшему
По умолчанию Re: Симуляция PIC-микроконтроллеров в Proteus

Последний рефакторинг этого простого кода - работает:
Симуляция - PROTEUS 7.7 / Компилятор - mcc18 / Описание - прога увеличивается счетик count1 по прерыванию от таймера_№1
-------------------------------------------------------------------------
#include ‹p18f4525.h›
#include ‹timers.h›
#include ‹stdio.h›

#pragma config WDT = OFF

unsigned int count1=0;
unsigned char configT1 = TIMER_INT_ON &
T1_16BIT_RW &
T1_SOURCE_INT &
T1_PS_1_4 &
T1_OSC1EN_OFF &
T1_SYNC_EXT_OFF;

void Init(void);
void myHighInt(void);

#pragma interrupt myHighInt
#pragma code high_vector = 0x08
void high_vector (void)
{
_asm GOTO myHighInt _endasm
}

#pragma code

void myHighInt(void)
{
printf("Hallow! \n");
if (PIR1bits.TMR1IF==1)
{
//PIR1bits.TMR1IF = 0;
CloseTimer1();
WriteTimer1(255);
OpenTimer1(configT1);
count1++;
}
}

void main()
{
INTCONbits.GIE = 0;
printf("GO \n");

//IPR1bits.TMR1IP = 1; //таймер 1 высокоприор.
//PIE1bits.TMR1IE=1; //разрешает прер. от таймера 1
//INTCONbits.GIEH = 1; //разрешение высокоприор. прерываний.

Init();
INTCONbits.PEIE =1;
INTCONbits.GIE = 1;
while(1)
{
//printf("Start2 \n");
//
}

}

void Init()
{
WriteTimer1(250);
OpenTimer1(configT1);


//PIR1bits.TMR1IF=0;
//PIE1bits.TMR1IE=1;
//INTCON=0xC0;
//T1CON=0x91;
}
pro__ вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему Proteus тормозит nsklital Proteus 1 02.11.2009 21:41
LPT b PROTEUS romshe Proteus 0 01.11.2009 18:22
Размещение констант в памяти программ в PIC ST_Senya Микроконтроллеры, АЦП, память и т.д 10 15.10.2009 20:12
proteus, симуляция, желтый цвет возле ножки МК - что значит? digitest Микроконтроллеры, АЦП, память и т.д 1 09.10.2009 10:43
[Решено] Проблема с eeprom в Proteus Memfis666 Proteus, KiCAD и другие ECAD 1 01.10.2009 15:38


Часовой пояс GMT +4, время: 03:37.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot