Отговори на тема  [ 14 мнения ] 
CCS и двубаитови числа 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Сеп 17, 2005 11:12 pm
Мнения: 95
Местоположение: Shumen
Мнение CCS и двубаитови числа
Халоа на всички, аз пак ще ви досаждамм, ама ко да се праи, то по друг начин маи няя да стане....

Имам следния проблем, искам да си сложа брояч на компа, които да ми брои ключванията на машината, до тука добре, всичко бачка, брои, отчита, кот съм му казал туи праи (брояча), ама проблема ми е в това че нямам идея (по-точно казано не знам как да стане) как да съхраня числата по-големи от 255 или FF в епрома и после да ги прочета като едно зяло число > 255, демек трябва да използвам 2 баита, а не съм се научил как се прави (записа в еепрома нее проблем). Мене ми е ясно че го пише в хелпа на CCS, ама някак си ми е по лесно като ми го обясни някои хюман, ония не се научиха да пишат хелпове...поне на мене ми е трудно с тях. Благодаря предварително.


Вто Дек 06, 2005 2:02 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Ами в IAR e

__noinit __eeprom int Broqch ///Deklarirash Promenliwata w eeproma globalno

Broqch++; /// i si rabotish kato s normalna promenliwa.

предполагам че и там е нещо подобно . Компилатора трябва да си знае работата.


Вто Дек 06, 2005 2:08 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 03, 2005 11:31 am
Мнения: 766
Местоположение: Пловдив
Мнение 
How do I write variables to EEPROM that are not a byte?


The following is an example of how to read and write a floating point number from/to EEPROM. The same concept may be used for structures, arrays or any other type.



n is an offset into the eeprom.

For floats you must increment it by 4.

For example, if the first float is at 0 the second one should be at 4 and the third at 8.



WRITE_FLOAT_EXT_EEPROM(long int n, float data) {

int i;

for (i = 0; i < 4; i++)

write_ext_eeprom(i + n, *(&data + i) ) ;

}



float READ_FLOAT_EXT_EEPROM(long int n) {

int i;

float data;

for (i = 0; i < 4; i++)

*(&data + i) = read_ext_eeprom(i + n);

return(data);

}

REM "write_ext_eeprom" -> го заменяш със -> "write_eeprom"

^
|_ това ми е останало от BASIC-а :))



P.S
подобно е и за останалите типове има го в хелпа и по подробно не мога дори и аз да го обясня :), не че не може да се направи и по елегантно но то е за конкретен случай.


Последна промяна TheHungry на Вто Дек 06, 2005 2:34 pm, променена общо 1 път



Вто Дек 06, 2005 2:30 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
При всички положения компилатора работи с числа по-широки от 1 байт. Примерно long, който си е 4 байта. Записваш го и го четеш като най-обикновен масив.


Вто Дек 06, 2005 2:30 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 03, 2005 11:31 am
Мнения: 766
Местоположение: Пловдив
Мнение 
CCS мисля че не поддържаше стандартно писане на числа по големи от BYTE в EEPROM-а , но не съм сигурен тъй като не го ползвам.


Вто Дек 06, 2005 2:41 pm
Профил ICQ
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Пет Фев 04, 2005 3:18 pm
Мнения: 309
Местоположение: Sofia
Мнение Чисто и просто като милиционер след баня
int16 counter;

void write_counter(int 16 value)
{
write_eeprom(0,value>>8); //адреса си го определяш ти естествено може и да е променлива
write_eeprom(1,value);
}

int16 read_counter(void)
{
return make16(read_eeprom(0),read_eeprom(1));
}

Аналогично и за по големи променливи
има и int32 и make32(byte,byte,byte,byte)

Илиминтарно Ватсон :)


