Proteus: вопросы и ответы

Обсуждаем цифровые устройства...
binarick
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Пт фев 27, 2015 17:48:39

Re: Proteus: вопросы и ответы

Сообщение binarick »

Ребят обнаружил проблему
Если я виноват тыкните носом плиз
В общем делаю устройство читающее и выводящее температуру в Protuse 8,3sp2

если раскоментить строку 1 или 2 в мэйне то протеус начинает давать ошибку, о том, что он тормозит и индикатор не зажигается ни как !!??
короче при получении температуры чтото происходит неверное, а что не могу понять.

Изображение

Изображение
на этом скрине видно что появились "серые" сигналы, откуда не ясно.

Код: Выделить всё

#include <mega8.h>
#include <delay.h>
#include <ds18b20.h>

#define BTNPLS      PIND.4
#define BTNMIN      PIND.5
#define BTN12       PIND.6
#define BTNOnOff    PIND.7

#define ten_1 PORTB.1
#define ten_2 PORTB.4

#define MAX_DS1820 2
// Инициализация ds1820 0x1B-PORTA; 0x18-PORTB; 0x15-PORTC
//#asm
//   .equ __w1_port=0x18 ;PORTB
//   .equ __w1_bit=0
//#endasm

unsigned char rom_codes[MAX_DS1820][9];
unsigned char devices;

typedef unsigned char byte;
typedef unsigned long ulong;
byte led_table[10]={0b00000011,0b10011111,0b00100101,0b00001101,0b10011001,0b01001001,0b01000001,0b00011111,0b00000001,0b00001001};
int show_data; //Отображаемая цифра
ulong dig_data=0;
byte dig_num=0; //Отображаемый разряд

int temp[2];

//функция обмена с SPI:
char spi_transfer(volatile char data)
{   SPDR = data;                    // Start the transmission
    while (!(SPSR & (1<<SPIF)))     // Wait the end of the transmission
    {};
    return SPDR;}                    // return the received byte

void GetTemp(short int i)
{
    temp[i]=ds18b20_temperature(&rom_codes[i][0]);
}

//функция вывода на 7 сегментный индикатор
void show_dig() {
	PORTB &= ~(1<<2);
	if (dig_num==0)
    {
	    dig_data=show_data; //Если показываем первую цифру обнавляем переменную
	    dig_num++;
	}
	spi_transfer(dig_num); //Отправляем байт для отображения разряда
	spi_transfer(led_table[dig_data%10]); //Получаем разряд из dig_data и отправляем байт с цифрой
	dig_data/=10;
	dig_num<<=1; //Смещаем бит для отображения следующего разряда
	PORTB |= (1<<2);  // включаем
}

