Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

atmega четене на програмната памет в прекъсване
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=18013
Страница 1 от 1

Автор:  Реконструктор [ Пет Сеп 17, 2021 5:27 pm ]
Заглавие:  atmega четене на програмната памет в прекъсване

Нещо изпускам а гугълването не дава резултат. Записал съм един масив в програминия флаш (от него има много, от останалото - не). Излгежда е така:
Код:
#include "power_map.h"
#include <avr/pgmspace.h>

// store map in flash memory
volatile const u08 power_map[] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 61, 61, 62, 62, 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 87, 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 95, 95, 96, 96, 97, 97, 98, 98, 99, 99, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100};

u08 getPowerVal(u08 index)
{
   return power_map[index];
}


Когато викна getPowerVal() от прекъсване, в случая примерно
ISR(ADC_vect) { cli(); u08 val = getPowerVal(128); sei(); }
винаги връща 0 поради няква причина. Същото нещо, викнато в main() си работи както се очаква. Някой има ли идея кво се случва?

Автор:  ike [ Пет Сеп 17, 2021 6:07 pm ]
Заглавие:  Re: atmega четене на програмната памет в прекъсване

cli(); - защо забраняваш прекъсванията в прекъсване?
u08 val - val глобална променлива от тип volatile u08 ли е?
getPowerVal(128) - какво се получава ако присвоиш val = power_map [128] в прекъсването?

Автор:  slav4o.com [ Пет Сеп 17, 2021 7:59 pm ]
Заглавие:  Re: atmega четене на програмната памет в прекъсване

Така написано няма смисъл от тази функция. Но оредполагам имаш и други сметки които не си показал...
Иначе какво се получава ако пробваш функцията да връща хардкодната константа ?

Автор:  Реконструктор [ Пет Сеп 17, 2021 8:27 pm ]
Заглавие:  Re: atmega четене на програмната памет в прекъсване

slav4o.com написа:
Така написано няма смисъл от тази функция. Но оредполагам имаш и други сметки които не си показал...
Иначе какво се получава ако пробваш функцията да връща хардкодната константа ?


Оригинала е
Код:
      //sendDiag(getPowerVal(data));
   PWM_SetDutyCycle(getPowerVal(data));


като data е резултата от конвертирането. sendDiag просто праща байт по уарт-а да си го гледам. sendDiag(data) си е ок, на терминала си виждам стойността. sendDiag(getPowerVal(data)) виждам 0. PWM_SetDutyCycle(getPowerVal(data)) пина е на нула. PWM_SetDutyCycle(50) си работи както трябва. Това функцията да връща нещо хардкоднато не съм го пробвал, после ще сляза до гаража да го пробвам. :)

Автор:  Реконструктор [ Пет Сеп 17, 2021 8:28 pm ]
Заглавие:  Re: atmega четене на програмната памет в прекъсване

ike написа:
cli(); - защо забраняваш прекъсванията в прекъсване?
u08 val - val глобална променлива от тип volatile u08 ли е?
getPowerVal(128) - какво се получава ако присвоиш val = power_map [128] в прекъсването?


ще го пробвам и това, без да минава през функцията

Автор:  slav4o.com [ Пет Сеп 17, 2021 9:44 pm ]
Заглавие:  Re: atmega четене на програмната памет в прекъсване

Не трябва ли да е data = getPowerVal(index)
или просто така си го кръстил ?
Така ако подаваш data като индекс ако е до 48 имаш само нули.

Автор:  Реконструктор [ Нед Сеп 19, 2021 11:23 pm ]
Заглавие:  Re: atmega четене на програмната памет в прекъсване

Ако е в RAM-а (т.е. махнеш PROGMEM) няма проблем, работи си. :) Има някъв тънък момент, който идва от самата архитектура.

Автор:  slav4o.com [ Пон Сеп 20, 2021 1:01 am ]
Заглавие:  Re: atmega четене на програмната памет в прекъсване

Ами данните може би от програмната памет се прехвърлят в RAM като се използва прекъсване, което си забранил и после се обработват по стандартният начин.

Автор:  s.ivanov [ Пон Сеп 20, 2021 1:20 am ]
Заглавие:  Re: atmega четене на програмната памет в прекъсване

Четенето от програмната памет е чрез макрос:

Steps to define and read data from Flash memory of Atmel AVR devices:
Код:
#include <avr/pgmspace.h>
.
.
.
unsigned char DataArray[2][5] PROGMEM =
{
{0x00,0x01,0x02,0x03,0x04},
{0x05,0x06,0x07,0x08,0x09}
};
.
.
.
ReadData = pgm_read_byte(&(DataArray[i][j]));

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/