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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Не работает передача состояния линии из одного порта в другой (pic16f72)
loghir
сообщение May 4 2011, 08:38
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



Цитата(xemul @ May 3 2011, 22:08) *
Проверяйте железо

Записал в RA0 единицу - светодиод зажегся. laughing.gif
Из-за такой мелочи лезть в Протеус?! Для моих задач смогу обойтись без этой команды. Но любопытно...
Попробую так:
Код
RB4 = RA0;

Go to the top of the page
 
+Quote Post
xemul
сообщение May 4 2011, 08:44
Сообщение #17



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(loghir @ May 4 2011, 12:38) *
Записал в RA0 единицу - светодиод зажегся.

Как у Вас подключена кнопка? Мультиметр/осциллограф есть под рукой, или только светодиоды?
Цитата
Попробую так:
Код
RB4 = RA0;

Одноцветно. Попробуйте всё-таки заглядывать в получаемый ассемблерный код.

upd: если
Код
#define knopka RB4
#define diod RA0

то
Код
RA0 = RB4;
Go to the top of the page
 
+Quote Post
loghir
сообщение May 4 2011, 15:52
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



Цитата
Одноцветно.

Если бы все было так "одноцветно"!
вот так работает, но странно: на RB7 (кнопка) и после прекращения подачи +5В остается ВЛУ.
соответственно, на RB4 (светодиод) тоже. Если RB7 кратковременно посадить на "массу", светодиод гаснет.
Код
#include <pic.h>
void podgot (void)
{
ADCON1 = 0x07;
TRISB = 0b00000001;
TRISA = 0b11111111;
PORTA = 0;
PORTB = 0;
RBPU = 0;
}

void main (void)
{
podgot();
while(1)
{
RB4 = RB7;
}
}

но самое интересное, что
Код
RB7 = RB4;

(оно как-то логичнее.)
не работает вообще! biggrin.gif
Цитата
Попробуйте всё-таки заглядывать в получаемый ассемблерный код.

Что я в том ассемблере пойму? А хоть бы и понял - на С другой команды нет.

Сообщение отредактировал loghir - May 4 2011, 15:53
Go to the top of the page
 
+Quote Post
xemul
сообщение May 4 2011, 18:08
Сообщение #19



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(loghir @ May 4 2011, 19:52) *
Если бы все было так "одноцветно"!

Я в ассемблерном коде подглядел. Вам остаётся или поверить, или самому глянуть.
Цитата
вот так работает, но странно: на RB7 (кнопка) и после прекращения подачи +5В остается ВЛУ.
соответственно, на RB4 (светодиод) тоже. Если RB7 кратковременно посадить на "массу", светодиод гаснет.

Мил человек, думаете, я от скуки спрашивал, как у Вас кнопка включена? По исходной программе можно было предположить, что кнопка висит между Gnd и пином "knopka", и это при "RBPU = 0;" и кнопке на RBx совершенно нормально и работоспособно.
Кроме того, я полагал, что Вы догадывались, что "RBPU = 0;" включает внутренние подтяжки по пинам PORTB к Vcc. Но, судя по ..., я опять ошибся.
Цитата
Код
TRISB = 0b00000001;
...
RB4 = RB7;

Попробуйте догадаться, что здесь выглядит странновато.
Цитата
но самое интересное, что
Код
RB7 = RB4;

(оно как-то логичнее.)
не работает вообще!

Перевожу: прочитать состояние RB4 и установить RB7 в такую же позу.
Но с "TRISB = 0b00000001;" что так, что эдак нелогично.
Цитата
Что я в том ассемблере пойму? А хоть бы и понял - на С другой команды нет.

Не отчаивайтесь - есть ещё много других способов гадания. Когда гадать надоест, почитайте ДШ что ли.
Go to the top of the page
 
+Quote Post
loghir
сообщение May 5 2011, 12:28
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



Цитата
Код
TRISB = 0b00000001;
RB4 = RB7;

Попробуйте догадаться, что здесь выглядит странновато.

