- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 26 von 26

Thema: Port Pins als Ein- und Ausgänge

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

    Schaltplan und code

    Anzeige

    Powerstation Test
    So, hier ist der Schaltplan. Ich hatte leider nur Paint zur Hand 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
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken schaltplan_222.jpg  

  2. #22
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.02.2006
    Alter
    60
    Beiträge
    114
    Du musst noch die PortA Pins als digital definieren, also ADCON1=6.
    Sonst sind das analoge Eingangspins für den A/D-Converter.

  3. #23
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.02.2006
    Alter
    60
    Beiträge
    114
    Der zweite Fehler ist :

    TRISB = 0x00011111;

    NEIN! Nicht 0x..., du meinst 0b...!

  4. #24
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.03.2005
    Ort
    Spanien
    Alter
    40
    Beiträge
    398
    Ok, danke. Ich habe das korriegiert.

    Ich werde diese Woche dann den fertigen code posten. Kann ja vieleicht noch jemanden anderen nützlich sein.

  5. #25
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.02.2006
    Alter
    60
    Beiträge
    114
    Freut mich, wenn es funktioniert.

    Gruß
    Phaidros

  6. #26
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.03.2005
    Ort
    Spanien
    Alter
    40
    Beiträge
    398

    Fertig

    So, hier ist der fertige und korrigierte Code.

    Die 3x4 Tastatur kann man wie im Schaltplan anschliessen.

    Ich habe das Programm so geschrieben, dass der PIC zwichen den Tasten 1, 2 und 3 und den Zeilen 2, 3 und 4 unterscheiden kann.
    Ich brauche halt nicht alle 12 Tasten.
    Wer sie doch braucht, muss nur den Code der ersten Zeile Kopieren und die Pins ändern.

    Der Code ist schwar nicht sehr "sauber", aber ich hoffe man kann ihn verstehen und es nützt ja vieleicht auch noch jemanden der auch eine Tastatur an einen PIC anschliessen will.

    Code:
    #include <pic1687x.h>
    #define PORTBIT(adr, bit)	((unsigned)(&adr)*8+(bit))
    //-------------------------------------------------------------------------
    
    unsigned int zahl;		
    
    void main (void) 
    { 
        ADCON1=6; // PortA Pins als digital definiert 
        TRISA = 0x00;             //Port A  = Ausgang mit LEDs
        TRISB = 0b00011111;       //RB0 - RB4 = Eingänge, RB5 - RB7 = Ausgänge 
                                  //RB0 brauchen wir im Moment nicht
        PORTA = 0b00000000;
        PORTB = 0b00011110;       // RB5-RB7 auf Low  und RB1-RB4 auf High
                                 //RB1 - RB4 auch mit Pull-up Wiederständen auf High
    //--------------------------------------------------------------------------------                                                                                                  
    //  3x4 Matrix  Tastatur 
        do{   
          zahl=0; 
          if (RB1 == 0){  // 1, 2 oder 3.  RB5-7 werden nacheinander auf 
                                //High  gesetzt          
                   
                     
                   RB5=1;                   
                   if (RB1==1){             //Taste=1
                       zahl=zahl+1; 
                       RB5=0;   
                   }              
                   else{
                       RB5=0;
                       RB6=1;
                       if (RB1==1){         //Taste=2
                           zahl=zahl+2; 
                           RB6=0;    
                       }
                       else{
                           RB6=0;
                           RB7=1;
                           if (RB1==1){     //Taste=3
                               zahl=zahl+3;
                               RB7=0;
                           } 
                       }   
                   }    
            } //if (RB1==0)
            else if (RB2 == 0){     // 4, 5 oder 6  
                zahl=3;             // hier kann man den selben Code wie bei den 
                                       //Tasten 1-3 schreiben
                zahl=3+1;           //nur RB1 durch RB2 ersetzen  usw.
            }               
            else if (RB3 == 0){    // 7, 8 oder 9   das selbe wie eben 
                zahl=6;
                zahl=6+1;
            }
            else if (RB4 == 0){        //#, 0 oder *    
                zahl=10;               //10 ist eigendlich 0
            }                 
            else {                    
                PORTA = 0b00000000;   
            }  
           
           for(j=0;j<2;j++){  // wenn j=2, dann muss resetet werden um eine 
            //andere Zahl zu drücken
                              // Schutz vor nicht gewollter Tasten-Eingabe 
               
                  if (zahl==1){
                      PORTA = 0b00000001;    //An dieser Stelle könnte auch ein 
                                                          //Unterprogramm starten. 
                  }
                  else if (zahl==2){
                      PORTA = 0b00000010;  
                  }
                  else if (zahl==3){
                      PORTA = 0b00000011;  
                  }
                  else if (zahl==4){//der Code müsste geändert werden. Im 
                          //Moment würde er das hier
                      PORTA = 0b00000100;  //Für die Tasten 4,5 und 6 ausgeben.
                  }    
                  else if (zahl==7){
                      PORTA = 0b00001001;  
                  }
                  else if (zahl==10){
                      PORTA = 0b00001010;  
                  }
                  else{
                  PORTA = 0b00000000; 
                  }              
           }
           //zahl=0;
                                                                        
       }while (1);                    //immer wiederholen 
    }//()
    Viele Grüsse und noch mal Danke an alle die geholfen haben,
    Tornado

Seite 3 von 3 ErsteErste 123

Berechtigungen

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

Labornetzteil AliExpress