Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не работает передача состояния линии из одного порта в другой (pic16f72)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
loghir
Доброго времени суток!
Написал прогу на С для простейшего тестирования программатора и подключения МК на макетке.
Код
#include <pic.h>
#define knopka RB4
#define diod RA0

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

void main (void)
{
podgot();
while(1)
{
diod = knopka;
}
}

кварц 4 mHz подключил к выводам 15 и 16. Кондеры - 25 пф. Резистор не ставил. На вывод 1 к питанию резимтор 20 кОм, на землю - кондер 10 мкф.
Не работает...
sargein
в конфигурации стоит LVPDIS? даташит качать лень, спрашиваю по аналогии с 628 sm.gif
xemul
Цитата(loghir @ May 2 2011, 15:32) *
Не работает...

Читать ДШ контроллера (и мануал компилятора) на предмет волшебных слов CONFIG (DS39597C-page 60) и OPTION (DS39597C-page 13).
Полагаю, Ваш контроллер уверен, что он работает от RC-генератора, а каждые ~2.3 с его будет пинать сбросом вочдог.
ar__systems
Цитата(xemul @ May 2 2011, 12:24) *
Полагаю, Ваш контроллер уверен, что он работает от RC-генератора, а каждые ~2.3 с его будет пинать сбросом вочдог.

И что, он и работает от него прекрасно. Переключение его на кварц ничего не поменяет.

Меня больше заитересовала строка

diode = knopka;

в каком компиляторе это написано?
loghir
Цитата
в конфигурации стоит LVPDIS?

такого бита конфигурации у меня нет. (Программатор ExtraPIC, софт icprog)
Что до конфигурации, то я ее задаю в icprog:
осциллятор - ХТ. Если и после этого МК считает, что работает не с кварцем... Да, кварц работает. Осциллоскоп ясно сие показывает.
WDT - OFF
PWRT - OFF
CP - OFF
BODEN - ON
Цитата
Меня больше заитересовала строка
diode = knopka;
в каком компиляторе это написано?

на С в PICC.
Взято из этого самоучитеся: http://www.labkit.ru/html/C_for_PIC?id=402
ar__systems
Цитата(loghir @ May 3 2011, 08:46) *
такого бита конфигурации у меня нет. (Программатор ExtraPIC, софт icprog)
Что до конфигурации, то я ее задаю в icprog:
осциллятор - ХТ. Если и после этого МК считает, что работает не с кварцем... Да, кварц работает. Осциллоскоп ясно сие показывает.
WDT - OFF
PWRT - OFF
CP - OFF
BODEN - ON

на С в PICC.
Взято из этого самоучитеся: http://www.labkit.ru/html/C_for_PIC?id=402

Я бы первым делом прошел код в симуляторе. Если работает, смотрите в сторону кривого программатора. Вы им до этого что-нибудь успешно программировали? С этим компилятором не знаком, но ассебмлер можно глянуть. Откройте disassembly listing в MPLAB IDE.

ps/ самоучитель - чтиво убойное.
sargein
Цитата(loghir @ May 2 2011, 14:32) *
(Программатор ExtraPIC, софт icprog)


А попробуйте прошивать софтиной picpgm, у меня когда экстрапик был, только с ней не было никаких проблем.
loghir
Цитата
Откройте disassembly listing в MPLAB IDE.

Вот:
Код
1:                 #include <pic.h>
2:                 #define knopka RB4
3:                 #define diod RA0
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:                 TRISA = 0b00000000;
   7F6    0185     CLRF 0x5
9:                 TRISB = 0b11111111;
   7F7    30FF     MOVLW 0xff
   7F8    0086     MOVWF 0x6
10:                PORTA = 0;
   7F9    1283     BCF 0x3, 0x5
   7FA    0185     CLRF 0x5
11:                PORTB = 0;
   7FB    0186     CLRF 0x6
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:                diod = knopka;
   7EA    1283     BCF 0x3, 0x5

Цитата
Вы им до этого что-нибудь успешно программировали?

сегодня, например. В порты А и В успешно пишет, все что задано.

Похоже, строка
Код
diode = knopka;

