Страница 1 из 2

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

Добавлено: Вс мар 16, 2014 15:27:45
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:

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

Добавлено: Вс мар 16, 2014 16:25:55
vem566
Нужно читать букварь по программатору. Ram и flash прошиваются по разному.

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

Добавлено: Вс мар 16, 2014 17:07:07
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... то есть без вас не разобраться. Я видел у кого то на форуме есть такой же программатор.

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

Добавлено: Вс мар 16, 2014 17:49:00
vem566
Code memory - область программ (flash)
Data memory - область данных (ram)
config - похоже фьюзы.
Как то так похоже. Пробуй.

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

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

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

flash char cTable[][4] = {

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

Добавлено: Вс мар 16, 2014 18:29:36
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 есть какая то настройка позволяющая получить нормальный файл?
Или адресное пространство как то надо помечать?

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

Добавлено: Вс мар 16, 2014 18:59:17
pyzhman
Gisteresis писал(а): в hex файле похоже нет этого массива, только программа.
Она там есть.
Gisteresis писал(а):весит 2,72кб
В нём, кроме самих данных для заливки, есть еще всякого мусора.

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

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

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

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

Массивы полного шага и половинного умещаются в RAM они работают нормально (двиг крутится в реале). Но если пометить как flesh то работать перестает (Двиг напряжно мычит и дергается. Ну собственно по осциллу в протеусе такая же картина).

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

Добавлено: Вс мар 16, 2014 20:31:25
zero648
Посмотрел asm, который образовался на выходе линковщика. Там действительно есть массив.
Но почему тогда ничего не работает :dont_know:
В асме весь массив закоментирован, вот и не робит.

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

Добавлено: Вс мар 16, 2014 20:49:07
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:

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

Добавлено: Пн мар 17, 2014 07:52:06
ИС-пытатель
А не пробовали переменную в самой функции вызова не определять как Flash? А уже внутри самой функции просто обращаться к переменной, которая определена во флеш?

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

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

Хорошая идея! Во входных переменных просто номер попробую принимать, а сам массив буду в теле функции использовать. Приду домой попробую.

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

Добавлено: Пн мар 17, 2014 10:43:27
ИС-пытатель
А, понял.. Не совпадение типов.. Но тут у вас проблема 100% не в программаторе. Надо с компилятором разбираться.

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

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

Память из Flash копируется в SRAM по запуску программы?

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

Добавлено: Пн мар 17, 2014 11:33:40
ИС-пытатель
Пробовал сейчас в протеусе. Для сокращенного массива из 4х4 элементов все работает. что так, что так. Для массива из 4х8 начинает выделываться.

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

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

Память из Flash копируется в SRAM по запуску программы?
В SRAM копируется только то, что Вы скажете (по идее должен копироваться Ваш массив по одному элементу по мере надобности). А выборка команд берется при помощи счетчика команд. (по одной опять-таки)

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

Добавлено: Пн мар 17, 2014 11:41:55
ИС-пытатель
Можно попробовать еще хранить массив в EEPROM и подгружать оттуда

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

Добавлено: Пн мар 17, 2014 11:52:07
Gisteresis
ИС-пытатель писал(а):Для сокращенного массива из 4х4 элементов все работает. что так, что так.
Работает :shock: (у меня нет, выше выкладывал результат)
Так, а какая у вас версия CV?
У меня 2.05 кажись. Какая то вторая в общем, точно смогу сказать вечером.
Протеус 7.10

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

Добавлено: Пн мар 17, 2014 12:09:12
ИС-пытатель
А еще при беглом осмотре ассемблерного файла не нашел там ни одной команды LPM. Хотя массив точно размещен во флеш (модификатор .CSEG стоит перед массивом) Не совсем понятно, каким образом берутся оттуда данные. И вообще, берутся ли они оттуда. Думаю, проблема в компиляторе.

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

Добавлено: Пн мар 17, 2014 12:09:56
ИС-пытатель
http://microsin.net/programming/AVR/avr ... ogmem.html

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