Новичок
Регистрация: 02.03.2012
Сообщений: 193
Репутация: 13
|
К PIC16f877a подключил(в протеусе, но это неважно) матричную панель 8х8 кнопок к порте c и d. c попорядку посылает сигналы d принимает, порт а выводит. Написал програмку, чтобы порт а показывал куда я виду по понельке, но чивото непоказывает...
Ошибка точно в программе. Вот программа: Код:
#include <pic.h> __CONFIG(0x03F72); int a=0,aa=0; void main(void) { T0IE=0; GIE=0; TRISC=0; TRISA=0; TRISD=0b11111111; TRISB=0; PORTB=0; PORTA=0; while(1) { while(1) //установка начальной точки нажатия { a=0; PORTC=0b00000001; if(RD0) { a=1; } if(RD1) { a=2; } if(RD2) { a=3; } if(RD3) { a=4; } if(RD4) { a=5; } if(RD5) { a=6; } if(RD6) { a=7; } if(RD7) { a=8; } if(a!=0) break; PORTC=0b00000010; if(RD0) { a=9; } if(RD1) { a=10; } if(RD2) { a=11; } if(RD3) { a=12; } if(RD4) { a=13; } if(RD5) { a=14; } if(RD6) { a=15; } if(RD7) { a=16; } if(a!=0) break; PORTC=0b00000100; if(RD0) { a=17; } if(RD1) { a=18; } if(RD2) { a=19; } if(RD3) { a=20; } if(RD4) { a=21; } if(RD5) { a=22; } if(RD6) { a=23; } if(RD7) { a=24; } if(a!=0) break; PORTC=0b00001000; if(RD0) { a=25; } if(RD1) { a=26; } if(RD2) { a=27; } if(RD3) { a=28; } if(RD4) { a=29; } if(RD5) { a=30; } if(RD6) { a=31; } if(RD7) { a=32; } if(a!=0) break; PORTC=0b00010000; if(RD0) { a=33; } if(RD1) { a=34; } if(RD2) { a=35; } if(RD3) { a=36; } if(RD4) { a=37; } if(RD5) { a=38; } if(RD6) { a=39; } if(RD7) { a=40; } if(a!=0) break; PORTC=0b00100000; if(RD0) { a=41; } if(RD1) { a=42; } if(RD2) { a=43; } if(RD3) { a=44; } if(RD4) { a=45; } if(RD5) { a=46; } if(RD6) { a=47; } if(RD7) { a=48; } if(a!=0) break; PORTC=0b01000000; if(RD0) { a=49; } if(RD1) { a=50; } if(RD2) { a=51; } if(RD3) { a=52; } if(RD4) { a=53; } if(RD5) { a=54; } if(RD6) { a=55; } if(RD7) { a=56; } if(a!=0) break; PORTC=0b10000000; if(RD0) { a=57; } if(RD1) { a=58; } if(RD2) { a=59; } if(RD3) { a=60; } if(RD4) { a=61; } if(RD5) { a=62; } if(RD6) { a=63; } if(RD7) { a=64; } if(a!=0) break; } do //установка второй точки, { aa=0; PORTC=0b00000001; if(RD0) { aa=1; } if(RD1) { aa=2; } if(RD2) { aa=3; } if(RD3) { aa=4; } if(RD4) { aa=5; } if(RD5) { aa=6; } if(RD6) { aa=7; } if(RD7) { aa=8; } PORTC=0b00000010; if(RD0) { aa=9; } if(RD1) { aa=10; } if(RD2) { aa=11; } if(RD3) { aa=12; } if(RD4) { aa=13; } if(RD5) { aa=14; } if(RD6) { aa=15; } if(RD7) { aa=16; } PORTC=0b00000100; if(RD0) { aa=17; } if(RD1) { aa=18; } if(RD2) { aa=19; } if(RD3) { aa=20; } if(RD4) { aa=21; } if(RD5) { aa=22; } if(RD6) { aa=23; } if(RD7) { aa=24; } PORTC=0b00001000; if(RD0) { aa=25; } if(RD1) { aa=26; } if(RD2) { aa=27; } if(RD3) { aa=28; } if(RD4) { aa=29; } if(RD5) { aa=30; } if(RD6) { aa=31; } if(RD7) { aa=32; } PORTC=0b00010000; if(RD0) { aa=33; } if(RD1) { aa=34; } if(RD2) { aa=35; } if(RD3) { aa=36; } if(RD4) { aa=37; } if(RD5) { aa=38; } if(RD6) { aa=39; } if(RD7) { aa=40; } PORTC=0b00100000; if(RD0) { aa=41; } if(RD1) { aa=42; } if(RD2) { aa=43; } if(RD3) { aa=44; } if(RD4) { aa=45; } if(RD5) { aa=46; } if(RD6) { aa=47; } if(RD7) { aa=48; } PORTC=0b01000000; if(RD0) { aa=49; } if(RD1) { aa=50; } if(RD2) { aa=51; } if(RD3) { aa=52; } if(RD4) { aa=53; } if(RD5) { aa=54; } if(RD6) { aa=55; } if(RD7) { aa=56; } PORTC=0b10000000; if(RD0) { aa=57; } if(RD1) { aa=58; } if(RD2) { aa=59; } if(RD3) { aa=60; } if(RD4) { aa=61; } if(RD5) { aa=62; } if(RD6) { aa=63; } if(RD7) { aa=64; } } while( a==aa || aa==0 ); //проверка не является ли вторая точка первой. if(a<aa) { if(aa-8==a) { PORTA=1; } else{ PORTA=0b000010;} } //обработка инф. else { if(a-8==aa) { PORTA=0b001000;} else{ PORTA=0b0000100;} } } } |
||
Оценка
|
Новичок
Регистрация: 08.06.2011
Сообщений: 3
Репутация: 10
|
Схемку включения контроллера не мешало-бы. А по сути попробуй это делать на контрах Atmel. В AVR Studio есть отличный эмулятор позволяющий протестить программу на предмет ошибок.
Хм, а что за панель 8х8? Как её звать то? А то кажется что ты пытаешся построить комп на транзисторах
Последний раз редактировалось Alexs-560; 19.04.2012 в 19:40.
|
||
Оценка
|
Знаток
Регистрация: 12.11.2010
Адрес: Владимир
Сообщений: 239
Репутация: 108
|
Язык Си не знаю. Я на ассемблере лабаю. Но может что умное скажу. Если глупость - сильно не бейте )))
Во-первых, вижу установку портов A и B в двух соседних строчках. Стараюсь избегать этого. На ассемблере вставляю штуки три "nop" в таких случаях. Это из-за особенности ПИКов по записи значений в порты, оно производится в три этапа: Чтение - Модификация - Запись, и на эти этапы процу нужно время, например в виде пустых команд "nop". Да, возможно в данном случае это и не требуется, так как порты разные (A и B), но лучше перебздеть чем недобздеть )) А где настройка переферии? И еще я не вижу где в этой программе настройка АЦП например. Они на порту A задействованы могут быть. И значит порт A в качестве порта ввода-вывода цифровых сигналов использовать не сможете. Вобщем для начала в проге единоразово надо пройтись по установке регистров периферии. |
||
Оценка
|
Новичок
Регистрация: 02.03.2012
Сообщений: 193
Репутация: 13
|
Панель, (если Вы знакомы с протеусом) это сенсорная панель от шахмат, немного доработанная. Называется CHEES-KEYPAD.
В архиве программа , файл протеуса и документ с фотографией схемы. Вы не поверите, я открыл чтобы вспомнить какие глюки и обноружил что все работает, хочу доработать программу чтобы распозновалось движение по диагонали. Я думаю получится. Я же помню что несколько дней назад я двигал хоть куда, а эта схема показывала вверх, а сейчас работает |
||
Оценка
|
Обратная связь РадиоЛоцман Вверх |