Port Pins als Ein- und Ausgänge
Ich Experiementiere jetzt schon seit einiger Zeit mit meinem PIC 16F876 rum und wollte jetzt etwas neues versuchen.
Wenn man zum Beispiel RA7 und RA6 verbindet, soll etwas passieren.
Jetzt habe ich im Internet gelesen, dass man einige Pins eines Ports als Eingang und Andere als Ausgang definieren kann. Das wusste ich nicht.
Ich dachte ein ganzer Port ist entweder Ein- oder Ausgang.
Wie kann ich das denn anstellen?
Ich müsste ja zum Beispiel RA7 als Ausgang auf "1" setzen und RA6 müsste ein Eingang (auf 0) sein. Wenn man beide verbindet, müsste man dann doch nur mit einem "if" Überprüfen ob RA6 1 oder 0 ist, oder liege ich da falsch?
Sinn der ganzen Sache ist erst mit einem Knopf zwichen zwei Pins zu arbeiten, um spÄter eine 3x4 Matrix Tastatur an Port A anzuschliessen.
DIe Beispielprogramme die ich gefunden habe waren leider alle in Assambler, und ich programiere in "c".
Ich habe gerade in einem Thread gelesen, dass man sagen muss ob die Pins von Port A Digital oder Analog sein sollen.
Wie macht man das? Ich dachte es gäbe nur in PortC einen oder zwei analoge Pins.
Viele Grüsse,
Tornado
Liste der Anhänge anzeigen (Anzahl: 1)
Schaltplan und code
So, hier ist der Schaltplan. Ich hatte leider nur Paint zur Hand :oops: aber ich hoffe, dass man das wichtigste erkennen kann.
Die Wiederstände sind folgende:
drei 220 Ohm --> R1
R2 --> an Pin RB3 --> 800 Ohm
an den anderen Pins --> 4,7k
drei 270 Ohm --> R3 habe ich jetzt nachträglich dran gemacht
R2 sind pull up Wiederstände.
Die Vierecke am Port B sind Pins um später ein Display anzuschliessen.
So, hier kommt der Code:
Code:
#include <pic1687x.h>
#define PORTBIT(adr, bit) ((unsigned)(&adr)*8+(bit))
//-------------------------------------------------------------------------
void main (void)
{
TRISA = 0x00; //Port A = Ausgang mit LEDs
TRISB = 0x00011111; //RB0 - RB4 = Eingänge, RB5 - RB7
//= Ausgänge
//RB0 brauchen wir im Moment nicht
PORTA = 0b00000000;
PORTB = 0b00001110; // RB5-RB7 auf Low und RB1-RB4 auf High
//RB1 - RB4 auch mit Pull-up Wiederständen auf High
//RB4 scheint vertauscht zu sein. Bei 0 ist er High,
//bei 1 Low
do{
if (RB4 == 0){ //RB4 mit RB5, 6 oder 7 verbunden
PORTA = 0b00000001; //Led 1 geht an (das funktioniert richtig)
}
else if (RB3 == 0){ //funktioniert nur an RB5, 6 oder 7 OHNE
//Wiederstand R1!!!
PORTA = 0b00000010; //Led 2 geht an
}
else if (RB2 == 0){ //funktioniert nur an RB5, 6 oder 7 OHNE
//Wiederstand R1!!!
PORTA = 0b00000000; //Led 1 und 2 aus
}
else { //Keine Taste gedrück
PORTA = 0b00000011; //Led 1 und 2 an (funktioniert richtig)
}
}while (1); //immer wiederholen
}//()
Also ich habe keinen Grund gefunden warum das so nicht funktioniert.
Bei RB1 bis RB3 geht es ja nur wenn man R1 überbrückt.
Grüsse,
Tornado