2016-09-17 16 views
0

Я пытаюсь начать работу с 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); 
} 

ответ

1

Это может быть LATCH вопрос. У меня была эта проблема несколько раз, когда я начал. Попробуйте записать в регистр LATB (выходной защелки) вместо регистра PORTB. Я всегда использую LATx для вывода и PORTx для ввода.

+0

Это хорошо для меня! Большое спасибо! Есть ли причина для этого вопроса? В архитектуре ПОС? Я имею в виду, почему это происходит? – dou2abou

+0

PORTx считывает из буферов цифровых входов, тогда как LATx записывает на выходные защелки. В некоторых случаях цифровые входные буферы не будут видеть напряжение, которое вы пытаетесь вывести с помощью регистров LATx (например, если какой-либо из выводов установлен как аналоговый вход, они будут считаться как 0). Объедините это с тем, что битовые операции реализованы с 8-битным read => modify => write, результаты PORTx могут быть неожиданными. Постскриптум Некоторые выводы PIC18F4550 могут быть сконфигурированы как аналоговые или цифровые входы с использованием регистра ADCON1. –

0

Всегда записывайте выходные выходы (в вашем случае LATB) и считывайте входы от PORTx. Запись в PORTx имеет непредсказуемое поведение.