Отговори на тема  [ 15 мнения ] 
Lookup Table Pic12f683 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Ное 08, 2011 10:07 pm
Мнения: 4
Мнение Lookup Table Pic12f683
Здравейте ! Как да направя лукъп тейбъл със гореспоменатия пик който да има 256 стойности. Прерових интернета и ме заболя главата от четене и пак не разбрах Когато се опитвам да го направя когато поискам да взема стойността с по голям индекс и процесора забива .


Пет Юли 27, 2012 4:36 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение Re: Lookup Table Pic12f683
Ползвай 2 таблици по 128.


Пет Юли 27, 2012 5:12 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Чет Окт 06, 2005 2:06 pm
Мнения: 194
Местоположение: Sofia
Мнение Re: Lookup Table Pic12f683
На какъв език пишеш, асемблер или С. Ако е на С, кой е точно компилатора, все пак това има значение.


Пет Юли 27, 2012 5:23 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Май 01, 2009 4:01 pm
Мнения: 1438
Мнение Re: Lookup Table Pic12f683
Задаваш ли стойност на PCLATH преди да се ровиш в таблицата?


Пет Юли 27, 2012 6:38 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пон Апр 16, 2012 9:05 pm
Мнения: 182
Мнение Re: Lookup Table Pic12f683
Пробвай сленото:

...
...
movfw Position
call t8
movwf Number
...
...

...
ORG 0X6FE
t8: BSF PCLATH, 1
addwf PCL, f
retlw d'0' ;0
retlw d'2' ;1
...
...
...
retlw d'255' ;253
retlw d'255' ;254
retlw d'255' ;255
;---------------------------------------------------
end
Идеята е да му дадеш начало на таблицата в поредната (последната) цяла секция х00..хFF, Мисля че от там идва омазването.


Пон Юли 30, 2012 9:05 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Май 01, 2009 4:01 pm
Мнения: 1438
Мнение Re: Lookup Table Pic12f683
Пушека написа:
Пробвай сленото...

Тц... така няма да стане. В твоя случай, когато брояча е на 0x6FF, какво ще стане ако му добавиш 0хE0 например? Ще отиде на 0х2DF, а там кой знае какво има... и отиде коня в реката! Това, което искаш да направиш, се прави с:

Код:
MOVLW  HIGH(t8)
MOVWF  PCLATH
MOVFW  Position
CALL   t8
...

Но с големи таблици и това ще се омаже, когато за PCL започне да се получава резултат 9 бита. За да не става мазало трябва да се сметне целия адрес от таблицата(всичките 13 бита).

Код:
MOVLW     LOW(t8)
ADDWF     Position, F
MOVLW     HIGH(t8)
BTFSC     STATUS, C
ADDLW     1
MOVWF     PCLATH
MOVFW     Position
CALL      t8


Пон Юли 30, 2012 3:23 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пон Апр 16, 2012 9:05 pm
Мнения: 182
Мнение Re: Lookup Table Pic12f683
CarBeta написа:
Тц... така няма да стане.

Тц... при мен работи :). 6FF + E0 = 7DF Адресното пространство му е до 7FF до колкото видях ПДФа. Понеже го позиционирам точно в 00 на 7ия сегмент не се интересувам от старшата част на брояча. А идеше реч за точно 256 битова таблица и няма смисъл да си трови живота с манипулаци на PC. За по-големи таблици си прав.


Пон Юли 30, 2012 3:46 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Май 01, 2009 4:01 pm
Мнения: 1438
Мнение Re: Lookup Table Pic12f683
Въпросът не опира до адресното пространство, а до РСН, дето уж го пренебрегваш. 6FF + E0 = 7DF - това с калкулатора е така, но на практика няма как да накараш процесора да прескочи от 0х6FF -> 0х700 без да вкараш нужните битове по регистрите. PCLATH е само нули при стартиране. Променяйки PCL, без да закачаш PCLATH, гаранция отиваш в реката, освен ако таблицата не ти е някъде в началните адреси. Ако пратиш програмата на тоя адрес РС ще прескочи адресите нататък и ще си изпълни програмата, но ти му променяш РСL, а с това в PCH се записва каквото има записано в PCLATH. Т.е. променяш целия брояч, не само тая част дето ти се иска.

Като сетваш втория бит на PCLATH му задаваш стойност 2, т.е. ще отидеш на адрес 0х2DF вместо на 0х7DF, където ти се иска всъщност и ще се чудиш защо програмата забива. То затова е и темата. Щото процесора прави каквото му кажеш, а не каквото ти си мислиш, че си му казал!

