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

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

Сообщение Gisteresis »

Мяяяяяу коты!
Сделал прошивку драйвера ШД при помощи CodeVision:
Спойлер

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

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

// Declare your global variables here

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}};

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

void main(void)
{
// 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<8; i++)
        {
            SetState( cTable[i] );
            delay_ms( 2 );
        }        
    }
}
Вставил в схему (Схема 2 обычных Н моста, шимы управляют обмотками), все вертится работает.
Хочу расширить этот массив, на что компилятор мне говорит что я вылез за пределы памяти RAM.
Почитал, вроди как надо разместить его во flash.
Пометил массив и аргумент в функции как flesh. Все скомпилировалось и собралось без проблем!
Прошиваю как обычно, программатором TL866a, хекс файл в "Code memo", ставлю в плату и нифига не работает. :dont_know: Гудит, одна нога подрыгивает...

Подумал, что массив не правильный налепил, попробовал просто пометить в рабочей прошивке массив и аргумент как flash и тоже перестало работать. Без flash этот маленький массив работает.

Помогите, что надо сделать чтобы большой массив разместить во flash а не в ram как по умолчанию?

Гуглил много, но ничего не помогло :dont_know:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4752
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

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

Сообщение Gisteresis »

vem566 писал(а):Нужно читать букварь по программатору. Ram и flash прошиваются по разному.
Программатор недавно приобрел.

Вот как я делал:
*.hex который выдает CodeVision я открываю в программаторе. Выбираю файл, появляется окно:

ИзображениеИзображение

Выбираю Intel hex и Code memory

Выставляю фузы и кнока программировать. Так я шил пока видимо RAM хватало на программы.

Я так понял Code memory в этом программаторе и есть flash судя по объему памяти.
Для ATTiny2313A Code memory имеет последний адрес 0x7F0, что как раз по объему подходит под флеш.
А в Data memory последний адрес 0x70 что по объему подходит под EEPROM.

В данном программаторе нигде нет слов Flash, SRAM, EEPROM. Зато есть какие то Code memory и Data memory.
В меню тоже ничего нет. Все, что в окне (на картинке видно) есть в меню.

CodeVision выдает помимо hex еще один файл rom, в свойствах файла подписано Atmel FLASH contents file (.rom).
Судя по содержанию вроди как похоже на данные массива, помеченного как flesh. Но как это открыть, куда шить? :dont_know:

ИзображениеИзображение

Вот как он выглядит в блокноте:
Спойлер000000:C022
000001:CFFE
000002:CFFD
000003:CFFC
000004:CFFB
000005:CFFA
000006:CFF9
000007:CFF8
000008:CFF7
000009:CFF6
00000A:CFF5
00000B:CFF4
00000C:CFF3
00000D:CFF2
00000E:CFF1
00000F:CFF0
000010:CFEF
000011:CFEE
000012:CFED
000013:00FF
000014:0000
000015:FFFF
000016:0000
000017:FF00
000018:0000
000019:FF00
00001A:00FF
00001B:0000
00001C:00FF
00001D:0000
00001E:FFFF
00001F:0000
000020:FF00
000021:00FF
000022:FF00
000023:94F8
000024:27EE
000025:BBEC
000026:BFE5
000027:E1F8
000028:B7A4
000029:7FA7
00002A:BFA4
00002B:BDF1
00002C:BDE1
00002D:E08D
00002E:E0A2
00002F:93ED
000030:958A
000031:F7E9
000032:E880
000033:E6A0
000034:93ED
000035:958A
000036:F7E9
000037:E0E0
000038:BBE3
000039:BBE4
00003A:BBE5
00003B:EDEF
00003C:BFED
00003D:E8C0
00003E:C029
00003F:D079
000040:D07B
000041:F020
000042:D076
000043:9632
000044:D077
000045:F448
000046:D072
000047:9631
000048:D073
000049:F020
00004A:D06E
00004B:9633
00004C:D06F
00004D:F408
00004E:C006
00004F:E8E8
000050:E1F3
000051:93FA
000052:93EA
000053:D072
000054:C011
000055:D063
000056:9004
000057:BE06
000058:D060
000059:9631
00005A:D064
00005B:BDFB
00005C:BDEA
00005D:D05B
00005E:9632
00005F:9004
000060:BE0C
000061:D057
000062:9633
000063:D05B
000064:BDF9
000065:BDE8
000066:9621
000067:9508
000068:E8E0
000069:BDE6
00006A:E0E0
00006B:BDE6
00006C:BBEB
00006D:BBEA
00006E:BBE8
00006F:E1EC
000070:BBE7
000071:E0E0
000072:BBE2
000073:E2E0
000074:BBE1
000075:EAE3
000076:BFE0
000077:E0E3
000078:BFE3
000079:E0E0
00007A:BFE2
00007B:D046
00007C:EAE1
00007D:BDEF
00007E:E0EB
00007F:BDEE
000080:E0E0
000081:BDED
000082:BDEC
000083:BDE5
000084:BDE4
000085:BDEB
000086:BDEA
000087:BDE9
000088:BDE8
000089:BFEB
00008A:BFE5
00008B:BFE9
00008C:B9ED
00008D:B9EA
00008E:E8E0
00008F:B9E8
000090:E0E0
000091:B9E1
000092:D02F
000093:E0E0
000094:E0F0
000095:BDFB
000096:BDEA
000097:BDF9
000098:BDE8
000099:9722
00009A:E0E0
00009B:83E8
00009C:83E9
00009D:83E8
00009E:83E9
00009F:81A8
0000A0:81B9
0000A1:9718
0000A2:F49C
0000A3:D015
0000A4:E2A6
0000A5:E0B0
0000A6:D02B
0000A7:0FEA
0000A8:1FFB
0000A9:93FA
0000AA:93EA
0000AB:DF93
0000AC:E0E2
0000AD:E0F0
0000AE:93FA
0000AF:93EA
0000B0:D015
0000B1:D007
0000B2:9631
0000B3:83E8
0000B4:83F9
0000B5:CFE9
0000B6:9622
0000B7:CFE1
0000B8:CFFF
0000B9:81E8
0000BA:81F9
0000BB:9508
0000BC:91A4
0000BD:30A1
0000BE:9508
0000BF:91E4
0000C0:E0F0
0000C1:9508
0000C2:E0E0
0000C3:BFE6
0000C4:BFEC
0000C5:9508
0000C6:91E9
0000C7:91F9
0000C8:9630
0000C9:F039
0000CA:ED80
0000CB:E097
0000CC:9701
0000CD:F7F1
0000CE:95A8
0000CF:9731
0000D0:F7C9
0000D1:9508
0000D2:0FEE
0000D3:1FFF
0000D4:0FEE
0000D5:1FFF
0000D6:9508
Первое значение это я как понимаю адрес. а после символа ":" это уже значение которое надо поместить в адрес.
Если я открываю этот файл в программаторе то и адрес открывается как данные! Я думаю что в ручную это никто не перелопачивает, вот как это скормить программатору хз :dont_know:
Да и куда это шить? По адресу после основной программы?

