Re: PIC12F509 - написах код ама работи само на симулация
Благодаря на всички участници в темата.
КОДА МИ ЗАРАБОТИ и проблема е разрешен!
Вероятната причина беше в CONFIG-a както спомена
ToHuИ благодаряние на
Stoimen за работещия HEX аз успях да копирам настройките на процесора и получих работещ моя първоначален код с леки изменения!
stefan63 помогна доста - да се разплета от кълчищата
На дадената схема, светодиодите са към Vcc, в експерименталното шаси са към GND, и входовете са GP5 и GP4, a изходите GP1,GP0, но в крайния вариант няма да има светодиоди изобщо, а ще се управляват 2 елемента от ИС CD4066.
Освен ако някой няма нещо да добави, може да считаме темата за успешно приключена!
Ето и пълния работещ код!
| | |
| Код: /* PIC12F509 buttons to rotary encoder truth table. =========================== Count UP OUTA OUTB =========================== <1.1> = H - H <1.2> = L - H <2.1> = L - L <2.2> = H - L =========================== Count DN OUTA OUTB =========================== <1.1> = H - H <1.2> = H - L <2.1> = L - L <2.2> = L - H =========================== */ // CONFIG #include <pic.h> __CONFIG(0x0FEA); #define _XTAL_FREQ 4000000 #include <stdint.h> #define UP GPIObits.GP5 #define DN GPIObits.GP4 unsigned int j; #define loop4_ms 8 // 8 is number of loop iterations for 1 ms at 4 MHz
//**********functions****************
void pause_ms(unsigned int given_ms); // pause_ms(n); function same as delay_ms(n); int REP; //Repeat cycle 'n' times //**********mapping steps************
unsigned char const STEPS_MAP[4] = {0b11,0b10,0b00,0b01}; int step=0;
//main code void main(void) { TRIS = 0b110000; // Set GP0,GP1,GP2,GP3 as outputs, GP5, GP4 as input (0 => Output, 1 => input) GPIO = 0b000000; // Set GPIO = 0 for all outputs OPTION = 0b11000000; //Set functions for MCU pins - 0xC0 do { if (UP) //Check if switch is closed { pause_ms(90); //wait for 90ms (switch debouncing) if (UP) //Check if switch is still closed { for(REP=0; REP<=1; REP++) //Repeat steps until 'n' { GPIO = (STEPS_MAP[step]); //Load current state pause_ms(250); //Pulse time step++; //Count + if (step>3)step=0;
} REP; //End REP
} }
else { GPIO = (STEPS_MAP[step]); } if (DN) //Check if switch is closed { pause_ms(90); //wait for 90ms (switch debouncing) if (DN) //Check if switch is still closed { for(REP=0; REP<=1; REP++) { GPIO = (STEPS_MAP[step]); //Load current state pause_ms(250); //Pulse time step--; //Count - if (step<0)step=3; } REP; //End REP } } else { GPIO = (STEPS_MAP[step]); } }
while(1);
} //end main code
void pause_ms( unsigned int given_ms ) { // pause for given_ms milli seconds unsigned long j, max_time = given_ms * loop4_ms; for(j=0; j < max_time; j++); // Make waiting for about given_ms msec
}; | |
| | |