кривая. Есть мысли, как правильно?
ar__systems
Цитата(loghir @ May 3 2011, 10:45) *
15: void main (void)
16: {
17: podgot();
7E9 27F2 CALL 0x7f2
18: while(1)
7F1 2FEA GOTO 0x7ea
19: {
20: diod = knopka;
7EA 1283 BCF 0x3, 0x5[/code]


Не понял - это что, все? Еще 6 строк потеряны.
sargein
ошибся по поводу компилятора, сообщение можно удалить
xemul
Цитата(loghir @ May 3 2011, 19:45) *
Похоже, строка
Код
diode = knopka;

кривая. Есть мысли, как правильно?

Строчка совершенно нормальная, а вот 'Disassembly listing' МПЛаба глючит.
Во View->Program Memory всё показывается адекватно разумности компилятора. Можно ещё и в .lst заглянуть.

Угадать, что Вам не лень каждый раз задавать CONFIG в программаторе ручками, моей телепалки не хватило.
Когда станет лень, добавьте после #include <pic.h>
для писс v.9.81 и старше
Код
__CONFIG(FOSC_XT & WDTE_OFF & BOREN_OFF & CP_OFF);

для предыдущих
Код
__CONFIG(XT & WDTDIS & BORDIS & UNPROTECT);

или
Код
#if (_HTC_VER_MAJOR_ >= 9) && (_HTC_VER_MINOR_ >= 81)
__CONFIG(FOSC_XT & WDTE_OFF & BOREN_OFF & CP_OFF);
#else
__CONFIG(XT & WDTDIS & BORDIS & UNPROTECT);
#endif

Для 10-й версии потом сами поправите.
loghir
Цитата
Не понял - это что, все? Еще 6 строк потеряны.

все 20 строк на месте.

Цитата
Строчка совершенно нормальная,

а почему тогда в МК эта прога не работает?


Цитата
__CONFIG(XT & WDTDIS & BORDIS & UNPROTECT);

спасибо за подсказку, но это у меня не первоочередная проблема.
xemul
Цитата(loghir @ May 3 2011, 22:54) *
а почему тогда в МК эта прога не работает?

В симуляторе МПЛаба работает, можете сами легко убедиться.
Проверяйте железо или зовите на помощь джинна протеуса - говорят, он всё может, даже схемы из подкорки телепать.
sargein
Цитата(xemul @ May 3 2011, 22:08) *
В симуляторе МПЛаба работает, можете сами легко убедиться.
Проверяйте железо или зовите на помощь джинна протеуса - говорят, он всё может, даже схемы из подкорки телепать.


только вот там нету pic16f72 smile3046.gif
xemul
Цитата(sargein @ May 3 2011, 23:45) *
только вот там нету pic16f72 smile3046.gif

Для проверки кода ТС достаточно любого пика - в якобы неработающей части одна и таже версия писс скомпилит всё один-в-один (надеюсь, Вы не станете выбор банка относить к существенным отличиям?).
Протеусом я не страдаю ни в какой форме, поэтому, естесно, не в курсах, чего там нету. Икона риальнаго эмбеддера была помянута исключительно из зловредности.
loghir
Цитата(xemul @ May 3 2011, 22:08) *
Проверяйте железо

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

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

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

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

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

то
Код
RA0 = RB4;
loghir
Цитата
Одноцветно.

Если бы все было так "одноцветно"!
вот так работает, но странно: на 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
Цитата
Попробуйте всё-таки заглядывать в получаемый ассемблерный код.

Что я в том ассемблере пойму? А хоть бы и понял - на С другой команды нет.
xemul
Цитата(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;" что так, что эдак нелогично.
Цитата
Что я в том ассемблере пойму? А хоть бы и понял - на С другой команды нет.

Не отчаивайтесь - есть ещё много других способов гадания. Когда гадать надоест, почитайте ДШ что ли.
loghir
Цитата
Код
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
xemul
Цитата(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.
loghir
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
xemul
Цитата(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.
loghir
Цитата
Спасибо, но надеюсь, что меня так не угораздитsm.gif.

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

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

это означает
ХТ - выбран
WDTDIS - это "WDT - отключено"
BORDIS - не понял
UNPROTECT - это "СР - отключено"?
А как насчет включения BODEN?
xemul
Цитата(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.
loghir
Цитата
BrownOutReset Disabled

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

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

и не облом было все менять! Как-нибудь потом разберусь. Спасибо за инфу.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.