Вто Дек 06, 2005 8:13 pm
Профил ICQ
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Пет Фев 04, 2005 3:18 pm
Мнения: 309
Местоположение: Sofia
Мнение 
write_eeprom(0,value>> тука има осмица ама съвпадна с някво емотиконче
тоест стойноста на value отместена с 8 бита на дясно


Вто Дек 06, 2005 8:16 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 03, 2005 11:31 am
Мнения: 766
Местоположение: Пловдив
Мнение 
При мен е още по елементарно но не ползвам CCS :

eeprom unsigned long Counter ;


void main ( void )

{
Counter++;
}


Сря Дек 07, 2005 12:05 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Сеп 17, 2005 11:12 pm
Мнения: 95
Местоположение: Shumen
Мнение 
Стана, не то4но както го е писал Dimiter, с малко разлика....както и да е... Постнал съм кода които сготвих, обаче има един проблем. Това нещо ми праща стоиността на брояча през RS, про включване изпраща "ON:000" както си му е редно, ама това нещо стига до "999" и после пак "000", не че ме вълнува толкова, но все пак, ЗАЩО?

Код:
void main()
{
set_tris_A(0b00000001);
//setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
count=make16(read_eeprom(0),read_eeprom(1));
while(1)

   if ( input(PIN_B0) )
   {
delay_us(50);
if ( input(PIN_B0) ){
count++;

write_eeprom(0,count>>8);;
write_eeprom(1,count);

output_high(PIN_B4);
delay_us(250);
output_low(PIN_B4);
printf("\r ON: %03Lu",count);
}
   }
}


count e int16, времената са нарочно в us, за тестване....


Сря Дек 07, 2005 1:14 pm
Профил ICQ
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Пет Фев 04, 2005 3:18 pm
Мнения: 309
Местоположение: Sofia
Мнение 
printf("ON:");
putc(0x30+(count-abs(count/10000)*10000)/1000);
putc(0x30+(count-abs(count/1000)*1000)/100);
putc(0x30+(count-abs(count/100)*100)/10);
putc(0x30+(count-abs(count/10)*10));

putc(0x0a);putc(0x0d);


Сря Дек 07, 2005 4:07 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Сеп 17, 2005 11:12 pm
Мнения: 95
Местоположение: Shumen
Мнение 
8O 8O 8O 8O 8O 8O 8O :cry: :cry: :cry: ем не, стига ми до 999 :roll:

Много благодаря на всчки за помощта, оказа се 4е имало повече от една пътека към Рим, но с идеята на Димитер, се видя че може и по-простичко да стане.... само дето с последният си пост, тои изби рибата. Ако може да ми обясните като на начинаещ, защо са нужни в тоя случаи такива акробатики? Нали инт16 е двубаитово число и може да съдържа число до 65535?


Сря Дек 07, 2005 10:46 pm
Профил ICQ
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Пет Фев 04, 2005 3:18 pm
Мнения: 309
Местоположение: Sofia
Мнение 
Това горе дето трепа риба е пример да разцепиш 4 цифрено
число на хилядарки,стотици,десетици ,единици и ги конвертираш
до ASCII символи защото числото 12345 не е равно на стринга "12345"
Понимаеш?


Чет Дек 08, 2005 1:04 pm
Профил ICQ
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Пет Фев 04, 2005 3:18 pm
Мнения: 309
Местоположение: Sofia
Мнение 
putc(0x30+(count-abs(count/10000)*10000)/1000); <- хилядарки
putc(0x30+(count-abs(count/1000)*1000)/100); <-стотици
putc(0x30+(count-abs(count/100)*100)/10); <- десетици
putc(0x30+(count-abs(count/10)*10)); <- единици

putc(0x0a);putc(0x0d); <-нов ред и ентер

'1' ASCII code 0x30+1

Малко ме мързи да пиша ако ти е зор ще ти пратя едно копи-пасте
от една моя процедура за принтване на десетични числа до 7 знака ако се не лъжа,
ама тя аналогията е ясна и за по-големи такива.


Чет Дек 08, 2005 1:11 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Сеп 17, 2005 11:12 pm
Мнения: 95
Местоположение: Shumen
Мнение 
ааааа, аха, сеа вече разбрах.

то инак приличаше на предстартовото броене на инжектоплякторносветлинен трансгалактичен кораб. :lol:

ам, зада не отварям нова тема, ще метна тука още едно нещо....трябва ми начална скорост на мисалта за това, как да проследя (PIC, CCS) светодиода на компютъра, в момента дали е лог1, лог0 или мига? нещо се омотах из прекъсванията, мисля си че с прекъсвания трябва да стане или? идеи?


Пет Дек 09, 2005 12:25 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 14 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: Google [Bot] и 2 госта


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

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