Микроконтролери и електроника
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 ]
Заглавие: 

ТоНи,ако обичаш разясни малко и дай пример че нещо почвам да се омотавам :oops:

Автор:  evc [ Съб Апр 07, 2007 9:55 pm ]
Заглавие: 

Ами именно АНСИ не се съобразява дали има такава инструкция в някой процесор или не. Той за това е стандарт, защото (по идея би трябвало да) е независим от платформата. Кольо ще каже, но май само в ИАР така е направено, всички останали вече направиха крачка встрани - и ХАЙТЕК(последни) и Майкрочип и Микроелектроника, а ЦЦеС (от самото начало!) си имат процесорно ориентирани служебни функции. Не коментирам лошо ли е или добро! Но отнесено към стандарта - не е по стандарт!

П.П. ТоНи прекопирай му това в твоя пост, че на мен не ми разбира:
#define my_pin PORTB7
и от там нататък просто се записва
my_pin=1; //=bsf PORTB,7
my_pin=0; //=bcf PORTB,7
:) may be the last evc style =/-

Автор:  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/