Отговори на тема  [ 9 мнения ] 
atmega четене на програмната памет в прекъсване 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 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() си работи както се очаква. Някой има ли идея кво се случва?


Пет Сеп 17, 2021 5:27 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение Re: atmega четене на програмната памет в прекъсване
cli(); - защо забраняваш прекъсванията в прекъсване?
u08 val - val глобална променлива от тип volatile u08 ли е?
getPowerVal(128) - какво се получава ако присвоиш val = power_map [128] в прекъсването?

_________________
Warriors of the Night, ASSEMBLER!!!


Пет Сеп 17, 2021 6:07 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 8:04 pm
Мнения: 2663
Местоположение: София / Велико Търново
Мнение Re: atmega четене на програмната памет в прекъсване
Така написано няма смисъл от тази функция. Но оредполагам имаш и други сметки които не си показал...
Иначе какво се получава ако пробваш функцията да връща хардкодната константа ?

_________________
https://github.com/slav4ocom/


Пет Сеп 17, 2021 7:59 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 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:27 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение Re: atmega четене на програмната памет в прекъсване
ike написа:
cli(); - защо забраняваш прекъсванията в прекъсване?
u08 val - val глобална променлива от тип volatile u08 ли е?
getPowerVal(128) - какво се получава ако присвоиш val = power_map [128] в прекъсването?


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


Пет Сеп 17, 2021 8:28 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 8:04 pm
Мнения: 2663
Местоположение: София / Велико Търново
Мнение Re: atmega четене на програмната памет в прекъсване
Не трябва ли да е data = getPowerVal(index)
или просто така си го кръстил ?
Така ако подаваш data като индекс ако е до 48 имаш само нули.

_________________
https://github.com/slav4ocom/


Пет Сеп 17, 2021 9:44 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение Re: atmega четене на програмната памет в прекъсване
Ако е в RAM-а (т.е. махнеш PROGMEM) няма проблем, работи си. :) Има някъв тънък момент, който идва от самата архитектура.


Нед Сеп 19, 2021 11:23 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 8:04 pm
Мнения: 2663
Местоположение: София / Велико Търново
Мнение Re: atmega четене на програмната памет в прекъсване
Ами данните може би от програмната памет се прехвърлят в RAM като се използва прекъсване, което си забранил и после се обработват по стандартният начин.

_________________
https://github.com/slav4ocom/


Пон Сеп 20, 2021 1:01 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Съб Юни 03, 2017 1:21 pm
Мнения: 163
Мнение 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]));


Пон Сеп 20, 2021 1:20 am
Профил WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 9 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни