Hallo, ich habe hier ein Project mit einem pic 18f4550.
Mit dem Controller wird eine 2 Farben LED angesteuert. Das ganze ist etwas kompliziert gemacht, da diese LED keine gemeinsame Masse hat und die LEDs antiparallel geschaltet sind.
Nun wollte ich erstmal ein kleines Testprogramm schreiben, bei dem die LED grün und rot abwechselnd blinkt.
Bei der schaltung müssen für rot folgende Bedingungen erfüllt sein:
RB0: Input
RB1: Output und High
RB2: Input
RB3: Output und Low
für grün siehts so aus:
RB0: Output und low
RB1: Input
RB2: Output und High
RB3: Input
Wenn ich nur eine der Farben erzeugen will funktioniert das ganze auch, nur klappt es nicht wenn ich die Farben wechseln will.
Was mache ich falsch?
Kann ich die nicht einfach neu definieren, so wies hier steht?
Hab mal die Spannungen gemessen. Komischerweise sind RB1 und RB2 bei 5V und RB0 und RB3 bei0V
Eine Frage hab ich noch:
Wie kann ich die Internen Pullups aktivieren, oder sind die bei Input schon automatisch aktiv?
Code:
/** I N C L U D E S **********************************************************/
#include <p18cxxx.h>
#include "delays.h"
/** V A R I A B L E S ********************************************************/
#pragma udata
int switch_setting = 0;
/** P R I V A T E P R O T O T Y P E S ***************************************/
/** V E C T O R R E M A P P I N G *******************************************/
extern void _startup (void); // See c018i.c in your C18 compiler dir
#pragma code _RESET_INTERRUPT_VECTOR = 0x000800
void _reset (void)
{
_asm goto _startup _endasm
}
#pragma code
#pragma code _HIGH_INTERRUPT_VECTOR = 0x000808
void _high_ISR (void)
{
;
}
#pragma code _LOW_INTERRUPT_VECTOR = 0x000818
void _low_ISR (void)
{
;
}
#pragma code
/** D E C L A R A T I O N S **************************************************/
#pragma code
/******************************************************************************
* Function: void main(void)
*
* PreCondition: None
*
* Input: None
*
* Output: None
*
* Side Effects: None
*
* Overview: Main program entry point.
*
* Note: None
*****************************************************************************/
/** L E D ***********************************************************/
#define mInitAllLEDs() LATD &= 0xF0; TRISD &= 0xF0;
#define mLED_1 LATDbits.LATD0
#define mLED_2 LATDbits.LATD1
#define mLED_3 LATDbits.LATD2
#define mLED_4 LATDbits.LATD3
#define mLED_1_On() mLED_1 = 1;
#define mLED_2_On() mLED_2 = 1;
#define mLED_3_On() mLED_3 = 1;
#define mLED_4_On() mLED_4 = 1;
#define mLED_1_Off() mLED_1 = 0;
#define mLED_2_Off() mLED_2 = 0;
#define mLED_3_Off() mLED_3 = 0;
#define mLED_4_Off() mLED_4 = 0;
#define mLED_1_Toggle() mLED_1 = !mLED_1;
#define mLED_2_Toggle() mLED_2 = !mLED_2;
#define mLED_3_Toggle() mLED_3 = !mLED_3;
#define mLED_4_Toggle() mLED_4 = !mLED_4;
/** PORTB Red LED ******************************************************/
#define mInitRedLED() LATB &= 0xF5; TRISB &= 0xF5;
#define mRB1 LATBbits.LATB1
#define mRB3 LATBbits.LATB3
#define mRB1Red() mRB1 = 1;
#define mRB3Red() mRB3 = 0;
/** PORTB Green LED ******************************************************/
#define mInitGreenLED() LATB &= 0xFA; TRISB &= 0xFA;
#define mRB0 LATBbits.LATB0
#define mRB2 LATBbits.LATB2
#define mRB0Green() mRB0 = 0;
#define mRB2Green() mRB2 = 1;
/** S W I T C H *****************************************************/
#define mInitAllSwitches() TRISBbits.TRISB4=1;TRISBbits.TRISB5=1;
#define mInitSwitch2() TRISBbits.TRISB4=1;
#define mInitSwitch3() TRISBbits.TRISB5=1;
#define sw2 PORTBbits.RB4
#define sw3 PORTBbits.RB5
void main(void)
{
ADCON1 |= 0x0F; // Default all pins to digital
mInitAllSwitches();
mInitAllLEDs();
while(1){
mInitGreenLED();
mRB0Green();
mRB2Green();
Delay10KTCYx(1000);
mInitRedLED();
mRB1Red();
mRB3Red();
Delay10KTCYx(1000);
}//end while
}//end main
Hier nochmal der Teil, worauf es mir ankommt. Die Umschaltung der der Eingänge zu Ausgängen und die der einzelnen Pegel:
Code:
/** PORTB Red LED ******************************************************/
#define mInitRedLED() LATB &= 0xF5; TRISB &= 0xF5;
#define mRB1 LATBbits.LATB1
#define mRB3 LATBbits.LATB3
#define mRB1Red() mRB1 = 1;
#define mRB3Red() mRB3 = 0;
/** PORTB Green LED ******************************************************/
#define mInitGreenLED() LATB &= 0xFA; TRISB &= 0xFA;
#define mRB0 LATBbits.LATB0
#define mRB2 LATBbits.LATB2
#define mRB0Green() mRB0 = 0;
#define mRB2Green() mRB2 = 1;
while(1){
mInitGreenLED();
mRB0Green();
mRB2Green();
Delay10KTCYx(1000);
mInitRedLED();
mRB1Red();
mRB3Red();
Delay10KTCYx(1000);
}//end while
Vielen Dank fürs Lesen.
Lesezeichen