исходя из нижеизложенного — "прочитать состояние RB7 и установить RB4 в такую же позу" - с диода на кнопку. Действительно, странновато. Спасибо за подсказку.
Цитата
Мил человек, думаете, я от скуки спрашивал, как у Вас кнопка включена? По исходной программе можно было предположить, что кнопка висит между Gnd и пином "knopka", и это при "RBPU = 0;" и кнопке на RBx совершенно нормально и работоспособно.
Кроме того, я полагал, что Вы догадывались, что "RBPU = 0;" включает внутренние подтяжки по пинам PORTB к Vcc. Но, судя по ..., я опять ошибся.

Т.е. если в линию порта ничего не записывать, там через подтягивающий резистор установится ВЛУ? (1)?
А потом кнопкой можно замкнуть на GND. Полученное изменение должно быть передано на RB4.
Или с инверсией (мое предположение):
Код
RB4 = !RB7;

Цитата
Когда гадать надоест, почитайте ДШ что ли.

Вот про подключение кнопок там нет.

Попробовал:
Код
#include <pic.h>

void podgot (void)
{
ADCON1 = 0x07;
TRISB = 0b00000001;
TRISA = 0b11111111;
PORTA = 0;
// PORTB = 0;
RBPU = 0;
}

void main (void)
{
podgot();
while(1)
{
RB4 = RB7;
}
}

Hа RB7 НЛУ. При подаче него VCC загорается светодиод с RB4 на GND. При закорачивании RB7 на GND, на RB4 тоже появляется НЛУ.
И как подключить кнопку к RB7, чтобы при нажатии и отпускании на RB4 были изменения?
Вот ассемблерный листинг:
Код
1:                 #include <pic.h>
2:                
3:                
4:                
5:                 void podgot (void)
6:                 {
7:                 ADCON1 = 0x07;
   7F2    3007     MOVLW 0x7
   7F3    1683     BSF 0x3, 0x5
   7F4    1303     BCF 0x3, 0x6
   7F5    009F     MOVWF 0x1f
8:                 TRISB = 0b00000001;
   7F6    3001     MOVLW 0x1
   7F7    0086     MOVWF 0x6
9:                 TRISA = 0b11111111;
   7F8    30FF     MOVLW 0xff
   7F9    0085     MOVWF 0x5
10:                PORTA = 0;
   7FA    1283     BCF 0x3, 0x5
   7FB    0185     CLRF 0x5
11:            
12:                RBPU = 0;
   7FC    1683     BSF 0x3, 0x5
   7FD    1381     BCF 0x1, 0x7
13:                }
   7FE    1283     BCF 0x3, 0x5
