|
Не работает передача состояния линии из одного порта в другой (pic16f72) |
|
|
|
May 4 2011, 08:38
|
Участник

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

|
Цитата(xemul @ May 3 2011, 22:08)  Проверяйте железо Записал в RA0 единицу - светодиод зажегся. Из-за такой мелочи лезть в Протеус?! Для моих задач смогу обойтись без этой команды. Но любопытно... Попробую так: Код RB4 = RA0;
|
|
|
|
|
May 4 2011, 08:44
|
    
Группа: Свой
Сообщений: 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;
|
|
|
|
|
May 4 2011, 15:52
|
Участник

Группа: Участник
Сообщений: 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; (оно как-то логичнее.) не работает вообще! Цитата Попробуйте всё-таки заглядывать в получаемый ассемблерный код. Что я в том ассемблере пойму? А хоть бы и понял - на С другой команды нет.
Сообщение отредактировал loghir - May 4 2011, 15:53
|
|
|
|
|
May 4 2011, 18:08
|
    
Группа: Свой
Сообщений: 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;" что так, что эдак нелогично. Цитата Что я в том ассемблере пойму? А хоть бы и понял - на С другой команды нет. Не отчаивайтесь - есть ещё много других способов гадания. Когда гадать надоест, почитайте ДШ что ли.
|
|
|
|
|
May 5 2011, 12:28
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
May 5 2011, 13:11
|
    
Группа: Свой
Сообщений: 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.
|
|
|
|
|
May 5 2011, 14:41
|
Участник

Группа: Участник
Сообщений: 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 - это ко мне. Не везде я чайник.
|
|
|
|
|
May 5 2011, 15:18
|
    
Группа: Свой
Сообщений: 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 - это ко мне. Не везде я чайник.  Спасибо, но надеюсь, что меня так не угораздит  .
|
|
|
|
|
May 9 2011, 05:36
|
Участник

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

|
Цитата Спасибо, но надеюсь, что меня так не угораздитsm.gif. Я тоже надеялся спокойно доработать дизайнером...  насчет строки Код __CONFIG(XT & WDTDIS & BORDIS & UNPROTECT); это означает ХТ - выбран WDTDIS - это "WDT - отключено" BORDIS - не понял UNPROTECT - это "СР - отключено"? А как насчет включения BODEN?
Сообщение отредактировал loghir - May 9 2011, 06:22
|
|
|
|
|
May 9 2011, 10:44
|
    
Группа: Свой
Сообщений: 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.
|
|
|
|
|
May 9 2011, 13:55
|
Участник

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

|
Цитата BrownOutReset Disabled у меня просто нет такого конфигурационного бита. Цитата для используемой Вами версии компилятора. (которую Вы так и не указали) вопроса такого небыло. Прошиваю IC-Prog 1.06A, компилятор PICC 8.05pl2. Цитата поэтому универсальный рецепт - сверяйтесь с соответствующим pic*.h. и не облом было все менять! Как-нибудь потом разберусь. Спасибо за инфу.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|