ATmega328 a PROGMEM

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Středa Březen 24 20:59:51 CET 2021


Kdyz se nepouzije PROGMEM, tak to asi zkopiruje data do RAM a funguje 
to. U teto architektury je proste do FLASH pristup jinak, jiny adresovy 
prostor. Prekladac by ale na to asi upozornit mel, zrejme nedokonalost.

Dne 24.03.2021 v 20:35 Šerých Jakub napsal(a):
> Asi jsem se blbě vyjádřil. Myslel jsem to přesně v tom smyslu, jak psal původní tazatel. Když jsem si nějaké konstanty uložil do PROGMEM, program je vyhodnocoval nesprávně, aniž bych někde dostal alespoň nějaký Warning, že něco je podezřelého. Po odstranění direktivy PROGMEM mi to začalo fungovat dobře. Nepochybně to bylo nějakou mojí chybou kdesi v programu, ale to že to kompilátor v pohodě sežere, výsledný program "funguje" ale dělá něco úplně jiného, než by měl, protože asi sahá pro data někam jinam než bylo zamýšleno, je velmi nepříjemné a hrozně blbě se pak hledá problém.
>
> Jakub Šerých
>
> -----Original Message-----
> From: Hw-list <hw-list-bounces na list.hw.cz> On Behalf Of Jindrich Fucik
> Sent: Wednesday, March 24, 2021 8:10 PM
> To: hw-list na list.hw.cz
> Subject: Re: ATmega328 a PROGMEM
>
> Co si mám představit pod pojmem "není moc spolehlivé"?
> Já mám takovou zkušenost, že mi pokaždé funguje stejně. Pokaždé je potřeba si dávat pozor, na co překladač v danou chvíli myslí. Tedy pokud čeká práci s RAM, je potřeba používat variantu příkazu, která navede překladač do progmem. například memcpy vs. memcpy_P
>
> Dne 24.3.2021 v 20:02 Šerých Jakub napsal(a):
>> PROGMEM není moc spolehlivé a většinou se musí obsah před použitím zkopírovat do RAMky pomocí něčeho jako:
>> memcpy_P(BuffRam, &ConstProgmem, NumberOfBytes);
>>
>> Jakub Šerých
>>
>> -----Original Message-----
>> From: Hw-list <hw-list-bounces na list.hw.cz> On Behalf Of Petr Zapadlo
>> Sent: Wednesday, March 24, 2021 7:42 PM
>> To: HW-news <hw-list na list.hw.cz>
>> Subject: ATmega328 a PROGMEM
>>
>> Zdravím,
>>
>> hraji si tady generátorem sinu v atmega328 a narazil jsem na to, že  že mi nefunguje direktiva PROGMEM.
>>
>> Definuji si pole s předpočítanými hodnotami sinu:
>>
>> const  PROGMEM uint8_t sin_table[]  ={0,8,16,24,32..... };
>>
>> a následně ho v přerušení používám:
>>
>>      OCR1A=sin_table[count];
>>
>> Pokud je definice pole s direktivou progmem, tak je něco špatně - průběh má několik zubů - rozhodně se to ani neblíží sinu - připadá mi, jako by to četl odněkud nesmyslně. Jestliže progmem odstraním, tak to funguje přesně jak má a vykresluje sinus, tj kod bude OK. Podle příkladů co jsem na netu nalezl se to používá právě takto. V info při kompilaci vidím, jak se alokace přesouvá mezi flash a ram podle toho jestli progmem je nebo není, ale to čtení z flash nějak nefunguje.
>>
>> Co činím špatně?
>>
>> Petr
>>
>> _______________________________________________
>> HW-list mailing list  -  sponsored by www.HW.cz Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>> _______________________________________________
>> HW-list mailing list  -  sponsored by www.HW.cz Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz Hw-list na list.hw.cz http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list




Další informace o konferenci Hw-list