- LiTime Speicher und Akkus         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 26

Thema: Port Pins als Ein- und Ausgänge

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.03.2005
    Ort
    Spanien
    Alter
    39
    Beiträge
    398

    Port Pins als Ein- und Ausgänge

    Anzeige

    Powerstation Test
    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

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.03.2005
    Ort
    Spanien
    Alter
    39
    Beiträge
    398

    Pins

    Uff!!!!!
    Ich sitze jetzt schon seit Stunden hier dran. Ich habe jetzt selber rausgefunden wie man manche Pins von einem Port als Ausgang und andere als Eingang festlegt.
    Aber was stimmt denn an meinem Code nicht?
    Wenn RB7 ein Eingang auf 0 ist und ich ihn mit RB6 (Ausgang auf 1) verbinde, müsste RB7 doch 1 werden.
    Egal was ich mache, es leuchtet immer nur die erste LED (RA0) aber nie RA1.
    Ist hier ein Denkfehler, oder ist mein PIC schon kaputt?
    Viele Grüsse,
    Tornado


    Code:
    void main (void){
        TRISA = 0x00;             //Port A  = Ausgang mit LEDs
        TRISB = 0x10000000;       //RB7= Eingang, der Rest --> Ausgänge 
        PORTA = 0b00000000;
        PORTB = 0b00000000;       //RB7 = Low
        RB6=1;                    //RB1 = Ausgang auf High
               // Wenn RB7 und RB6 verbunden werden wird RB7 High     
        do{
    	     if (RB7==0){
                   PORTA = 0b00000001;	    
             }
             else if (RB7==1){
                PORTA = 0b00000010; 
             }
       }while (1);     
    }//()

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.12.2005
    Ort
    Euskirchen-Großbüllesheim
    Alter
    74
    Beiträge
    2.063
    Die TRIS-Register sind in Register-Bank 1. In Assembler ist für mich das Umschalten der Registerbänke kein Problem, in C schon:

    Code:
    		bsf	STATUS,RP0	; Umschalten auf Bank 1
    
    		; TRIS-Register setzen
    
    		bcf	STATUS,RP0	; Zurück auf Bank 0
    MfG Karl-Heinz
    HobbyElektronik hier klicken ....

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.03.2005
    Ort
    Spanien
    Alter
    39
    Beiträge
    398
    @Kalledom
    Fanke für dein Antwort. Leider verstehe ich garnichts

    Was bedeutet Register Bank 1?. Welche ist seine Funktion? Warum muss man ihn Umschalten?
    Vieleicht komme ich dann ja weiter.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.05.2005
    Ort
    Wallis
    Beiträge
    137
    In Assembler gibt es verschiendene "Banken" in welchen sich diverse Register befinden. Je nach dem was man für ein Register bearbeiten will, muss man die Register-Bank wechseln....

    In C ist das aber nicht notwendig. Jedenfalls nicht beim CCS Compiler...

    MfG Benji

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.12.2005
    Ort
    Euskirchen-Großbüllesheim
    Alter
    74
    Beiträge
    2.063
    @Benji
    Ich darf Dich ein wenig korrigieren, die Registerbänke 0...3 haben nichts mit Assembler zu tun, die sind in den PICs so als 'Hardware' vorhanden.
    Da nur 8 Bits (= 256) zur Adressierung zu Verfügung stehen, die Register jedoch im Bereich 0...0x1FF liegen, sind 4 Bänke mit jeweils 128 Register eingerichtet worden.
    In Assembler ist wohl darauf zu achten, daß beim Zugriff auf ein Register auch die richtige Registerbank ausgewählt wurde; sonst wird auf ein anderes Register zugegriffen.
    Was bei C passiert, wenn z.B. TRISA = 0x00 da steht, ob dann automatisch auf die richtige Registerbank und wieder zurück geschaltet wird, entzieht sich meiner Kenntnis.
    MfG Karl-Heinz
    HobbyElektronik hier klicken ....

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.05.2005
    Ort
    Wallis
    Beiträge
    137
    Danke für die Korrektur. Stimmt

    Jedenfalls beim CCS Compiler wird automatisch die richtige Registerbank ausgewählt. Also braucht man sich in C um diese nicht zu kümmern.

    MfG

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.02.2006
    Alter
    60
    Beiträge
    114
    Wenn RB6 und RB7 verbunden sind, müsste dein Code eigentlich RA1 auf High setzen, weil RB7 dann auch 1 ist.
    Wenn die beiden nicht verbunden sind, hängt RB7 in der Luft. Er ist dann mit nichts verbunden. Das sollte nicht vorkommen. Ergebnis ist undefiniert.
    Bestenfalls sind die internen Pullup-Widerstände von Port B eingeschaltet, dann zieht der PIC den Eingang automatisch auf High, wenn er mit nichts verbunden ist. Was du in Port B reinschreibst (nämlich 00h) ist für PB7 völlig egal, weil das ein Eingang ist.

    Normalerweise macht man daher die Logik genau umgekehrt (nennt sich active-low):

    Der Port wird so eingestellt, dass die Pull-Ups aktiviert sind. Die Eingänge (und nur die) sind dann erstmal alle auf High. Der Ausgang (PB6) wird auf LOW gelegt. Wenn jetzt PB6 und PB7 verbunden werden, geht PB7 auch auf LOW. Das wird abgefragt.

    (Achtung: Schalter prellen. D. h. der Wert wechselt innerhalb weniger Millisekunden häufiger zwischen geschlossen und offen. Man fragt daher meistens längere Zeit ab und nimmt den letzten stabilen Wert.)
    Für dein Problem gibt es bestimmt viele Beispiele im Netz. Suche mal nach "microchip pic key matrix c" weil meistens mit dem Vorgehen eine Tastaturmatrix abgefragt wird.

    Gruß
    Phaidros

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.03.2005
    Ort
    Spanien
    Alter
    39
    Beiträge
    398
    Danke für eure Antworten.
    Dann werde ich es jetzt erst mal mit pull up Wiederständen versuchen.
    Falls das nicht funktioniert, dann halt mit der umgekehrten Logik.
    Werde auch nach Beispielen im Netz gucken.
    Ich werde mich dann in ein par Tagen noch mal melden und sagen ob es geklappt hat oder nicht.
    Tornado

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    24.01.2007
    Beiträge
    53
    Hallo Tornado...

    Wie ich sehe programmierst du den PIC 16F876 mit C...
    Funktioniert das bei dir gut, denn ich programmier den bis jetzt mittels Assembler und würde gerne mit C Anfangen und das wäre spitze wenn es mit diesem Typen funktionieren würde.

    Danke

    Michael

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus