реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Работа с портами под XC8
Energy_for_life
сообщение Dec 1 2013, 12:35
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 10-08-11
Пользователь №: 66 656



Обнаружил, что комманда работы с пином PORTXbits.RXn под XC8 действует на весь порт, а не на отдельный вывод.
Для примера привел код работы с семисегментным индикаторов на 4-е цифры.

#include <xc.h>
#define _XTAL_FREQ 1000000
#pragma config WDT=OFF
#pragma config OSC=XT
#pragma config PWRT=ON
#pragma config BOREN=ON

void main(void)
{
TRISD = 0;
PORTD=0x00; // индикатор подключен к порту D
TRISB = 0;
PORTB = 0xFF; // аноды сигментов к порту B

while(1){
PORTBbits.RB0 = 0; //сбрасывает 1-й вывод в 0
__delay_ms(500);
PORTB = 0xFD; //сбрасывает 2-й вывод в 0
__delay_ms(500);
PORTB = 0xFB; //сбрасывает 3-й вывод в 0
__delay_ms(500);
PORTB = 0xF7;//сбрасывает 4-й вывод в 0
__delay_ms(500);
}
}
Ниже прикрепил работу в PROTEUS
При обращении к выводу 0 через PORTBbits.RB0 = 0 срабатывает весь порт
При обращении к выводу 0 через PORTB = 0xFD срабатывает соответствующий вывод
Не могу понят как работать с отдельным выводом, а не со всем портом?
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Dec 1 2013, 13:54
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



Я подобного не припомню.
Вроде срабатывало как положено.
На реальном чипе используя PICKit 3.


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Energy_for_life
сообщение Dec 1 2013, 14:25
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 10-08-11
Пользователь №: 66 656



Цитата(A. Fig Lee @ Dec 1 2013, 16:54) *
Я подобного не припомню.
Вроде срабатывало как положено.
На реальном чипе используя PICKit 3.

