# ATMEL mikrokontrolleri >  Problēma ar lieliem masīviem!

## Vinchi

Vai kāds nezina kāpēc ATmega16 sāk gļukot lasot lielu konstantu masīvu. Frekvence procim ir maksimālā 16mhz.

Kad masīvs ir līdz 64baitiem tikmēr viss strādā labi bet kad tas sāk pārsniegt 64 baitus sākās gļuki.

Varbūt ir kāda alternatīva šāda gara masīva pierakstā?



```
const char masivs[] = { 
0b11110000,
0b00111000,
0b00001110,
0b00000111,
0b00001111,
0b11111110,
0b11111110,
0b11101111,
0b11000000,
0b10000001,
0b00000011,
0b00000011,
0b11111011,
0b11111111,
0b11111111,
0b11111111,
0b10000001,
0b10000001,
0b10000011,
0b10000001};
```

 Kompilēju iekš AVR-studio, avr-gcc.

Kopējais masīva garums ir līdz pat 600 baitiem, atmega16 programmas atmiņā vietas pietiek bet nolasīt no programas atmiņas laikam nepaspēj?

----------


## M_J

Domāju, ka vaina nav procesorā. Nekad nav bijušas problēmas procesora vainas dēļ strādājot arī ar krietni lielākiem masīviem. Paša stulbība gan ir gadījusies. Konkrēti - ar adresāciju. Ir gadījies piemirst palielināt vecāko baitu, kad jaunākais pārpildās. Tas - programmējot ASMā. Pieņemu, ka izmantojot C, par to rūpējas kompilators. Interesanti, kādu kodu viņš izģenerē?

----------


## Vinchi

Kompilēju no C.

Man jau šķiet ka ATmega16 nepietiek varbūt rama kad ir lielāki masīvi lai to laicīgi nolasītu. Kāds vispār ir ATmegas programmas flash atmiņas ātrums?

----------


## M_J

No programmas atmiņas nolasa komanda LPM, kura aizņem 3 procesora taktis. Pieskaitam vēl 2 taktis, kas vajadzīgas, lai nolasīto ierakstītu RAMā un vēl 3  taktis cikla organizēšanai, tātad sanāk 8 taktis uz vienu nolasāmo baitu + vēl kaut kadas taktis, kopīgas visam nolasāmajam masīvam.  Ar ierakstīšanu ir sarežģītāk, tur ir vesela ceremonija, kas jāievēro. Ierakstīšana notiek pa lappusēm, ATMEGA16 lappuses izmērs ir 128 baiti, vispirms procesors tos baitus salādē buferī un tad ieraksta flešā visu lappusi. Šim procesam laiks nav stingri definēts un lappusei tas var būt līdz 4.5 ms. Tas ir aprakstīts datasheet sadaļā "Boot Loader Support".

----------


## Vinchi

Varbūt problēmas rada 

#include <util/delay.h>
_delay_ms(1);

Varbūt ir jātaisa ar kādu pārtraukuma taimeri?

----------


## Velko

```
const char masivs[] = {
```

 Šāds masīvs netiek glabāts flashā, bet gan programmai startējoties tiek ielādēts RAMā. Var gadīties, ka steks "brauc virsū".

Iesaku:


```
#include <avr/pgmspace.h>

const char masivs[] PROGMEM = {
```

 un elementa vērtības vilkt ārā ar:


```
pgm_read_byte(masivs[i])
```

----------


## Vinchi

Tomēr tā īsti nenokompilējās kaut kas:

Build succeeded with 1 Warnings...
../projekts.c:21: warning: '__progmem__' attribute ignored

Man WinAVR versija laikam pārāk svaiga lasīju ka PROGMEM strādā līdz 3.0 versijai pēc tam tur ir drusku izmaiņas.

Velko paldies par info tagad vismaz zinu kādā virzienā meklēt  ::

----------

