• 1
  • 2
От мобилни телефони до цифрови камери
NeoBoss - специалист
има ли някой който разбира от програмиране на микроконтролери под C. Позлвам hitech C и имам няколко прости въпроса :)
torbalan - Дървен философ
ако са прости - питай...
NeoBoss - специалист
правя да мигат едни лампички всичко със мигането е ок. но съм сложил едн бутон на мклр входа. и искам при натискането му да се сменят едектите на лампичките

демеке при RE3 == 0 (това ми е мклр входа) да изпълянва един низ , като се натисне пак да изпълнява втория нис и така като се изредуват всичките да почне от начало

пробвах да задам променлива бутон на която при всяко натискане на бутона да се прибавя 1
и след това със
if (button == 0)
{
тука слагам единия ефект
}

if (button == 1)
{
тук другия вефект
}

и т.н. ама не стана изобщо не тръгна и незнам къде ми е проблем.

незнам дали мога тези низове да ги направя на функции и при всяко натискане да се извиква следващата функци. Мога да кача и кода който не върви :)
lenko71 - специалист
За какъв микроконтролер става въпрос?
"MCLR" входа поне при пикове се ползва само за ресет на програмата и в режим на програмиране.
Като компилираш програмата дава ли някакви грешки?
NeoBoss - специалист
контролера е PIC16F886 mclr като му е зададен по настройки да е дизейбъл се използва като обикновен вход. когато е енейбъл рестартира кода при зануляването му.
Не не ми два кода грешки. НО като го сложа на микроконтролера не сработва .
Това е кода който последно пробвах.

Код: Избери всички

#include <htc.h>
#include <pic.h>

__CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS & UNPROTECT &  DUNPROTECT & BOREN & IESODIS & FCMDIS & LVPDIS & DEBUGDIS);
 __CONFIG(BORV40); 
#ifndef _XTAL_FREQ
 // Unless already defined assume 4MHz system frequency
 // This definition is required to calibrate __delay_us() and __delay_ms()
 #define _XTAL_FREQ 4000000
#endif

void main (void)
{
ANSEL = 0x00;

    TRISC=0x00;
	TRISB=0x00;
	TRISA=0x00;
PORTA = 0;
PORTB = 0;
PORTC = 0;

unsigned char button ;
button = 0;

for(;;){

if (RE3 == 0)
button = button+1;

if (button == 0)
{
RB1 = 0;
RC7 = 1;
__delay_ms(25);
RB0 = 0;
RC6 = 1;
__delay_ms(25);
RC7 = 0;
RC5 = 1;
__delay_ms(25);
RC6 = 0;
RC4 = 1;
__delay_ms(25);
RC5 = 0;
RC3 = 1;
__delay_ms(25);
RC4 = 0;
RC2 = 1;
__delay_ms(25);
RC3 = 0;
RC1 = 1;
__delay_ms(25);
RC2 = 0;
RC0 = 1;
__delay_ms(25);
RC1 = 0;
RA7 = 1;
__delay_ms(25);
RC0 = 0;
RA6 = 1;
__delay_ms(25);
RA7 = 0;
RA5 = 1;
__delay_ms(25);
RA6 = 0;
RA4 = 1;
__delay_ms(25);
RA5 = 0;
RA3 = 1;
__delay_ms(25);
RA4 = 0;
RA2 = 1;
__delay_ms(25);
RA3 = 0;
RA1 = 1;
__delay_ms(25);
RA2 = 0;
RA0 = 1;
__delay_ms(25);
RA1 = 0;
RB7 = 1;
__delay_ms(25);
RA0= 0;
RB6 = 1;
__delay_ms(25);
RB7 = 0;
RB5 = 1;
__delay_ms(25);
RB6= 0;
RB4 = 1;
__delay_ms(25);
RB5 = 0;
RB3 = 1;
__delay_ms(25);
RB4= 0;
RB2 = 1;
__delay_ms(25);
RB3 = 0;
RB1 = 1;
__delay_ms(25);
RB2= 0;
RB0 = 1;
__delay_ms(25);
};
 
if (button == 1)
{
PORTA = 1;
PORTB = 1;
PORTC = 1;
__delay_ms(250);
PORTA = 0;
PORTB = 0;
PORTC = 0;
__delay_ms(250);

};
if (button == 3)
button = 0;
}  
} 
NeoBoss - специалист
добреде така кода според вас има ли грешка , защо не трябва да тръгва. Приемам всякакви предложения претполагам и със while също може да се получи.
Или някой ако знае как мога да го тествам виртуално дали работи зада не м исе налга всеки път като направя промяна по кода да го записвам да го махам от програматора да го слагам на схемата и ако не работи да го махам от схемата да го трия и т.н. просто след 10тата такава операция ства много досадно и рискувам да счупи контролера :)
lenko71 - специалист
За съжаление не ползвам "С" (PicBasic и понякога Assembler) и не мога да ти помогна с кода.
Все пак предполагам, че работиш в средата на MPLab. Там от главното меню може да избереш Debugger-->Select Tool-->MPLab Sim. Излизат няколко бутончета с които може да пускаш програмата автоматично или стъпка по стъпка. Така може да се ориентираш какво става.
Другото, което ползвам за симулации е Proteus 7.
LZ - специалист
Първо, не виждам какво става когато бутонът е 2
Инкрементирането на променлива с единица става с оператора ++