К сожалению не имею реального чипа под рукой(
Видимо глюки протеуса
Go to the top of the page
 
+Quote Post
Redguy
сообщение Dec 1 2013, 18:09
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 14-01-10
Из: Россия, Самара
Пользователь №: 54 801



Хотелось бы увидеть ассемблерный код, сгенерированный компилятором.
У меня скомпиленный код содержит следующее:
Код
...
BCF 0xF81, 0, ACCESS //сбрасывает 1-й вывод в 0

MOVLW 0xA3
MOVWF 0x5, ACCESS
MOVLW 0x55
DECFSZ 0xFE8, F, ACCESS
BRA 0x7FBA
DECFSZ 0x5, F, ACCESS
BRA 0x7FBA

MOVLW 0xFD //сбрасывает 2-й вывод в 0
MOVWF 0xF81, ACCESS
...


тут четко видно, что прописано обращение к конкретному 0-му биту. никак не ко всему порту.
Go to the top of the page
 
+Quote Post
volodya
сообщение Dec 2 2013, 06:24
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 194
Регистрация: 14-02-07
Из: УКРАИНА
Пользователь №: 25 344



Битовая операция состоит из чтения PORTx, изменения бита и записи , в данном случае работы с портом, в LATx. Для управления портом PIC18 рекомендуют LATx регистр соответствующего порта. Поскольку операции с регистром PORTx связаны с чтением состояния пинов, которое из-за инерционности , конвейера и т.д. может не успевать адекватно отображаться. Представьте возможное поле для ошибок. Кроме того часто возникают жалобы на PROTEUS.
Рекомендую заменить обращения на LATxbits.LATxy битовые и LATx регистровые.


--------------------
"Для того чтобы избежать критики, надо ничего не делать, ничего не говорить и никем не быть"
"Каждый из нас бывает дураком по крайней мере пять минут в день; мудрость заключается в том, чтобы не превысить лимит." Элберт Хаббард
Go to the top of the page
 
+Quote Post
Energy_for_life
сообщение Dec 2 2013, 16:20
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 10-08-11
Пользователь №: 66 656



Цитата(volodya @ Dec 2 2013, 10:24) *
Битовая операция состоит из чтения PORTx, изменения бита и записи , в данном случае работы с портом, в LATx. Для управления портом PIC18 рекомендуют LATx регистр соответствующего порта. Поскольку операции с регистром PORTx связаны с чтением состояния пинов, которое из-за инерционности , конвейера и т.д. может не успевать адекватно отображаться. Представьте возможное поле для ошибок. Кроме того часто возникают жалобы на PROTEUS.
Рекомендую заменить обращения на LATxbits.LATxy битовые и LATx регистровые.


Спасибо! Под LAT работает как надоsm.gif Только не очень понятно, зачем вообще в описании на XC8 приводят подобные команды работы с портами, если они работают не адекватно.
Go to the top of the page
 
+Quote Post
dENIM
сообщение Dec 5 2013, 08:00
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 13-03-07
Из: Севастополь
Пользователь №: 26 137



Цитата(Energy_for_life @ Dec 2 2013, 19:20) *
зачем вообще в описании на XC8 приводят подобные команды работы с портами, если они работают не адекватно.

и выглядят как г#$но, поскольку RB0=0; тоже работает.
Go to the top of the page
 
+Quote Post
Energy_for_life
сообщение Dec 9 2013, 16:55
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 10-08-11
Пользователь №: 66 656



Проблема с портом A. Не могу считать состояние порта

void main(void) {

ADCON1=0x07;
CMCON=0x07;


while(1){
LATAbits.LA0=0;
PORTA=0;
TRISAbits.RA0=1;
PORTAbits.RA0=1;

if (PORTAbits.RA0==1){
a=1;
}
else {
a=0;
}
}
return;
}

Уже бесят меня эти порты((
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Dec 9 2013, 17:24
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



Цитата(Energy_for_life @ Dec 9 2013, 11:55) *
Проблема с портом A. Не могу считать состояние порта

void main(void) {

ADCON1=0x07;
CMCON=0x07;


while(1){
LATAbits.LA0=0;
PORTA=0;
TRISAbits.RA0=1;
PORTAbits.RA0=1;

if (PORTAbits.RA0==1){
a=1;
}
else {
a=0;
}
}
return;
}

Уже бесят меня эти порты((



ANSEL = 0;

было до этого? Они бай дефоулт в аналоговом моде.


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Energy_for_life
сообщение Dec 9 2013, 17:28
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 10-08-11
Пользователь №: 66 656



Цитата(A. Fig Lee @ Dec 9 2013, 20:24) *
ANSEL = 0;

было до этого? Они бай дефоулт в аналоговом моде.


#include <htc.h>

#define _XTAL_FREQ 8000000
#pragma config WDT=OFF //????????? WD
#pragma config OSC=HS //??????? ?????????
#pragma config PWRT=ON //??????? ?????????
#pragma config BOREN=ON //??????? ?????????
#pragma ANSEL0=0;
int a;

void main(void) {

ADCON1=0x07;
// CMCON=0x07;


while(1){
LATAbits.LA0=0;
PORTA=0;
TRISA=0xcf;
;

a=PORTAbits.RA0;
}
return;
}
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Dec 9 2013, 17:30
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



A что, можно в #pragma?
Я прямо в коде писал


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Energy_for_life
сообщение Dec 9 2013, 17:44
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 10-08-11
Пользователь №: 66 656



Цитата(A. Fig Lee @ Dec 9 2013, 20:24) *
ANSEL = 0;

было до этого? Они бай дефоулт в аналоговом моде.


В даташите ничего не нашел об ANSEL

Цитата(A. Fig Lee @ Dec 9 2013, 20:30) *
A что, можно в #pragma?
Я прямо в коде писал


Я просто попробывал)) компилятор прагму такую не знает, а в коде выдает ошибку, что не знает такой идентификатор(

Программирую pic18F4520( может кто поможет?
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Dec 9 2013, 17:52
Сообщение #13


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



A. У меня другой чип был


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
bywanted
сообщение Feb 17 2014, 06:31
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 30-01-13
Пользователь №: 75 414



Попробуй так.
вместо ADCON1 = 0x07;
ADCON1 = 0x0F;
Страница 224 в мануале.

Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 06:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.0147 секунд с 7
ELECTRONIX ©2004-2016