Он же но в программе:
Спойлерflash 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 }};
В общем помогите плз, без 0.5... то есть без вас не разобраться. Я видел у кого то на форуме есть такой же программатор.
Друг Кота
Аватара пользователя
Сообщения: 4752
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

Code memory - область программ (flash)
Data memory - область данных (ram)
config - похоже фьюзы.
Как то так похоже. Пробуй.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Дело видимо не в программаторе, а в том, что действительно массив cTable становится слишком большим. Попробуйте объявить его во флэше, туда всё равно ничего по ходу работы программы ничего не записывается.

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

flash char cTable[][4] = {
Docendo discimus
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4732
Зарегистрирован: Ср сен 18, 2013 10:08:26
Откуда: Санкт-Петербург

Сообщение Gisteresis »

vem566 писал(а):config - похоже фьюзы.
Да, конфиг фьюзов.

ИзображениеИзображение
vem566 писал(а):Data memory - область данных (ram)
То есть мне программу надо писать сюда? Попробовал загрузить, она сюда не лезет, программатор говорит, что выход за пределы адресного пространства (CodeVision при этом сказал, что все прекрасно)
Я всегда писал в Code memory. (Всегда - это 2 недели с момента приобретения)
Наверное это все таки EEPROM
pyzhman писал(а):Дело видимо не в программаторе, а в том, что действительно массив cTable становится слишком большим. Попробуйте объявить его во флэше, туда всё равно ничего по ходу работы программы ничего не записывается.
Да, я об этом и написал в вопросе. Извините если непонятно изъяснился.
Если не использовать слово flash то мне не дает откомпилировать CodeVision. Выдает ошибку, я так понял как раз переполнения RAM.
Ставлю ключевое слово, как вы написали:

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

flash char cTable[][4] = {
и функцию поправляю:

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

void SetState( flash char cState[] )
{
CodeVision все съедает без ошибок.

Дальше как раз вопрос как все это теперь зашить.
в hex файле похоже нет этого массива, только программа.
а в rom файле нечто похожее на этот массив. Но в каком то формате Atmel, указатели адресов там явно не нужны. Этот файл весит 2,72кб :shock:
Прогер загружает вместе с указателями адресов, он их как данные распознает. Я так понял он загружает тупо все что в файле.

Может в CodeVision есть какая то настройка позволяющая получить нормальный файл?
Или адресное пространство как то надо помечать?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Gisteresis писал(а): в hex файле похоже нет этого массива, только программа.
Она там есть.
Gisteresis писал(а):весит 2,72кб
В нём, кроме самих данных для заливки, есть еще всякого мусора.
Docendo discimus
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4732
Зарегистрирован: Ср сен 18, 2013 10:08:26
Откуда: Санкт-Петербург

Сообщение Gisteresis »

pyzhman писал(а):Она там есть.
Посмотрел asm, который образовался на выходе линковщика. Там действительно есть массив.
Но почему тогда ничего не работает :dont_know:

Собрал проект в протеусе. Та же хрень, что и на реальной плате. Одна нога постоянно выдает 255 (шим), другая иногда дрыгается, остальные 2 молчат.
Посмотрите пожалуйста проекты. Думаю по программе ясно, там из массива берутся значения для шима, а они управляют обмотками.

Юзаю внешний кварц 8МГц.

Массивы полного шага и половинного умещаются в RAM они работают нормально (двиг крутится в реале). Но если пометить как flesh то работать перестает (Двиг напряжно мычит и дергается. Ну собственно по осциллу в протеусе такая же картина).
Вложения
Драйвер ШД.zip
(62.34 КБ) 183 скачивания
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Посмотрел asm, который образовался на выходе линковщика. Там действительно есть массив.
Но почему тогда ничего не работает :dont_know:
В асме весь массив закоментирован, вот и не робит.
Друг Кота
Аватара пользователя
Сообщения: 4732
Зарегистрирован: Ср сен 18, 2013 10:08:26
Откуда: Санкт-Петербург

Сообщение Gisteresis »

zero648 писал(а):В асме весь массив закоментирован, вот и не робит.
Да нет, вот выдержка из этого файла

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

_cTable:
	.DB  0xFF,0x0,0x0,0x0,0xFA,0x32,0x0,0x0
	.DB  0xEC,0x62,0x0,0x0,0xD4,0x8E,0x0,0x0
	.DB  0xB4,0xB4,0x0,0x0,0x8E,0xD4,0x0,0x0
	.DB  0x62,0xEC,0x0,0x0,0x32,0xFA,0x0,0x0
	.DB  0x0,0xFF,0x0,0x0,0x0,0xFA,0x32,0x0
	.DB  0x0,0xEC,0x62,0x0,0x0,0xD4,0x8E,0x0
	.DB  0x0,0xB4,0xB4,0x0,0x0,0x8E,0xD4,0x0
	.DB  0x0,0x62,0xEC,0x0,0x0,0x32,0xFA,0x0
	.DB  0x0,0x0,0xFF,0x0,0x0,0x0,0xFA,0x32
	.DB  0x0,0x0,0xEC,0x62,0x0,0x0,0xD4,0x8E
	.DB  0x0,0x0,0xB4,0xB4,0x0,0x0,0x8E,0xD4
	.DB  0x0,0x0,0x62,0xEC,0x0,0x0,0x32,0xFA
	.DB  0x0,0x0,0x0,0xFF,0x32,0x0,0x0,0xFA
	.DB  0x62,0x0,0x0,0xEC,0x8E,0x0,0x0,0xD4
	.DB  0xB4,0x0,0x0,0xB4,0xD4,0x0,0x0,0x8E
	.DB  0xEC,0x0,0x0,0x62,0xFA,0x0,0x0,0x32

Вот. Беру самый простой массив, для полного шага:

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

unsigned char cTable[][4] = {
{0xff,0x00,0x00,0x00},
{0x00,0xff,0x00,0x00},
{0x00,0x00,0xff,0x00},
{0x00,0x00,0x00,0xff}};
функцию определяю так:

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

void SetState( unsigned char cState[] )
{
Все компилируется, все шьется прекрасно. Все работает в реале и Протеусе:

ИзображениеИзображение

Ежу понятно, что все работает отлично.

Помечаю этот массив как flash:

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

flash unsigned char cTable[][4] = {
{0xff,0x00,0x00,0x00},
{0x00,0xff,0x00,0x00},
{0x00,0x00,0xff,0x00},
{0x00,0x00,0x00,0xff}};
функцию определяю так:

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

void SetState( flash unsigned char cState[] )
{
Все компилируется, но не работает, вот такая вот айда на осцилле:

ИзображениеИзображение

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

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

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

Сообщение Gisteresis »

ИС-пытатель писал(а):А не пробовали переменную в самой функции вызова не определять как Flash? А уже внутри самой функции просто обращаться к переменной, которая определена во флеш?
Если я убираю отсюда слово флеш "void SetState( flash unsigned char cState[] )"
То компилятор ругается на место вызова этой функции. Долдычит что то про тип "unsigned char cState[]".

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

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

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

Сообщение Gisteresis »

Правильно ли я понимаю?
Сегменты памяти указывает компилятор командами CSEG, DSEG (асм если смотреть на выходе)...
Получается я шью и программу и данные в Code Memory (во флеш я так понял)?

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

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

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

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

Gisteresis писал(а):Правильно ли я понимаю?
Сегменты памяти указывает компилятор командами CSEG, DSEG (асм если смотреть на выходе)...
Получается я шью и программу и данные в Code Memory (во флеш я так понял)?

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

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

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

Сообщение Gisteresis »

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

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

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

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

http://microsin.net/programming/AVR/avr ... ogmem.html

Думаю, у Вас что-то типа этого, только для CV
Ответить

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