Код: Избери всички

button++;
не че както е сега е грешно, но като се използва ++ компилаторът има възможност да оптимизира.
Добре е ефектите да се изнесат в подпрограми, т.е. нещо от сорта

Код: Избери всички

if (!button) effect0();
else effect1();
ако са повече ефектите:

Код: Избери всички

switch (button)
{
case 0: effect0(); break;
case 1: effect1(); break;
case 2: effect2(); break;
}
ако бутона ще приема само стойности 0 и 1, по-добре да се направи така:

Код: Избери всички

button = 0;
for(;;)
{
if (!RE3) button = 1 - button;
....
}
и т.н.
NeoBoss - специалист
@lenko71 можеш ли да кажеш от къде мога да си тръпна тази прогеама , че преди време я търсих ама без успех. Иначе като пусна този дебъгер ми излиза зелена стралка след скобата на иф бутон == 1 и това е .

@LZ бутона го написах така във последствие защото незнах това ++ за увеличаване със еденица да не е от C++ а в чистото C да го няма. Както и невиждаш бутон 2 защото го изтрих с цел да намаля кода да има по малко евентуални грешки :( но дори и така трябва при пускане първоначално да не става нищо след натискане на бутона да се пусне първия ефект и ако го натиснеш пак да блокира. Но при мен само светкат първите пинове на портовете и след натискането на бутона не става нищо.

съгласен съм че ефектите е по добре да са с под програми, но незнам как е правилно да се извикват и задават. може ли да деш малко разяснения - ефектите ще са около 7

бях пробвал да ги задам
void effect1()
{
тука кода на ефекта
}
void effect2()
{
тука кода на другия ефект
}

и посе по някакъв начин да успя да го извикам ппри натискане на бутона
if(RE3 == 0) effect1();
но пак не тръгна и реших че съм на грешен път ....., не са ми особено ясни нещата работил съм преди време на C++ но със чистото С има разлика както и това че не пишеш проста програмка за компютър а трябва да се съобразяваш и със функциите на микроконтролера .

пък и търсенето във гугал не е много лесно щот не ми зачита че търся за "C" и изкарава всякакви резултати хахах
lenko71 - специалист
Горе вдясно има бутони. Със средния симулацията е стъпка по стъпка (при всяко натискане).

ПП: Между "...не стана изобщо не тръгна..." и "...само светкат първите пинове на портовете и след натискането на бутона не става нищо..." има голяма разлика!

Прикачен файл

Clipboard.jpg
Clipboard.jpg (56.34 KиБ) Видяна 6320 пъти
  • 1
  • 2

Тема "програмиране на PIC под C" | Включи се в дискусията:


Сподели форума:

Бъди информиран. Следвай "Направи сам" във Facebook:

Намери изпълнител и вдъхновения за дома. Следвай MaistorPlus във Facebook: