- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 21

Thema: 4 Eingänge als BCD auswerten?

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.01.2004
    Beiträge
    317

    4 Eingänge als BCD auswerten?

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    ich habe in meiner Schaltung die vier Eingänge PD5,PD6,PD7,PB0 mit einem BCD-Codierschalter belegt.
    Dabei entspricht PD5 -> 1, PD6 -> 2, PD7 -> 4, PB0 -> 8

    Nun habe ich mir folgende Funktion ausgedacht um dies auszuwerten und dann einfach im Hauptprogramm mit
    if (BCD() == 1)...
    abzufragen.

    Wo liegt denn bei meiner Funktion mein Denkfehler? Denn wenn ich versuche die Rückgabewerte abzufragen dann passiert nichts, also muss irgendein Fehler in meinem Ansatz liegen.

    Danke schon einmal für die Hilfe

    Code:
    int BCD(void)
    /*
     Diese Funktion werdtet die Stellung des BCD Schalters aus um im Programm eine 
     Umschaltung verschiedener Beleuchtungsmuster realisieren zu können 
    */
    {
    
     if ( (!(PIND & (1<<PIND5))) & (!(PIND & (1<<PIND6))) & (!(PIND & (1<<PIND7))) & (!(PINB & (1<<PINB0))) )
      {
       return 0;  
      }
      
     if ( (PIND & (1<<PIND5)) & (!(PIND & (1<<PIND6))) & (!(PIND & (1<<PIND7))) & (!(PINB & (1<<PINB0))) )
      {
       return 1;  
      } 
      
     if ( (!(PIND & (1<<PIND5))) & (PIND & (1<<PIND6)) & (!(PIND & (1<<PIND7))) & (!(PINB & (1<<PINB0))) )
      {
       return 2;  
      } 
      
     if ( (PIND & (1<<PIND5)) & (PIND & (1<<PIND6)) & (!(PIND & (1<<PIND7))) & (!(PINB & (1<<PINB0))) )
      {
       return 3;  
      }
     
     if ( (!(PIND & (1<<PIND5))) & (!(PIND & (1<<PIND6))) & (PIND & (1<<PIND7)) & (!(PINB & (1<<PINB0))) )
      {
       return 4;  
      } 
      
     if ( (PIND & (1<<PIND5)) & (!(PIND & (1<<PIND6))) & (PIND & (1<<PIND7)) & (!(PINB & (1<<PINB0))) )
      {
       return 5;  
      } 
      
     if ( (!(PIND & (1<<PIND5))) & (PIND & (1<<PIND6)) & (PIND & (1<<PIND7)) & (!(PINB & (1<<PINB0))) )
      {
       return 6;  
      } 
      
     if ( (PIND & (1<<PIND5)) & (PIND & (1<<PIND6)) & (PIND & (1<<PIND7)) & (!(PINB & (1<<PINB0))) )
      {
       return 7;  
      } 
      
     if ( (!(PIND & (1<<PIND5))) & (!(PIND & (1<<PIND6))) & (!(PIND & (1<<PIND7))) & (PINB & (1<<PINB0)) )
      {
       return 8;  
      }
      
     if ( (PIND & (1<<PIND5)) & (!(PIND & (1<<PIND6))) & (!(PIND & (1<<PIND7))) & (PINB & (1<<PINB0)) )
      {
       return 9;  
      } 
    
     return 0;
    }
    mfG Henry

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von darwin.nuernberg
    Registriert seit
    08.08.2004
    Ort
    A, A
    Alter
    59
    Beiträge
    1.305
    Blog-Einträge
    1
    Erst mal Hardware:
    Deine Pins am AVR sollten z.B. Pull-Up Widerstände haben, somit sind die schon mal HI.
    Die Schalter legen dann den Pin jewiels auf Masse (Low).

    Die beien Ports sind auf INPUT gesetzt?

    So wie es jetzt mit C Programmierung aussieht (Sorry) amer allgemein:
    Erst mal den Wert in Variablen übertragen (nicht die Port-Variablen verwenden)

    Ich gehe mal davon aus dass die Schalter offen sind (Eingaänge also HI)

    z.B. X und Y

    Dann musst Du die beiden unterscheidlichen Ports in einer Variable vereinen

    um ungewünschtes zu filtern erst mal mit AND

    erst mal X = port_D and 11100000 REM (D7, D6, D5)
    dann Y = port_B and 00000001 REM (B0)

    jetzt schiebst Du X um 4- Bit nach rechts REM = 00001110
    nun noch Y zu X verodern
    X = X OR Y REM = 00001111

    Nun hast Du den Wert in X stehen.


    Wie das ganze in C zu scheiben ist kannst Du dann bestimmt umsetzen.
    Gruss
    Darwin (meine Projekte sind auf meiner Pinnwand zu finden)

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.01.2004
    Beiträge
    317
    Hallo Darwin,

    danke erst einmal für die Antwort.

    Zur Hardware, meine Pins haben Pull-down Widerstände und sind selbstverständlich als Eingänge gesetzt.

    Was ich jetzt nicht verstehe ist REM und wie ich die Bits schiebe. Wenn Du mir da noch einen Tip geben könntest würde mir das helfen.
    mfG Henry

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von darwin.nuernberg
    Registriert seit
    08.08.2004
    Ort
    A, A
    Alter
    59
    Beiträge
    1.305
    Blog-Einträge
    1
    OK dann sind deine Schalter Mit VCC (HI) verbunden und schalten dieses Durch (oder eben nicht).

    REM heist REMARK uns ist ein Kommentar (und alles bis ans Zeilenende)

    Und In C kenn ich mich nicht aus.

    Such mal nach dem Befehl SHIFT oder wié das gemacht wird.


    PD5 -> 1, PD6 -> 2, PD7 -> 4, PB0 -> 8
    Ich habs mal in Bascom realisiert (evtl. hilft es Dir):
    Code:
    $crystal = 8000000                      ' Oszillator mit 8MHz
    $baud = 19200                           ' Seriell mit 19200, 8, N, 1, ohne Handshake
    $regfile = "m32def.dat"                 ' Der benutzte Processor
    
    $hwstack = 32                           ' default use 32 for the hardware stack
    $swstack = 10                           ' default use 10 for the SW stack
    $framesize = 40                         ' default use 40 for the frame space
    
    
    
    Dim X As Byte
    Dim Y As Byte
    Dim Result As Byte
    
    
    Config Portd = Input
    Config Portb = Input
    
    
    Hauptprogramm:                          ' void Main(void)
    Do
       X = Portd And &B11100000             ' Port in Variable und Filtern
       Y = Portb And &B00000001             ' Port in Variable und Filtern
    
       Shift X , Right , 4                  ' Bits 4x nach rechts schieben
    
       Result = X Or Y                      ' Die beiden Veriablen vereinen
    Loop
    
    End
    Klar könntest Du Dir auch eine Variable sparen, anstelle von Result könntest Du das Egebnis auch in X ablegen, das sieht dann so aus:

    Code:
       X = X Or Y                         ' Die beiden Veriablen vereinen
    PS Die Demo von Bascom kostet nichts und gibt unter http://www.mcselec.com
    Gruss
    Darwin (meine Projekte sind auf meiner Pinnwand zu finden)

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Hallo,
    Hoffentlich steigst Du noch durch in Deinem Programm
    PD5 -> 1, PD6 -> 2, PD7 -> 4, PB0 -> 8
    zuerst Beide Ports in zwei Variablen einlesen
    Code:
    var1 = PIND;
    var2 =  PINB;
    Jetzt die interessanten Pins holen
    Code:
    var1 &=((1<<PD5)|(1<<PD6)|(1<<PD7));
    var 2 &=(1<<PB0);
    Jetzt hast Du zwar Deine 4 Pins in den Variablen var1 und var 2 stehen, aber total durcheinander,
    Die 3 unteren Bits kannst schon mal um 5 Stellen nach rechts Shiften, dann stehen sie schon mal richtig:
    Code:
    var1 >>=5;
    Und da PB 0 für die Wertigkeit 8 steht,kann man die zwei Variablen nicht einfach verodern, sondern man muß schon eine if Abfrage starten:
    Code:
    if (var2)
        var1 |=(1<<3);
    Ungetestet, aber so müßte es klappen.

    Gruß Sebastian

    P.S.
    REM ist/war eine Musikgruppe
    Software is like s e x: its better when its free.
    Linus Torvald

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von darwin.nuernberg
    Registriert seit
    08.08.2004
    Ort
    A, A
    Alter
    59
    Beiträge
    1.305
    Blog-Einträge
    1
    Zitat Zitat von izaseba
    Hallo,
    Hoffentlich steigst Du noch durch in Deinem Programm
    P.S.
    REM ist/war eine Musikgruppe
    1. Wen/was meinst Du jetzt?
    2. REM ist ein Schlafzustand! (Rapid Eye Movement)
    Gruss
    Darwin (meine Projekte sind auf meiner Pinnwand zu finden)

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Naja, ich meine eigentlich das Programm des Fragestellers,
    sorry, hätte zitieren müssen.
    Wenn ich solche Konstrukte sehe,
    verstehe ich auch Leute, die meinen C wären Hieroglyphen
    und allen Basic aufs Auge drücken möchten
    @Henry,
    nicht böse sein

    Gruß Sebastian

    P.S. ich habe mir die Pinbelegung oben nochmal angeguckt, und habe kleine Änderung im Programm gemacht...
    Software is like s e x: its better when its free.
    Linus Torvald

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.01.2004
    Beiträge
    317
    Zitat Zitat von izaseba
    Hoffentlich steigst Du noch durch in Deinem Programm
    Zitat Zitat von izaseba
    @Henry,
    nicht böse sein
    Hallo Sebastian,

    ich find es auch etwas umständlich wie ich es gemacht habe und Übersichtlich ist es nicht
    Da ich C noch nicht so richtig kann und mich auch nur als (eines von vielen) Hobbys damit beschäftige, greife ich halt auf die Befehle die ich kenne zurück und bastel mir daraus meine gewünschte Funktion. Wie man sieht klappt das nicht immer
    Aber hier habe ich ja ein Forum gefunden wo mir geholfen wird und so klappt das dann meistens und ich lern auch was dazu.

    Eine Frage noch dazu. Das Ergebnis steht dann komplett in var1?

    Werd schon mal etwas damit expirimentieren.

    Danke

    PS
    Böse bin ich nicht, denn dein Ton war ja freundlich und Du hast ja auch einen Lösungsweg vorgeschlagen. (und deine Frage ist auch noch berechtigt )
    Ich mag es nur nicht wenn jemand schreibt "Blöde Frage..." und selber aber nicht darauf antworden will. Wem was nicht passt an der Fragestellung, der braucht ja nicht drauf zu antworten. Man liest ja öfter so antworten wo blöde Sprüche kommen aber nicht auf die Frage eingegangen wird und das hilft natürlich niemandem.
    mfG Henry

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.01.2004
    Beiträge
    317
    Hallo Sebastian,

    ich habe gerade mal deinen Lösungsweg in meine Schaltung geladen und es funktioniert auf jeden fall erst einmal in den ersten beiden Schalterstellungen. Ich denke es wird auch mit den anderen dann klappen.

    Und als schöner nebenefekt ist das Programm auch noch um 2-3% kleiner geworden.

    Danke euch beiden noch einmal für die Hilfe
    mfG Henry

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Hallo Henry,
    schön, daß es klappt, wie gesagt hab ich es nicht getestet und nochmals ändern müssen, ich dachte zuerst, daß PB0 für Bit 0 steht
    Und ja, das Ergebnis steht in var1.
    Man könnte ganz ohne var 2 auskommen, und zwar anstatt
    Code:
    if (var2) 
        var1 |=(1<<3);
    Code:
    if (PINB & (1<<PB0))
        var1 |=(1<<3);
    schreiben.
    damit hätte man noch ein paar Zeilen eingespart.
    zum Testen und Probieren, versuche ich zuerst manche Sachen am PC, beim Linux ist GCC ja schon Onboard und für Windows gibt es auch gute Lösungen, wie Cygwin oder wenn man eine GUI haben muß devc++ oder Code::Blocks, das ist auf jedem Fall besser, als das Programm immer Flashen zu müssen, um zu schauen, ob es auch richtig klappt.

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad