PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RP6 Base header, port Initialisierung.



ThomasD
19.04.2010, 21:12
Hallo,

ich wollte mir die Grundeinstellung für die Ports ansehen, komme aber mir den Beschreibungen nicht klar und das dort so viele Fehler drin sind kann ich eigentlich nicht glauben, deshalb muss es da eine andere Antwort geben.
Also dort steht z.B.:


// ---------------------------------------------------
// PORTB

#define SL4 (1 << PINB7) // Output
#define ACS_L (1 << PINB6) // Output
#define START (1 << PINB5) // Input
#define PWRON (1 << PINB4) // Output
#define ACS_PWRH (1 << PINB3) // Output
#define ACS (1 << PINB2) // INT2 (Input)
#define SL5 (1 << PINB1) // Output
#define SL6 (1 << PINB0) // Output

// Initial value of port and direction registers.
#define INIT_DDRB 0b01011000
#define INIT_PRTB 0b00000000

// ---------------------------------------------------


Hinter den Pins steht also Input oder auch Output, vergleiche ich das mit der DDRB Anweisung steht dort aber was ganz anderes, für mich würde die Zeile so aussehen:
#define INIT_DDRB 0b11011011

Kann mir das mal jemand erklären?

Schöne Grüße
Thomas

sternst
19.04.2010, 21:59
Kann mir das mal jemand erklären?Es sieht so aus, als ob alle SLx in der Beschreibung als Output bezeichnet sind, beim Init aber als Input konfiguriert werden. Darüber, was es damit auf sich hat, sollte die Hardware oder der restliche Code Aufschluss geben. Es könnte z.B. sein, dass hier Open-Collector-Outputs gebildet werden.

ThomasD
19.04.2010, 22:09
Hallo,

laut Schaltplan sind die SLx LED's mit der Schaltung port -> wiederstand -> LED -> GND.

Schöne Grüße
Thomas

radbruch
19.04.2010, 22:38
Hallo

Für Programme die keine Leds verwenden ist es grundsätzlich nicht falsch die entsprechenden Pins als Eingang zu definieren. Wenn die Leds dann doch verwendet werden sorgt die entsprechende Funktion für die richtige Datenrichtung:

void updateStatusLEDs(void)
{
DDRB &= ~0x83;
PORTB &= ~0x83;
if(statusLEDs.LED4){ DDRB |= SL4; PORTB |= SL4; }
if(statusLEDs.LED5){ DDRB |= SL5; PORTB |= SL5; }
if(statusLEDs.LED6){ DDRB |= SL6; PORTB |= SL6; }
DDRC &= ~0x70;
PORTC &= ~0x70;
DDRC |= ((statusLEDs.byte << 4) & 0x70);
PORTC |= ((statusLEDs.byte << 4) & 0x70);
#ifdef POWER_ON_WARNING
leds_on = (leds_on ? leds_on : (statusLEDs.byte && 1));
#endif
}
(Aus der Datei RP6RobotBaseLib.c der RP6-Library)

Sogar hier werden die Pins PB0, Pb1 und PB7 zuerst als Eingang definiert, 0x83 ist 0b10000011

Gruß

mic