| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Операции с портове при HiTech PICC http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=4005 |
Страница 1 от 1 |
| Автор: | Ки4о [ Съб Апр 07, 2007 10:37 am ] |
| Заглавие: | Операции с портове при HiTech PICC |
Проблема ми е следния-как се прави обръщение директно към порта като искм да вдигна/сваля даден пин? За момента използвам това: #define PORTBIT(adr, bit) ((unsigned)(&adr)*8+(bit)) static bit LED1 @ PORTBIT(PORTE, 0); static bit LED2 @ PORTBIT(PORTE, 1); . . . LED1=1; //установявам PORTE0=1 LED2=0; //PORTE1 =0 . . . Има ли някаква възможност да се работти директно с порта но не на асемблер?Не мога да разбера и как се ползва следната декларация: #define bitset(var,bitno) ((var) |= 1 < < (bitno)) #define bitclr(var,bitno) ((var) &= ~(1 < < (bitno))) Използването на следното: unsigned int P; P != 0x040; това ми е ясно как работи .Някой може ли да разясни как работи онова с червения цвят,и как се ползва? |
|
| Автор: | evc [ Съб Апр 07, 2007 1:34 pm ] |
| Заглавие: | |
"Това червеното" си е най-обикновен макрос. #define bitset(var,bitno) ((var) |= 1 < < (bitno)): mid=1<<bitno //Премества "1" наляво. Ако bitno e 8 - mid = 0b0000000100000000 var=var|mid Това нещо премества "< <" наляво bitno пъти числото 1. Т.е. слага ти единица на позицията, на която се намира бита, който искаш да променяш. След това логическото ИЛИ "|=" установява тази позиция от променливата ти var в единица. Аналог на асемблерската инструкция зе сетване на бит. #define bitclr(var,bitno) ((var) &= ~(1 < < (bitno))) : mid=1<<bitno //Премества "1" наляво. Ако bitno e 8 - mid = 0b0000000100000000 mid=~mid //Инвертира битовете на mid - mid = 0b1111111011111111 var=var&mid Това прави същото - премества "< <" наляво bitno пъти единицата - инвертира я" ~" (всички останали битове освен позицията, която те интересува стават единици) и извършва побитово И със стойността на var, като по този начин става еквивалент на асемблерската инструкция за clr на бит. Това определено е ANSI начина да се работи с битове, но първо мразя макроси, и второ вече си има в HITECH C следната възможност: #define my_pin PORTB7 и от там нататък просто се записва my_pin=1; //=bsf PORTB,7 my_pin=0; //=bcf PORTB,7 това е пък подобно на първия макрос, който си постнал. Получава се наистина малко отстъпление от стандарта, но мисля че за ембед програмиране не е толкова фатално. Във всеки проект си правя в хедъра задължителна дефиниция на всички битове: const unsigned int bit_pointer[16] ={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768} и после където ми трябва : my_var|=bit_pointer[nomer_bit] - за сетване my_var&=~bit_pointer[nomer_bit] - за клиър Най-бързо като изпълнение, губят се 32 клетки за таблицата. |
|
| Автор: | ToHu [ Съб Апр 07, 2007 8:59 pm ] |
| Заглавие: | |
Не съм много съгласен че това е ANSI начина, това е начна когато процесора няма команда за това. Микрочип си имат команда, затова е много по лесно (бързо и алко код) да оперираш директно с бита. Предполагам ако си дефинираш битова променлива е можеш да оперираш директно с нея =1, =0. Преносимоста на кода не мисля че трябва да вреди на изпълнението и ефикасноста на написаният код, все пак говорим за контролери с ограничени ресурси, много от които имат операции за побитово управление. |
|
| Автор: | Ки4о [ Съб Апр 07, 2007 9:29 pm ] |
| Заглавие: | |
ТоНи,ако обичаш разясни малко и дай пример че нещо почвам да се омотавам |
|
| Автор: | evc [ Съб Апр 07, 2007 9:55 pm ] |
| Заглавие: | |
Ами именно АНСИ не се съобразява дали има такава инструкция в някой процесор или не. Той за това е стандарт, защото (по идея би трябвало да) е независим от платформата. Кольо ще каже, но май само в ИАР така е направено, всички останали вече направиха крачка встрани - и ХАЙТЕК(последни) и Майкрочип и Микроелектроника, а ЦЦеС (от самото начало!) си имат процесорно ориентирани служебни функции. Не коментирам лошо ли е или добро! Но отнесено към стандарта - не е по стандарт! П.П. ТоНи прекопирай му това в твоя пост, че на мен не ми разбира: #define my_pin PORTB7 и от там нататък просто се записва my_pin=1; //=bsf PORTB,7 my_pin=0; //=bcf PORTB,7 |
|
| Автор: | ToHu [ Нед Апр 08, 2007 3:02 am ] |
| Заглавие: | |
Ами HiTech не съм ползвал, значи почти сигурно си има команда за работа с битове, еквивалент на bsf, bcf, обаче освен това предполагам можеш да дефинираш битове : sbit input = 0x06^2 ; в кеил #bit input =0x06.2; в CCS провери в HiTech какво се ползва. |
|
| Автор: | VSU [ Нед Апр 08, 2007 5:21 am ] |
| Заглавие: | |
портовете и битовете по портовете са си дефинирани в хедара на процесора например /* PORTB bits */ static volatile bit RB7 @ (unsigned)&PORTB*8+7; static volatile bit RB6 @ (unsigned)&PORTB*8+6; static volatile bit RB5 @ (unsigned)&PORTB*8+5; static volatile bit RB4 @ (unsigned)&PORTB*8+4; static volatile bit RB3 @ (unsigned)&PORTB*8+3; static volatile bit RB2 @ (unsigned)&PORTB*8+2; static volatile bit RB1 @ (unsigned)&PORTB*8+1; static volatile bit RB0 @ (unsigned)&PORTB*8+0; така че ако не ти трябват да са с други имена направо си пиши RB6=1; RB6=0; ако искаш да са с по човешки имена ги дефинираш #define ime RB3 тогава име=1; или име =0; по същия начин е и за променливи от тип BIT bit ime_na_promenlivata bit bbb; bank1 bit aaa; bank2 bit ccc; //----------------------------------------------------------------- #include <pic.h> __CONFIG(0x3f84); __IDLOC(2006); bit bbb; bank1 bit aaa; bank2 bit ccc; void init_sys(); void main(void) { init_sys(); while(1) { bbb ^= 1; aaa ^= 1; ccc ^= 1; RB1 ^= 1; RC2 ^= 1; // i taka na tataka } } void init_sys() { TRISB1=0; TRISC2=0; //........................ bbb=1; aaa=0; ccc=1; RB1=1; RC2=0; } //--------------------------------------------------------------------- eto kakvo generira 21: void init_sys() 22: { 23: TRISB1=0; TRISC2=0; 07E1 1683 BSF 0x3, 0x5 07E2 1303 BCF 0x3, 0x6 07E3 1086 BCF 0x6, 0x1 07E4 1107 BCF 0x7, 0x2 24: //........................ 25: bbb=1; aaa=0; ccc=1; 07E5 1283 BCF 0x3, 0x5 07E6 1420 BSF 0x20, 0 07E7 1683 BSF 0x3, 0x5 07E8 1020 BCF 0x20, 0 07E9 1283 BCF 0x3, 0x5 07EA 1703 BSF 0x3, 0x6 07EB 1410 BSF 0x10, 0 26: RB1=1; RC2=0; 07EC 1303 BCF 0x3, 0x6 07ED 1486 BSF 0x6, 0x1 07EE 1107 BCF 0x7, 0x2 27: } 07EF 0008 RETURN самия порт го установяваш направо с PORTB = 0x22; naprimer и не забравяй да сложиш #include <pic.h> това е за пик16 ако си на пик18 #include <pic18.h>[/size] |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|