Та с това сетване на втория бит няма как да работи при теб а и не само при теб. Ако сложиш таблицата на адрес 0x6FF и преди CALL t8 запишеш 0х7 в PCLATH ще заработи по тоя начин.


Пон Юли 30, 2012 8:22 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пон Апр 16, 2012 9:05 pm
Мнения: 182
Мнение Re: Lookup Table Pic12f683
Преди време исках да си направя прост и евтин генератор на синусоида за проби на един мост и се сблъсках със същия проблем. Извиквам с "call t8", отивам на въпросния етикет, а там добавяйки отместване в младшия байт скачам на желания ред. Става, но до момента в, който добавката не промени старшата част(т.е. се получи пренос към старшите битове). Е вариантите бяха 2. Да смятам всеки път целия адрес или по-простия да не допускам пренос. За табличка с 256 числа номера става без пренос, ако първия елемент е в позиция 00 на произволна страница. Сега като се загледах не видях логична причина за реда:
BSF PCLATH, 1
нямам спомен защо съм го писал, играейки го на симулатора не се променя така или иначе.
Ей го кода, пробвай и ще видиш че става и на скопа излиза красива синусоида.


Прикачени файлове:
test_gen252.asm [13.38 KiB]
263 пъти
Пон Юли 30, 2012 8:57 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Май 01, 2009 4:01 pm
Мнения: 1438
Мнение Re: Lookup Table Pic12f683
Е естествено, че ще работи така :D - таблицата ти е на ORG 0X1FE, което обяснява нещата и е логична причина за BSF PCLATH, 1!


Пон Юли 30, 2012 9:22 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пон Апр 16, 2012 9:05 pm
Мнения: 182
Мнение Re: Lookup Table Pic12f683
Да бе написах 6FE за да му пасне за последната страница, без да съобразя да сменя и другото. :D
Ама нали човекът трябва да напрегне малко главата все пак.


Пон Юли 30, 2012 9:37 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Юни 25, 2009 1:01 pm
Мнения: 2251
Мнение Re: Lookup Table Pic12f683
Ето какво направих на бързо с CCS complier.
Код:
#include <12F683.h>
#define arrayMax 256

const int array[arrayMax]={ 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,  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,  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,  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,  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,  0,
                    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
};
void main()
{
   int16 i,n;
   for(i=0;i<=arrayMax;i++)
   {
      n=array[i];   
   }   
}



Memory usage: ROM=14% RAM=5% - 5%

Остава уговорката, че масивът е константа!
Поздрави!

_________________
www.elkran.com


Вто Юли 31, 2012 11:09 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Ное 08, 2011 10:07 pm
Мнения: 4
Мнение Re: Lookup Table Pic12f683
Благодаря ви за отговорите . С асемблер работя. Начинът който CarBeta описва ми изглежда работещ . Мерси все пак но аз се справих с проблема като използвах EEPROM - a .Заредих го с таблицата и прочитах стойността от там . Това което исках да направя и в крайна сметка го направих и работи е електронно запалване на мотор. Запалването взема сигнал от датчика на коляновия вал който е 36 градуса преди ГМТ, измерва с Тimer0 периода на въртенето или времето от един пулс на датчика до следващия и стойността на таймера я зарежда направо като индекс на таблицата . Тя връща съответната стойност и я подава като аргумент на функция Delay която забавя искрата.Доста проблеми срещнах за това просто на пръв поглед нещо Една седмица по цял ден се занимавах с него дори последните няколко дена реших да направя машинка с която да тествам дали всичко работи защото ако го пробвам направо на мотора и може да ми счупи крака ако предварението при палене е твърде голямо.


Вто Юли 31, 2012 11:17 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Юни 25, 2009 1:01 pm
Мнения: 2251
Мнение Re: Lookup Table Pic12f683
Ами не знам на каква честота работиш, но сигурен ли си, че успява да се справи контролера ти за 1 импулс време. EEPROM паметта е по-бавна от RAM и ROM.

_________________
www.elkran.com


Вто Юли 31, 2012 2:03 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: Lookup Table Pic12f683
При писане, stoyanoff :) Има някой друг PDF в който си е написано... При четене скоростта е същата като при четене от рама. Само дето иска две-три допълнителни инструкции.


Вто Юли 31, 2012 2:21 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 15 мнения ] 

Кой е на линия

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


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

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