Я пытаюсь начать работу с PIC 18F4550 с использованием C, MPLAB X (как IDE, так и IPE) и с помощью PICKit 3. Мне удалось мигать одним светодиодом без каких-либо проблемы, но когда я пытаюсь одновременно мигать более одного светодиода, это не работает.Мигает 3 светодиодами, используя PIC 18F4550
Обратите внимание, что в конце вопроса я напишу свой полный код. До тех пор я буду писать псевдокод в надежде сделать мой вопрос немного яснее.
Предположим, я хочу мигать 4 светодиода, каждый приложенный к выходному контакту микросхемы, вы, очевидно, ввести что-то вроде
loop{
output1 = 1;
output2 = 1;
output3 = 1;
output4 = 1;
delay();
output1 = 0;
output2 = 0;
output3 = 0;
output4 = 0;
delay();
}
Вы могли бы ожидать, что все светодиоды будут включать и выключать одновременно. Однако я заметил, что только светодиод, подключенный к выходу4, будет мигать, а остальное останется выключенным. Так что я пытался листать порядок выходных выводов в качестве такого
loop{
output1 = 1;
output2 = 1;
output4 = 1;
output3 = 1;
delay();
output1 = 0;
output2 = 0;
output4 = 0;
output3 = 0;
delay();
}
В результате, только светодиод присоединен к выходу 3 будет мигать, а остальные останутся отключен.
Так что я понял, что код каким-то образом не выполняется последовательно, как я ожидал, что это так. Может кто-нибудь, пожалуйста, предоставит мне объяснение и возможное решение для этого?
Большое спасибо!
Вот полный код
#include <xc.h>
#include <p18f4450.h>
#pragma config FOSC = HS
#define outRed PORTBbits.RB0
#define outBlue PORTBbits.RB1
#define outYellow PORTBbits.RB2
#define outGreen PORTBbits.RB3
#define _XTAL_FREQ 10000000
void delay(unsigned int);
void main(void) {
TRISBbits.TRISB0 = 0;
TRISBbits.TRISB1 = 0;
TRISBbits.TRISB2 = 0;
TRISBbits.TRISB3 = 0;
while(1) {
outRed = 1;
outGreen = 1;
outBlue = 1;
outYellow = 1;
delay(1000);
outRed = 0;
outGreen = 0;
outBlue = 0;
outYellow = 0;
delay(1000);
}
}
void delay(unsigned int delayInput) {
unsigned int mul = delayInput/50;
unsigned int count = 0;
for (count = 0; count <= mul; count ++)
__delay_ms(50);
}
Это хорошо для меня! Большое спасибо! Есть ли причина для этого вопроса? В архитектуре ПОС? Я имею в виду, почему это происходит? – dou2abou
PORTx считывает из буферов цифровых входов, тогда как LATx записывает на выходные защелки. В некоторых случаях цифровые входные буферы не будут видеть напряжение, которое вы пытаетесь вывести с помощью регистров LATx (например, если какой-либо из выводов установлен как аналоговый вход, они будут считаться как 0). Объедините это с тем, что битовые операции реализованы с 8-битным read => modify => write, результаты PORTx могут быть неожиданными. Постскриптум Некоторые выводы PIC18F4550 могут быть сконфигурированы как аналоговые или цифровые входы с использованием регистра ADCON1. –