14:                
15:                void main (void)
16:                {
17:                podgot();
   7E9    27F2     CALL 0x7f2
18:                while(1)
   7F1    2FEA     GOTO 0x7ea
19:                {
20:                RB4 = RB7;
   7EA    1283     BCF 0x3, 0x5
Go to the top of the page
 
+Quote Post
xemul
сообщение May 5 2011, 13:11
Сообщение #21



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(loghir @ May 5 2011, 16:28) *
Т.е. если в линию порта ничего не записывать, там через подтягивающий резистор установится ВЛУ? (1)?

И одноцветно, и фиолетово, будете ли Вы что-то записывать в линию порта, т.к. WPU (weak pull-ups) распространяется только на входы (в случае 16F72 - сразу всего PORTB, и только PORTB).
Цитата
А потом кнопкой можно замкнуть на GND. Полученное изменение должно быть передано на RB4.

Ваша программа (предполагается) транслирует состояние одного пина в состояние другого. Если состояние входного пина изменилось, то должно измениться и состояние выходного.
Цитата
Или с инверсией (мое предположение):
Код
RB4 = !RB7;

Ну а это-то как Вам удалось предположить? По тому факту, что светодиод гаснет при нажатии на кнопку? Включите светодиод не на землю, а на питание, и он будет загораться. Но на выходе точно также будет 0 при нажатой кнопке, и 1 при отпущенной.
Цитата
Вот про подключение кнопок там нет.

Зато есть про TRIS, WPU, и смехотехнику входов/выходов.
Цитата
Вот ассемблерный листинг:
Код
   7F3    1683     BSF 0x3, 0x5; 0x03 - регистр STATUS, в нём 5-й и 6-й биты - RP0 и RP1
   7F3    1683     BCF 0x3, 0x6; эти две команды выбирают активным Bank1 - в нём живут TRISx
...
8:                 TRISB = 0b00000001;
   7F6    3001     MOVLW 0x1; загрузить в W 0x01
   7F7    0086     MOVWF 0x6; и отправить W в TRISB

0b00000001 == 0x01 == 1. Вы упорно назначаете входом RB0, а не RB7.
Вас спасёт "TRISB = 0b10000000;" (или 0x80, 128, 0200 - выбирайте. При случае почитайте и о представлении констант в С).

В Вашем огрызке листинга нет куска собственно "RB4 = RB7;". Если снизойдёте до посмотреть в ассемблере, смотрите во View->Program Memory.
Go to the top of the page
 
+Quote Post
loghir
сообщение May 5 2011, 14:41
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



xemul
Код
RB4 = !RB7;

действительно передает состояние RB7 на RB4 с инверсией. Проверил на практике.
Цитата
Зато есть про TRIS, WPU, и смехотехнику входов/выходов.

к сожалению, у меня нет времени на планомерное изучение. Начал по (многомерный матюк) самоучителю. Это оттуда я набрался, что
Код
TRISB = 0b00000001;

делает входом RB7, а не RB0. Огромное спасибо за подсказку.
P.S. Если будут вопросы по Adobe Creative Suite CS2, Fontlab, Corel 11, (или по полиграфической допечатке), PCAD 4.5 - это ко мне.
Не везде я чайник. biggrin.gif
Go to the top of the page
 
+Quote Post
xemul
сообщение May 5 2011, 15:18
Сообщение #23



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(loghir @ May 5 2011, 18:41) *
xemul
Код
RB4 = !RB7;

действительно передает состояние RB7 на RB4 с инверсией. Проверил на практике.

Вероятно, я неправильно понял смысл сказанного в Вашем предыдущем посте.
В С '!' - оператор логического НЕ, '~' - оператор арифметического НЕ.
И "RB4 = !RB7;", "RB4 = ~RB7;" безусловно будут выполнять инверсию.
Цитата
P.S. Если будут вопросы по Adobe Creative Suite CS2, Fontlab, Corel 11, (или по полиграфической допечатке), PCAD 4.5 - это ко мне.
Не везде я чайник. biggrin.gif

Спасибо, но надеюсь, что меня так не угораздитsm.gif.
Go to the top of the page
 
+Quote Post
loghir
сообщение May 9 2011, 05:36
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



Цитата
Спасибо, но надеюсь, что меня так не угораздитsm.gif.

Я тоже надеялся спокойно доработать дизайнером... biggrin.gif

насчет строки
Код
__CONFIG(XT & WDTDIS & BORDIS & UNPROTECT);

это означает
ХТ - выбран
WDTDIS - это "WDT - отключено"
BORDIS - не понял
UNPROTECT - это "СР - отключено"?
А как насчет включения BODEN?

Сообщение отредактировал loghir - May 9 2011, 06:22
Go to the top of the page
 
+Quote Post
xemul
сообщение May 9 2011, 10:44
Сообщение #25



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(loghir @ May 9 2011, 09:36) *
насчет строки
Код
__CONFIG(XT & WDTDIS & BORDIS & UNPROTECT);

это означает
ХТ - выбран
WDTDIS - это "WDT - отключено"
BORDIS - не понял

BrownOutReset Disabled
См. DS39597C-page 64
Цитата
UNPROTECT - это "СР - отключено"?

Угу
Цитата
А как насчет включения BODEN?

Вероятно, BOREN для используемой Вами версии компилятора. (которую Вы так и не указали)
С v.9.81 и дальше были переиначены имена регистров и битов в заголовочных файлах, поэтому универсальный рецепт - сверяйтесь с соответствующим pic*.h.
Go to the top of the page
 
+Quote Post
loghir
сообщение May 9 2011, 13:55
Сообщение #26


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 13-03-11
Пользователь №: 63 577



Цитата
BrownOutReset Disabled

у меня просто нет такого конфигурационного бита.
Цитата
для используемой Вами версии компилятора. (которую Вы так и не указали)

вопроса такого небыло. Прошиваю IC-Prog 1.06A, компилятор PICC 8.05pl2.
Цитата
поэтому универсальный рецепт - сверяйтесь с соответствующим pic*.h.

и не облом было все менять! Как-нибудь потом разберусь. Спасибо за инфу.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th June 2025 - 09:19
Рейтинг@Mail.ru


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