Помогите правильно прошить.

Обсуждаем контроллеры компании Atmel.
Ответить
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

кто бы мне еще объяснил, зачем эти извращения с переопределением, если таблица все равно глобальная...
Просто передавайте в функцию номер строчки
for(i=0; i<8; i++)
{
SetState( i );
void SetState(int i )
OCR0A = cTable[0];

и так далее...
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Gisteresis писал(а): Работает :shock: (у меня нет, выше выкладывал результат)
Так, а какая у вас версия CV?
У меня 2.05 кажись. Какая то вторая в общем, точно смогу сказать вечером.
Протеус 7.10
У меня тоже 2,05. (Кстати, выдавал ошибку, что в ассемблерном коде отсутствует определение регистра MCUCR. Пришлось ручками добавлять)

Попробуйте с разными настройками оптимизации. но скорее всего, проблема в том, что CV размещает массив там, где надо, а вот берет его из SRAM...

К тому же, в студио с модификатором const (аналог flesh CV) работает так же, как и без оного. Только вот первая нога почему-то не генерит сигнал.. И студия не выдает ошибок, что не помещается. У нее все влазит.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

urry писал(а): Просто передавайте в функцию номер строчки
.
Так до этого уже добрались. )) Вечером человек попробует и отпишется. Интересно саму суть проблемы разобрать. Почему компилятор не генерит загрузку переменной из флеш?
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

не знаю, у меня содевижин старый и проект не открывает. Покажи через прогмем, как это не работает в студии.
Кстати, квалификатор const копирует данные из флеш в оперативку для ускоренной выборки, кажется.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 4732
Зарегистрирован: Ср сен 18, 2013 10:08:26
Откуда: Санкт-Петербург

Сообщение Gisteresis »

ИС-пытатель, рекомендую вам прочитать пункт 2.2 правил, модеры тут жесткие!

И спасибо вам, за советы. Сегодня вечером опробую.
ИС-пытатель писал(а):(Кстати, выдавал ошибку, что в ассемблерном коде отсутствует определение регистра MCUCR. Пришлось ручками добавлять)
Что куда вы добавили?
ИС-пытатель писал(а):Думаю, у Вас что-то типа этого, только для CV
Да, я это прочитал, но к сожалению это для WinAVR, для CV я так и не нашел подобного.
urry писал(а):Кстати, квалификатор const копирует данные из флеш в оперативку для ускоренной выборки, кажется.
Да вот кажется да не совсем так!
Пока лопатил инет, встречал что по const не все компиляторы размещают во флеше. Правильно писать именно flash а не const.
Утверждать не буду, еще нуб в таких вопросах.
Вот тут например пишут:
http://roboforum.ru/forum2/topic4870-30.html
Последний раз редактировалось Gisteresis Пн мар 17, 2014 12:42:43, всего редактировалось 1 раз.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Gisteresis писал(а):
ИС-пытатель писал(а):(Кстати, выдавал ошибку, что в ассемблерном коде отсутствует определение регистра MCUCR. Пришлось ручками добавлять)
Что куда вы добавили?
#asm(".equ mcucr = 0x35")

Первой строкой. Чтобы не писало ошибку. почему-то CV не вставлял в ассемблерный файл определение данного регистра.
Правильно писать именно flash а не const.
Студия, например, не понимает слова flash. Только const.
Да и в принципе, если программа умещается в SRAM, то почему бы и нет, если компилятор запихнул туда данные с const. Так ведь быстрее будет. То есть компилятор в данном случае все правильно делает. Другой дело, существуют применения, в которых данные в SRAM могут повредится каким-либо образом... Но в этом случае и флеш не намного застрахована..
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4732
Зарегистрирован: Ср сен 18, 2013 10:08:26
Откуда: Санкт-Петербург

Сообщение Gisteresis »

ИС-пытатель писал(а):#asm(".equ mcucr = 0x35")

Первой строкой. Чтобы не писало ошибку. почему-то CV не вставлял в ассемблерный файл определение данного регистра.
Странно у меня CV (да у меня 2.05.00 про) добавила эту строчку сама.
Спойлер.LISTMAC
.EQU UDRE=0x5
.EQU RXC=0x7
.EQU USR=0xB
.EQU UDR=0xC
.EQU EERE=0x0
.EQU EEWE=0x1
.EQU EEMWE=0x2
.EQU EECR=0x1C
.EQU EEDR=0x1D
.EQU EEARL=0x1E
.EQU WDTCR=0x21
.EQU MCUSR=0x34
.EQU MCUCR=0x35
.EQU SPL=0x3D
.EQU SREG=0x3F
.EQU GPIOR0=0x13
.EQU GPIOR1=0x14
.EQU GPIOR2=0x15
В общем попробовал не передавать через стек функции а только указатель.
Картинка изменилась, но все равно не пашет большой массив :dont_know:
НО! Стал пахать с флеш маленький массив, прогресс!!! :)))

Покопавшись еще 3 минуты понял что сайзоф неработает толи неправильно написал :dont_know: Пока заменил на число и все поехало! :solder:
Поставил на реальную схему... все вертится урааа :music:
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

А где у тебя в коде sizeof?
Заработало в первоначальном варианте или в том, где указатель передаешь? Дай код
Друг Кота
Аватара пользователя
Сообщения: 4732
Зарегистрирован: Ср сен 18, 2013 10:08:26
Откуда: Санкт-Петербург

Сообщение Gisteresis »

ИС-пытатель писал(а):А где у тебя в коде sizeof?
Спойлер

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

