|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 10:05 pm
|
Страница 1 от 1
|
[ 7 мнения ] |
|
Операции с портове при HiTech PICC
| Автор |
Съобщение |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
 Операции с портове при 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;
това ми е ясно как работи .Някой може ли да разясни как работи онова с червения цвят,и как се ползва?
|
| Съб Апр 07, 2007 10:37 am |
|
 |
|
evc
Ранг: Напреднал
Регистриран на: Пет Окт 21, 2005 8:45 am Мнения: 499
|
"Това червеното" си е най-обикновен макрос.
#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 клетки за таблицата.
_________________ Простотията е Божи дар, но човек не бива да парадира с подаръците си!
|
| Съб Апр 07, 2007 1:34 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
Не съм много съгласен че това е ANSI начина, това е начна когато процесора няма команда за това. Микрочип си имат команда, затова е много по лесно (бързо и алко код) да оперираш директно с бита. Предполагам ако си дефинираш битова променлива е можеш да оперираш директно с нея =1, =0.
Преносимоста на кода не мисля че трябва да вреди на изпълнението и ефикасноста на написаният код, все пак говорим за контролери с ограничени ресурси, много от които имат операции за побитово управление.
|
| Съб Апр 07, 2007 8:59 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
ТоНи,ако обичаш разясни малко и дай пример че нещо почвам да се омотавам 
|
| Съб Апр 07, 2007 9:29 pm |
|
 |
|
evc
Ранг: Напреднал
Регистриран на: Пет Окт 21, 2005 8:45 am Мнения: 499
|
Ами именно АНСИ не се съобразява дали има такава инструкция в някой процесор или не. Той за това е стандарт, защото (по идея би трябвало да) е независим от платформата. Кольо ще каже, но май само в ИАР така е направено, всички останали вече направиха крачка встрани - и ХАЙТЕК(последни) и Майкрочип и Микроелектроника, а ЦЦеС (от самото начало!) си имат процесорно ориентирани служебни функции. Не коментирам лошо ли е или добро! Но отнесено към стандарта - не е по стандарт!
П.П. ТоНи прекопирай му това в твоя пост, че на мен не ми разбира: #define my_pin PORTB7 и от там нататък просто се записва my_pin=1; //=bsf PORTB,7 my_pin=0; //=bcf PORTB,7
may be the last evc style =/-
_________________ Простотията е Божи дар, но човек не бива да парадира с подаръците си!
|
| Съб Апр 07, 2007 9:55 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
Ами HiTech не съм ползвал, значи почти сигурно си има команда за работа с битове, еквивалент на bsf, bcf, обаче освен това предполагам можеш да дефинираш битове :
sbit input = 0x06^2 ; в кеил
#bit input =0x06.2; в CCS
провери в HiTech какво се ползва.
|
| Нед Апр 08, 2007 3:02 am |
|
 |
|
VSU
Ранг: Напреднал
Регистриран на: Нед Авг 14, 2005 1:08 pm Мнения: 433 Местоположение: Казанлък
|
портовете и битовете по портовете са си дефинирани в хедара на процесора например
/* 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]
|
| Нед Апр 08, 2007 5:21 am |
|
|
|
Страница 1 от 1
|
[ 7 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 3 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|