void main(void)
{
DDRB=(0<<DDB7) | (0<<DDB6) | (1<<DDB5) | (1<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (0<<DDB0);
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
DDRC=(0<<DDC6) | (1<<DDC5) | (1<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (1<<DDC0);
PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (1<<DDD3) | (0<<DDD2) | (1<<DDD1) | (0<<DDD0);
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (1<<PORTD0);

// SPI initialization
SPCR=(0<<SPIE) | (1<<SPE) | (1<<DORD) | (1<<MSTR) | (0<<CPOL) | (0<<CPHA) | (1<<SPR1) | (1<<SPR0);

#asm("sei")
//Ищем DS18b20
delay_ms(300);
devices = w1_search(0xf0,rom_codes);
while (1)
    {
//            //for (i=0; i<devices; i++) {GetTemp(i);}
1 //    //        GetTemp(1);
2 //            temp[0]=ds18b20_temperature(&rom_codes[1][0]);

            show_data=111; show_dig();
}
Инициализация сделана в настройках CV AVR 3.12
Прикладываю весь проект + протеус файл

Спасибо огромное за вашу помощь и время
Вложения
thermo.zip
(126.13 КБ) 190 скачиваний
Реклама
Аватара пользователя
Halex
Грызет канифоль
Сообщения: 281
Зарегистрирован: Пт ноя 15, 2013 20:58:23

Re: Proteus: вопросы и ответы

Сообщение Halex »

binarick писал(а):если раскоментить строку 1 или 2 в мэйне то протеус начинает давать ошибку, о том, что он тормозит и индикатор не зажигается ни как !!??
короче при получении температуры чтото происходит неверное, а что не могу понять.
Может в даташиты стоит заглянуть? Например, есть такое понятие у этих датчиков - время преобразования... Затем поставить элементарный "бряк" в вечном вхайле(1) и проиграть его промеж "бряков". Просчитать время опроса, сопоставить с даташитом, слегка офигеть и ... привести всё к норме в программе.
По этому поводу короткий "бородатый" анекдот.
Стоят два быка на вершине горы и смотрят вниз. Молодой - старому:
- Давай быстренько спустимся с горы и отымеем во-о-н ту рыженькую корову.
Старый молчит, жуёт жвачку.
Молодой - старому:
- Ну, тогда давай быстренько спустимся, и отымеем во-о-н ту чёрненькую корову.
Старый прожевал, и отвечает:
- Му-у нет. Мы медленно, медленно спустимся с горы и ... отымеем всё стадо!

Впрочем, досконально в ваш код и не заглядывал, просто бегло обратил внимание на то, что "режет глаза".
==================
baron_P писал(а):но если убрать резисторы R17..R20, то индикаторы будут все время гореть, как будто транзисторы открыты. Вопрос: почему так?
Ответ: потому, что многоразрядные семисегментные индикаторы в Протеусе реализованы программными средствами на основе DLL и НЕ ИМЕЮТ аналоговых свойств, т.е. не являются токопотребляющими устройствами. Иными словами, их сопротивление по выводам "ну очень высокое"... Можете в этом сто раз убедиться, включив в цепь любого вывода милли- или микроамперметр. Убрав резисторы R17...R20, Вы практически полностью убираете нагрузку из цепей коллекторов ключевых транзисторов. Надеюсь, дальше не надо объяснять???
Реклама
Аватара пользователя
baron_P
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Вт сен 14, 2010 23:07:10
Откуда: Ростов

Re: Proteus: вопросы и ответы

Сообщение baron_P »

Chettuser писал(а):ПАчИму не нужны? Ещё как нужны - уберёте и у Вас получится открытый коллектор, но в реале у Вас работать не будут, т.к. 11кОм - слишком много. Хотя... я не знаю какого типа у Вас индикатор - с ОА или с ОК?
В реале работать будет - я проверял :) Индикатор с общим катодом. Если без резисторов, плюс на всех анодах, на базах транзисторов ноль - индикаторы должны быть погашены, т.к. транзисторы закрыты. Когда открою - загорятся. Почему открытый коллектор должен этому помешать в реальной схеме?
Halex написал, почему здесь не работает. Если индикатору не нужен ток, а только напряжение, то без подтяжки катодов к питанию, индикатор всегда будет думать, что на них ноль (транзистор то моделируется не как ключ и малый ток между коллектором и эмитером есть). Это если я правильно понял.
We do what we must because we can (c) GLaDOS
Аватара пользователя
Halex
Грызет канифоль
Сообщения: 281
Зарегистрирован: Пт ноя 15, 2013 20:58:23

Re: Proteus: вопросы и ответы

Сообщение Halex »

baron_P писал(а):Если индикатору не нужен ток, а только напряжение, то без подтяжки катодов к питанию, индикатор всегда будет думать, что на них ноль (транзистор то моделируется не как ключ и малый ток между коллектором и эмитером есть). Это если я правильно понял.
Не совсем так. Выводам любых АНАЛОГОВЫХ компонентов "подвешенным в воздухе" симулятор присваивает нулевой потенциал. Оно, ведь, и по жизни так есть. Если взять "голый" резистор, никуда не подключенный и померить вольтметром напряжение относительно чего-то (земли, полюса баБарейки, "кончика носа или хвоста" и т.п. шибко проводящих кошачьих оконечностей), то на шкале увидим ноль. Ну, и чем нам "врёт" симулятор (картинка)? Но(!!!), цифровому компоненту,реализованному с помощью DLL и не проявляющему никаких аналоговых свойств (в данном случае индикатору, реализованному через LEDMPX.DLL ) этого "эфемерного" нуля достаточно, чтобы принять его, как логический.
Кстати, с элементами конкретной серии цифровых микросхем (TTL, CMOS или М/К) такого не произойдёт, поскольку для них в файле ITFMOD.MDF оговорены некоторые аналого-цифровые привязки к VCC/VDD. А вот если взять тупой цифровой примитив из Modelling Primitives, например, AND_2, то он тоже будет "ловить" нули от висЮчих аналоговых компонентов. Всё потому, что у него нет в свойствах ITFMOD=xxx. Именно оно даёт привязку. Это я Вам выложил упреждающе, чтоб не было лишних вопросов.
Изображение
Ну и по поводу:
Chettuser писал(а):Хотя... я не знаю какого типа у Вас индикатор - с ОА или с ОК?
Не хотел мяукать и шипеть, но раз уж два раза проявилось... baron_P ведь кусок схемы привёл, неужто сразу не ясно куда ключи коммутируют "общие" выводы цифИрЬ? Какие тут могут быть "непонятки"...
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
baron_P
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Вт сен 14, 2010 23:07:10
Откуда: Ростов

Re: Proteus: вопросы и ответы

Сообщение baron_P »

Спасибо.
Но если в реальности мерить висящий в воздухе резистор, то будет не ноль, а что-то наведенное. Чаще всего - какие-то мелкие сетевые 50 Гц. Если один конец резистора прицепить к земле, то будет хороший правильный ноль. По хорошему надо бы вместо нуля выдавать сообщение об ошибке при попытке что-то померить на висящем в воздухе элементе. Но нахаляву и уксус сладкий, чего уж придираться к мелочам.
We do what we must because we can (c) GLaDOS
Реклама
Аватара пользователя
Halex
Грызет канифоль
Сообщения: 281
Зарегистрирован: Пт ноя 15, 2013 20:58:23

Re: Proteus: вопросы и ответы

Сообщение Halex »

baron_P писал(а):По хорошему надо бы вместо нуля выдавать сообщение об ошибке при попытке что-то померить на висящем в воздухе элементе.
Ну, во-первых, идея "померить", т.е. повесить зонды (пробники) напряжения - это чисто моя затея, и предпринята для наглядности.
А, во-вторых, если каждый "висяк" сопровождать сообщением об ошибке, то вариант с нижеприведенной картинки Вас просто "утопит" такими сообщениями. А это, всего-навсего, физика для 7-го класса средней школы... такой "чёрненький ящичек" с ручками. Вспоминаете??? Так будем плыть, или топиться?
Изображение
Реклама
binarick
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Пт фев 27, 2015 17:48:39

Re: Proteus: вопросы и ответы

Сообщение binarick »

В общем я сделал на таймере опрос датчиков но протеус всёравно выдаёт ошибку о тормозах.
Так и не могу понять почему.

Проект физически работает потому особо ни чего не нужно просто интерес.
Прикладываю файлы проекта если вдруг кто захочет глянуть
Вложения
Thermo.zip
(48.13 КБ) 198 скачиваний
Аватара пользователя
Halex
Грызет канифоль
Сообщения: 281
Зарегистрирован: Пт ноя 15, 2013 20:58:23

Re: Proteus: вопросы и ответы

Сообщение Halex »

binarick писал(а):Прикладываю файлы проекта если вдруг кто захочет глянуть
На что взглянуть? На приЛАЖУ? В таком виде там не на что смотреть. Исходников, как всегда... "забыл или просто не знал". Сам проект Протеуса, если предназначался для отладки проги МК, то полный "песец". Такое не может не тормозить. Туда бы еще пару IGBT-шек, и он бы вообще рухнул в полный висяк.
binarick
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Пт фев 27, 2015 17:48:39

Re: Proteus: вопросы и ответы

Сообщение binarick »

Halex писал(а):
binarick писал(а):Прикладываю файлы проекта если вдруг кто захочет глянуть
На что взглянуть? На приЛАЖУ? В таком виде там не на что смотреть. Исходников, как всегда... "забыл или просто не знал". Сам проект Протеуса, если предназначался для отладки проги МК, то полный "песец". Такое не может не тормозить. Туда бы еще пару IGBT-шек, и он бы вообще рухнул в полный висяк.
Благодарю за исчерпывающий ответ! спИциалиста сразу видно "всё вокруг лажа..."
Аватара пользователя
Halex
Грызет канифоль
Сообщения: 281
Зарегистрирован: Пт ноя 15, 2013 20:58:23

Re: Proteus: вопросы и ответы

Сообщение Halex »

binarick писал(а):сразу видно "всё вокруг лажа..."
А что не так??? Хотите полного промывания мозгов? "... Их есть у меня", получайте:
1. В выложенном Вами архиве присутствуют файлы: thermo v1.pdsprj - проект Протеуса версии 8 и thermo.cof - отладочный файл (Common Object File), созданный компилятором. Больше там ничего нет!!! Информации о том, что Вы там на(Ш)кодили в СИ проекте ни тот ни другой файл не содержит. Можете сами убедиться в своей "правоте", скачайте собственный архив и попробуйте запустить не на компе, где всё это "произведено", а на любом другом. С тем же успехом Вы могли приложить вместо COF - HEX, и... попросить многоуважаемых котов... "наковырять из вашего кекса УзюмУ". Это возможно было-бы даже рентабельней, там хоть дизасм подключить можно, хотя тоже желающих мало найдётся.
2. Теперь перейдём к самому проекту Протеуса. Не знаю повезло Вам, или нет, но сегодня у меня под лапами мой "походный потаскун", а на нём как-раз стоит Proteus 8, так что проект я посмотрел. Начнём ... считать тормоза:
- Не далее, как семью постами выше, когда я приводил в ответ Вам замшелый анекдот, я там-же отвечал и baron_P по поводу многоразрядных семисегментников. Видно Вам это мимо "ушей, лап, хвоста". Теперь смотрите в свой проект и отвечайте, как на духу, - зачем там стоят АНАЛОГОВЫЕ резисторы R20...R27? Именно в проекте ISIS, а не в железе (в последнем случае они необходимы). Вот первая "задачка" симулятору - посчитать напряжения/тока на их выводах. Конечно, он считает чуть побыстрее, чем Вы на калькуляторе, но оно Вам (и ему) надо??? ТОРМОЗ 1 - чей?
- К XTAL Меги8 подключен частотозадающие кварц и кондёры, галочек Exclude from Simulation в их свойствах не наблюдается, следовательно при симуляции они просчитываются..., хотя для этого просто достаточно задать тактовую частоту в свойствах МК. ТОРМОЗ 2 - чей?
- на выводах порта C пристутствуют индикаторные светодиоды с токоограничивающими резисторами. И те и другие в свойствах стоят, как ANALOG, хотя подключены непосредственно к цифровому порту, т.е. опять симулятор считает проводимости/токи/ напряжения. ТОРМОЗ 3 - чей?
- На входах PORTD присутствуют 4 кнопки (кстати, подключенные даже по Протеусу не ахти как, да, и попросту неадекватно). Опять, куча аналоговых резюков и диодов, опять считаем "могучие формулы". ТОРМОЗ 4 - чей?
- Ну, и вершина "тормозов" - два аналоговых ключа на полевиках, нагруженных на лампочки. Поскольку кода не видно, и затея в корне не ясна, то комментирую, исходя из тог, что на виду. Если это не ШИМ-мируется, то на фига оно надо. "Релейные" сигналы можно отследить на выходах МК (ноль-Един), если "срение плохой", то с помощью LOGICPROBE (BIG) из библиотеки Debugging Tools. Но (!!!), с ними Протеус не будет мучаться с расчётами для полевиков, а это одна из самых муторных для SPICE-систем бодяга. Вот Вам и ТОРМОЗ 5 (на запасное колесо автомобиля).
Всё, надоело!!! Твержу, как попка, аз-буки-веди, вот только результат нулЁвый. Я всего три основных из перечисленных тормозов убрал, и получил загруз проца (вшивого Атома моего потаскуна!!!) в районе 40%. Хотя, прога и не заработала адекватно, но что там "внутри" одному... binarick известно.
Smirnov007
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пт июл 24, 2015 17:55:19

Re: Proteus: вопросы и ответы

Сообщение Smirnov007 »

А подскажите как на плате сделать землю?
Вот у меня к примеру есть закрытый корпус и к нему припаян минус источника питания на 30В и минус потребителя на 30В. Плюсовые концы выведены за пределы корпуса. Я хотел бы запускать потребитель с МК. Я сделал схему в Протеусе:
Изображение
В симуляции все работало, я развел плату и... ничего не заработало. Тут я в Протеусе заметил элемент земли и как только я его убрал из симуляции у меня выдало ровно те же значения, что и на реальной плате:
Изображение
В интернете написано что земля это по сути общий провод, но может я что-то неправильно понимаю.

UPDATE
Нашел решение в теме "Транзисторный ключ". Опять я поторопился с вопросом...
MrMerso
Родился
Сообщения: 2
Зарегистрирован: Пн сен 28, 2015 18:39:32

Re: Proteus: вопросы и ответы

Сообщение MrMerso »

Здравствуйте. Хочу сделать простейший калькулятор, выполняющий операцию вычитания двух положительных десятичных чисел. C помощью '*' вводится минус, а '#'- равно. Код, по моим представлениям, вроде правильный, но на выходе получается полная ерунда. В прикрепленном файле программа со схемой в протеус.

Код: Выделить всё

#include <io.h>
#include <delay.h>
#include <math.h>
unsigned char Inter(void)            // функция поиска нажатой клавиши
  { 
   unsigned char a; 
   signed char i;
   DDRD=0b00000111;
   DDRA=0b00000000; 
   while(1)
   { 
   i=0;
   a=0;
   for(i=0;i<3;i++)           //цикл перемещения по столбцам 
     {             
     delay_ms(30);
     PORTD|=(1<<i);
     a=PINA;               //считываем значение порта А
       if (a!=0b00000000)
         {
         delay_ms(80);
         a=PINA;
         }
         switch (a)         // проверяем нажатую клавишу
          {
            case 0b00000001:
            a = 3 - i ;
            return (a);break;
            case 0b00000010:
            a = 6 - i ;
            return (a);break;
            case 0b00000100:
            a = 9 - i ;
            return (a);break;
            case 0b00001000:
            a = 12- i ;
            if(a==11)a=0;
            return (a);break;
            default:
            break;
          }
    if(PINA!=0b00000000)
      {
      return(a);            //выводим значение нажатой клавиши
      break;
      }
    PORTD=0b00000000;
    delay_ms(10);
    } 
  }
  }

void LCD_cmd(signed char t, unsigned char cmd)    //функция вывода на ЛСД
  {
   DDRC = 0xFF;        
   DDRD |= ((1<<6)|(1<<7));
   if(t==0) PORTD &= ~(1<<7);
   if(t==1) PORTD |=(1<<7);    
   PORTC = cmd;       
   PORTD |= (1<<6);    
   delay_us(5);        
   PORTD &= ~(1<<6);   
   delay_ms(100);    
   }
void LCD_init(void)               //инициализация ЛСД
    {
     DDRC = 0xFF;         
     DDRD |= ((1<<6)|(1<<7));      
     LCD_cmd(0,0x30);    
     LCD_cmd(0,0x30);    
     LCD_cmd(0,0x30);   
     LCD_cmd(0,0x38);        // 8 разр.шина, 2 строки, 5 ? 7 точек
     LCD_cmd(0,0x0E);        // включить ЖКИ и курсор, без мерцания
     LCD_cmd(0,0x06);        // инкремент курсора, без сдвига экрана
     LCD_cmd(0,0x01);        // очистить экран, курсор в начало
    }
unsigned char Digit (unsigned int d, unsigned char m){
unsigned char i = 5, a;
 while(i){            // цикл по разрядам числа
   a = d%10;            // выделяем очередной разряд
   if(i-- == m) break;    // выделен заданный разряд - уходим
   d /= 10;            // уменьшаем число в 10 раз
 }
 return(a);
}
 
void main (void) {
    unsigned char i,r;
    while(1){
        unsigned int mass1[]={0} ;
        unsigned int d, number1=0,number2=0;
        signed int rez=0;
        LCD_init();
        for (i=0; i<11; i++)           //цикл заполнения массива
        {
            d = Inter();
            switch (d) {
                case 10: 
                    i=4;
                    LCD_cmd(1,'-');        //вывод на ЛСД минуса
                    break;
                case 12: 
                    i=10;
                    LCD_cmd(1,'=');        //вывод на ЛСД равно
                    break;
                default :
                    mass1[i] = d;
                    LCD_cmd(1,'0'+d);     // вывод вводимых цифр
            }
        }  
        
           if(d==12){
           
            for (i=0;i<5; i++)           //цикл подсчета первого числа 
              {  
               number1 = number1*10 + mass1[i];
              }
            for(i=5;i<11;i++)           //цикл подсчета второго числа
              {  
              number2=number2*10+mass1[i]; 
              } 
              rez=number1-number2;  
            for (i=1; i<6; i++)      // цикл вывода на ЛСД результата 
              {  
                r=Digit(rez,i);
                LCD_cmd(1,48+r);
                if(i==5)
                {
                 delay_ms(3000); 
                 LCD_cmd(0,0x01);        // очистить экран, курсор в начало
                 number1=0;number2=0;rez=0;d=0;
                } 
              }
                   
           }   
    }
}
Изображение
Вложения
1.rar
(22.05 КБ) 186 скачиваний
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: Proteus: вопросы и ответы

Сообщение isx »

Приветствую всех)
Подскажите пожалуйста, как отвязать питание ОУ от общих шин?
Если обрезать дорожку с токоизмерительным щупом, то на выходе буфера 1.5В, но как только соединяю, все начинает прыгать и плавать.
Есть подозрение, что вывод первого ОУ как-то соединен с общей шиной, и от этого буфер страдает.
Как можно это исправить? :solder:
Аватара пользователя
baron_P
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Вт сен 14, 2010 23:07:10
Откуда: Ростов

Re: Proteus: вопросы и ответы

Сообщение baron_P »

Halex писал(а):
baron_P писал(а):По хорошему надо бы вместо нуля выдавать сообщение об ошибке при попытке что-то померить на висящем в воздухе элементе.
Ну, во-первых, идея "померить", т.е. повесить зонды (пробники) напряжения - это чисто моя затея, и предпринята для наглядности.
А, во-вторых, если каждый "висяк" сопровождать сообщением об ошибке, то вариант с нижеприведенной картинки Вас просто "утопит" такими сообщениями. А это, всего-навсего, физика для 7-го класса средней школы... такой "чёрненький ящичек" с ручками. Вспоминаете??? Так будем плыть, или топиться?
Изображение
Плыть не кошачье дело. Я не имел в виду ворнинги на полэкрана с обязательным кликом "ОК" на каждом. В логе симулятора вывести лишних десяток сообщений - никакой проблемы с избытком инфы, но сразу видно, что может намеряться не так.
We do what we must because we can (c) GLaDOS
ilya95
Родился
Сообщения: 3
Зарегистрирован: Пт окт 09, 2015 12:18:08

Re: Proteus: вопросы и ответы

Сообщение ilya95 »

Здравствуйте. У меня резко вращается шаговый двигатель. Т.е. не 1-2-3-...-360, а резко по 4 положениям, 0-90-180-270-... например. С чем это может быть связано? Прикладываю схему. Просто я не понимаю, какие настройки в самой схеме выставлять, на шаговом двигателе. Подскажите плиз, как отлаживать сишный код в протеусе.
Вложения
Atmel Studio.7z
(46.48 КБ) 209 скачиваний
Аватара пользователя
Halex
Грызет канифоль
Сообщения: 281
Зарегистрирован: Пт ноя 15, 2013 20:58:23

Re: Proteus: вопросы и ответы

Сообщение Halex »

Эх, поднакопилось. Ну, начнём .... с конца!
ilya95 писал(а):У меня резко вращается шаговый двигатель. Т.е. не 1-2-3-...-360, а резко по 4 положениям, 0-90-180-270-... например. С чем это может быть связано?
Да, с настройками самого двигателя, в частности. Step Angle - единичный шаг у Вас задан 45 градусов, а не 1-2-3, как хочется. Второй момент - Maximum RPM - максимальное количество оборотов в минуту - у Вас 360 (т.е. 6 об/сек) Нетрудно на калькуляторе подсчитать, что единичный шаг на угол 45 градусов (1/8 оборота) будет выполняться за 1/(6*8)=0,02сек. Отсюда вывод - хотите "красоты анимации", уменьшайте единичный шаг и скорость, например, 2 градуса и 120 оборотов. Но это чисто для визуального восприятия. реально - смотрите по зеленому табло.
Что касается отладки, то вместо .HEX в свойствах МК должны быть указаны аналогичные файлы .ELF (они уже созданы у Вас компилятором). В этом случае при постановке в паузу у Вас будут доступны окна с программным кодом на СИ для обоих МК. В них есть свои кнопки для пошаговой "прогулки", возможны постановки брекпойнтов и пр. примочки. Причем, при наличии в проекте двух МК окон будет два пошаговое выполнение кода в одном, вызовет пропорциональное по времени выполнение кода в другом, ну и продвижение анимации основного окна на соответствующий квант времени.
baron_P писал(а):Я не имел в виду ворнинги на полэкрана с обязательным кликом "ОК" на каждом.
Я тоже, да таковых ворнингов и не бывает в Протеусе, только красные ошибки останавливают симуляцию. Предупреждения же чисто логируются, но поскольку лог (если его правильно настроить) несёт очень ценную информацию, то лишние жёлтые ворнинги там нафиг не нужны, только загадят окно и восприятие нужной инфы.
isx писал(а):Подскажите пожалуйста, как отвязать питание ОУ от общих шин?
Так оно и не привязано к ним, хотя ... а про какой конкретно ОУ речь? Я уже пояснял на Казусе, но могу и здесь. Модели ОУ, причём не только в Протеусе, но и во всех других программах основанных на SPICE моделировании содержат внутренние источники токов и напряжений, которые необходимы для адекватного моделирования их работы. При подключении внешних цепей питания, нагрузки и т.п. их действие компенсируется. Однако, если тупо навешать на никуда не подключённые выводы ОУ зонды напряжения, которые меряют потенциал относительно земли, то Вы будете "приятно удивлены". Можете самостоятельно проделать такую "шутку", например, с весьма популярным ОУ LM358. Причём, в багаже Протеуса таковых симулируемых моделей две - одна SPICE, другая - Schematic. Так вот у второй зонды могут показать на выводах сотни вольт, что многих приводит просто в шоковое состояние. Тем не менее, я много раз моделировалсхемы с этими ОУ в Протеусе, и потом переносил в "железо". Можете поверить на слово, можете и поэкспериментировать, но результаты в железе оказывались очень и очень близкими к программным.
MrMerso писал(а):Код, по моим представлениям, вроде правильный...
Вообще-то не думаю, что ветка о Протеусе лучшее место для "разборки полётов" Сишного кода AVR, да и времени на это уходит гораздо более, чем есть. Но если хотите навскидку, то "силь-ву-пле". Сразу убивает наповал бесконечная инициализация массива и переменных, ну и уж тем более LCD внутри вечного цикла while(1). Дальше даже и смотреть не хочется. Так что "по моим представлениям" не всё тут правильно...
ilya95
Родился
Сообщения: 3
Зарегистрирован: Пт окт 09, 2015 12:18:08

Re: Proteus: вопросы и ответы

Сообщение ilya95 »

Спасибо. Поставил 0.5 и 360, и все заработало как надо. Однако при попытке изменить время задержки с 1 секунды между шагами на любое другое значение, шд начинает вести себя неадекватно, т.е. то бесконечно прыгает -1 - 0, то 0 - 1. С чем это может быть связано? Открывал семплы с шд, так там вообще стоят значения 45 и 360, а работает все плавно... эх
Т.е. у меня корректно работа идет 0,0004c и внешней задержке 1с. А как увеличить скорость вращения?
Аватара пользователя
Halex
Грызет канифоль
Сообщения: 281
Зарегистрирован: Пт ноя 15, 2013 20:58:23

Re: Proteus: вопросы и ответы

Сообщение Halex »

ilya95 писал(а):Открывал семплы с шд, так там вообще стоят значения 45 и 360, а работает все плавно... эх
Ну, так "Вам шашечки - или ехать". Вам не приходило в голову воспользоваться графическим анализом. Это супер-мощный инструмент для отладки, а вот пользоваться им многие пренебрегают... Скажем, такой вариант для семпла из папки AVR with Stepper Motor (скриншот). Обратите внимание на времянки Digital графика - полный график 1 сек с "зажатой" (заранее включённой - щелчок по стрелке кнопки) кнопкой реверса. Проделайте то же в своём проекте (предупреждаю - время графика придётся увеличить раз в десять, чтобы увидеть ВАШИ импульсы). Теперь понятно - где собака порылась? Потому у Вас и прыгает -как попало, что "движок не сфазирован", как говорят электрики.
Изображение
ЗЫ. Ой, забыл обратить Ваше внимание, что активный на графике уровень - лог. 1, что означает для ULN-ки открытие соответствующего ключа, т.е. "засаживание" данной фазы шаговика на ноль. Препеписывайте свой ресивер СИ.
Аватара пользователя
bobr 25
Электрический кот
Сообщения: 1047
Зарегистрирован: Вт янв 08, 2013 04:08:16
Откуда: FAR EAST FOREVER

Re: Proteus: вопросы и ответы

Сообщение bobr 25 »

коты поставил себе протеус 8, а печать в негативе найти не могу- подскажите плз. Есть режимы-белая бумага, темная бумага, монохром, а негатива нет. на 7 версии все было. Спасибо справился в Аресе на вкладке слои создал новый цветовой слой "негатив"- в нем задал все нужные параметры (все слои выводимые на печать сделал белым цветом, бумага темным цветом).
1.Всегда бывает первый раз.
2.Родился сам, помоги другому
vite
Открыл глаза
Сообщения: 56
Зарегистрирован: Вт дек 11, 2012 19:50:50

Re: Proteus: вопросы и ответы

Сообщение vite »

а что означает, если запустить модулирование сразу квадраты загорается желтым цветом а потом красным? :) :) :)
Ответить

Вернуться в «Цифровая техника»