while(1)
    {        
        int i=0;
        for(i=0; i</*sizeof(cTable[0])*/32; i++)
        {
            SetState( i );
            delay_ms( 5 );
        }        
    }
ИС-пытатель писал(а):Заработало в первоначальном варианте или в том, где указатель передаешь? Дай код
Спойлер

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

/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 10.03.2014
Author  : 
Company : 
Comments: 


Chip type               : ATtiny2313A
AVR Core Clock frequency: 8,000000 MHz
Memory model            : Tiny
External RAM size       : 0
Data Stack size         : 32
*****************************************************/

#include <tiny2313a.h>
#include <delay.h>

// Declare your global variables here

/*flash unsigned char cTable[][4] = {
{0xff,0x00,0x00,0x00},
{0x00,0xff,0x00,0x00},
{0x00,0x00,0xff,0x00},
{0x00,0x00,0x00,0xff}};*/

/*flash unsigned char cTable[][4] = {
{0xff,0x00,0x00,0x00},
{0xff,0xff,0x00,0x00},
{0x00,0xff,0x00,0x00},
{0x00,0xff,0xff,0x00},
{0x00,0x00,0xff,0x00},
{0x00,0x00,0xff,0xff},
{0x00,0x00,0x00,0xff},
{0xff,0x00,0x00,0xff}};*/

flash unsigned char cTable[][4] = {
{255, 0  , 0  ,	0  },
{250, 50 , 0  ,	0  },
{236, 98 , 0  ,	0  },
{212, 142, 0  ,	0  },
{180, 180, 0  ,	0  },
{142, 212, 0  ,	0  },
{98 , 236, 0  ,	0  },
{50 , 250, 0  ,	0  },
{0  , 255, 0  ,	0  },
{0  , 250, 50 ,	0  },
{0  , 236, 98 ,	0  },
{0  , 212, 142,	0  },
{0  , 180, 180,	0  },
{0  , 142, 212,	0  },
{0  , 98 , 236,	0  },
{0  , 50 , 250,	0  },
{0  , 0  , 255,	0  },
{0  , 0  , 250,	50 },
{0  , 0  , 236,	98 },
{0  , 0  , 212,	142},
{0  , 0  , 180,	180},
{0  , 0  , 142,	212},
{0  , 0  , 98 ,	236},
{0  , 0  , 50 ,	250},
{0  , 0  , 0  ,	255},
{50 , 0  , 0  ,	250},
{98 , 0  , 0  ,	236},
{142, 0  , 0  ,	212},
{180, 0  , 0  ,	180},
{212, 0  , 0  ,	142},
{236, 0  , 0  ,	98 },
{250, 0  , 0  ,	50 }}; 


void SetState( int iState )
{
    if( cTable[iState][0] > 0 && cTable[iState][2] > 0 ||
        cTable[iState][1] > 0 && cTable[iState][3] > 0)
    {
        delay_ms(5000);
        return;
    }
    
    OCR0A = cTable[iState][0];
    OCR1A = cTable[iState][1];
    OCR0B = cTable[iState][2];
    OCR1B = cTable[iState][3];
} 

void main(void)
{
//#asm(".equ mcucr = 0x35");
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port A initialization
// Func2=In Func1=In Func0=In 
// State2=T State1=T State0=T 
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=Out Func3=Out Func2=Out Func1=In Func0=In 
// State7=T State6=T State5=T State4=0 State3=0 State2=0 State1=T State0=T 
PORTB=0x00;
DDRB=0x1C;

// Port D initialization
// Func6=In Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In 
// State6=T State5=0 State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x20;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Fast PWM top=0xFF
// OC0A output: Non-Inverted PWM
// OC0B output: Non-Inverted PWM
TCCR0A=0xA3;
TCCR0B=0x03;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Fast PWM top=0x00FF
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA1;
TCCR1B=0x0B;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
DIDR=0x00;

OCR0A = 0;
OCR0B = 0;
OCR1A = 0;
OCR1B = 0;  

    while(1)
    {        
        int i=0;
        for(i=0; i</*sizeof(cTable[0])*/32; i++)
        {
            SetState( i );
            delay_ms( 5 );
        }        
    }
}
Двиг запищал мелодичнее, но немного все равно как то подергивается при движении.
Может от того что я подключаю от источника на 1А, у меня постоянно перегруз фигачит. Движки я подключаю явно побольше ток нужен. БП простой компенсационный. Там и защита на транзисторе. Может из за этого?

Осциллом смотрю обмотки, там явно не синус. ШИМ фигачит и искажается видимо индуктивностью обмоток.

Может подскажите как улучшить?

Частота ШИМа 125кгц много? Сколько обычно ставят?

И каким боком датчики тока на обмотки прикошачивать не пойму?
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Частота от двигателя зависит. надо ДШ на двиг смотреть. Если сильно большая - обмотки будут вносить большое сопротивление. Значит будет уменьшение КПД и небольшой нагрев. Слишком малая частота будет приводить к вибрациям и неравномерности вращения. Совсем малая - опять-таки нагрев. Можно попробовать экспериментально подобрать. А вообще несколько сотен герц для двигателя - за глаза. Куда ему килогерцы?
Поэкспериментируйте.
А по остальному.. сложно так на вскидку сказать..
Кстати, я не обратил внимания, вы пишете, что двигатель шаговый... . В таком случае, частота естественно большая. (скорее всего гораздо больше частоты, с которой вращается вал). отсюда и неравномерность.
Ответить

Вернуться в «AVR»