Перейти к содержанию
    

Работа с портами под XC8

Обнаружил, что комманда работы с пином 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 срабатывает соответствующий вывод

Не могу понят как работать с отдельным выводом, а не со всем портом?

post-66656-1385901096_thumb.png

post-66656-1385901102_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я подобного не припомню.

Вроде срабатывало как положено.

На реальном чипе используя PICKit 3.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я подобного не припомню.

Вроде срабатывало как положено.

На реальном чипе используя PICKit 3.

К сожалению не имею реального чипа под рукой(

Видимо глюки протеуса

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотелось бы увидеть ассемблерный код, сгенерированный компилятором.

У меня скомпиленный код содержит следующее:

...
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-му биту. никак не ко всему порту.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Рекомендую заменить обращения на LATxbits.LATxy битовые и LATx регистровые.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Рекомендую заменить обращения на LATxbits.LATxy битовые и LATx регистровые.

 

Спасибо! Под LAT работает как надо:) Только не очень понятно, зачем вообще в описании на XC8 приводят подобные команды работы с портами, если они работают не адекватно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

зачем вообще в описании на XC8 приводят подобные команды работы с портами, если они работают не адекватно.

и выглядят как г#$но, поскольку RB0=0; тоже работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема с портом 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;

}

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема с портом 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;

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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;

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ANSEL = 0;

 

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

 

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

 

A что, можно в #pragma?

Я прямо в коде писал

 

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

 

Программирую pic18F4520( может кто поможет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...