
Basic PIC Programming - Помощ!
Здравейте,
От доста време следя форума, но досега не се бях престрашил да пиша. Причината да го направя сега обаче не е много приятна
Тепърва навлизам в тематиката за използване/програмиране на микроконтролери. От скоро работя по проект, свързан с образованието ми, но преди да започна с какъвто и да е дизайн на схеми, се опитвам да изуча сърцето на моя проект - микроконтролер PIC18F25K80.
Опитвам се да направя нещо съвсем простичко (на пръв поглед, но не съвсем, поне за мен) - да светна LED с натискане на бутон. С какво разполагам:
Pickit3
микропроцесор PIC18F25K80
кварц за такт 8MHz
Напрежителен регулатор 7805, с който захранвам микропроцесора с 5V
Всички необходими кондензатори (на Vddcore и между Vdd и Vss, според изискванията в дейташийта)
На схемата ми съм свързал бутона и LED-а по следния начин:
На пин RB4 (според datasheet-a поддържащ interrupt on change) съм поставил бутона (на пина се подава високо ниво, при натискане - ниско ниво)
На пин RA1 е LED-a
Планът ми:
1. Да задам портът, на който е закачен диода, като изход.
2. Да задам портът, на който е закачен бутона, като вход.
3. Да задам портър, на който е закачен бутона, да приема прекъсвания.
4. Да зацикля основната програма в безкраен цикъл.
5. Да задам при прекъсване от бутона да се преобръща състоянието на порта, на който е закачен диодът.
6. Всички останали портове ще задам като входове (за да избегна плаване на портовете)
Използвам MPLAB.70 с добавен MPLAB C18 компилатор за C.
Ето го и кодът ми:
--------------------------------------------------------
#include <p18f25k80.h>
#include <delays.h>
#define XTAL_FREQ 8000000
#define LED PORTAbits.RA1
#define button PORTBbits.RB4
void interrupt();
void interrupt() //Interrupt service program
{
if(INTCONbits.RBIF == 1)
{
LED= ~LED; // change LED condition
INTCONbits.RBIF=0 ; //clear RB Interrupt Flag
}
}
void main()
{
TRISA = 0 ; // set PORTA as OUTPUT
TRISC = 1 ; // set PORTC as an INPUT
TRISB = 1 ; // set PORTB as an INPUT
INTCONbits.RBIE=1 ; //Interrupt on RB enabled
IOCB = 1 ; // Interrupt on change enabled for PORTB
INTCONbits.RBIF=0 ; //PORTB interrupt flag down
INTCON2bits.RBIP=1 ; //High priority interrupt
LED = 1; //LED off
while(1)
{
LED=1;
interrupt();
}
}
--------------------------------------------------------------
За съжаление не се получава желаният ефект. Както може би се вижда в кода, съм начинаещ и в програмирането със C. Ще съм благодарен, ако хвърлите един поглед и ми посочите къде греша.
Благодаря предварително и весели празници!
