-
        

Ergebnis 1 bis 10 von 10

Thema: Portsignale verwerten

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    07.07.2005
    Beiträge
    13

    Portsignale verwerten

    Anzeige

    Hu,

    so, nochmal ich

    Ich bekomm, da ich ja nun meinen Port B auf empfang schalten kann, dort folgendes Signal herein:

    PB4 sagt an ob Informationen da sind, die verwertet werden können oder nicht.

    PB0 bis PB3 "codieren" die information. das heißt bei ihnen bekomme ich immer solche muster rein:

    0100
    1001
    0110
    1010

    etc. pp.
    jede reihenfolge steht für eine andere information.
    wie werte ich das jetzt programmiertechnisch aus ? kann ich einfach fragen if(PB0=1){ ...
    und dann auch so nach dem rest oder ist das komplizierter ?
    Am Ende möchte ich es so haben, dass, immer wenn PB4 nen high pegel hat, die informationen der anderen PB0-PB3 ausgelesen werden und ich dann eine aktion anschließen kann. wie sieht das ungefähr aus und wie mache ich das am besten ?

    Dankeschön für eure Hilfe.

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Naja, könnte sein:
    Code:
      if (PINB & (1<<PB4))   // pin 4 high ?
      {
            switch (PINB & 0x0F)    // PB0-3 maskieren
           {
           case 4:      // 0100
                ...
               break;
           case 9:      // 1001
                ...
               break;
           case 6:      // 0110
                ...
               break;
           case 10:      // 1010
                ...
               break;
           }
      }
    die punkte stehen für eine aktion

    Hilft das ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    07.07.2005
    Beiträge
    13
    hmm, klappt nix.
    hab die vermutung dass bei portb garnix reinkommt.
    habs mal mit dem code versucht:

    Code:
    unsigned char i;
    unsigned char x;
    
    
    sens_setLED(0,1);
    sens_setLED(1,1);
    
    
    i=PINB;
    
    
    while (20<40){
    x=PINB;
    
    
    if (i!=x)   // pin 4 high ?
      {
    
    
    
    sens_setLED(0,0);
    sens_setLED(1,1);
    
    
    }}
    um zu schauen ob sich auf PINB oder PORTB (hab beides schon versucht) überhaupt was ändert. aber anscheinend passiert nix. lichter bleiben beide an gibt es noch irgendeine möglichkeit nachzuschauen ob das auf B überhaupt was ankommt ?

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Zitat Zitat von Bonestruca
    hmm, klappt nix.
    hab die vermutung dass bei portb garnix reinkommt.
    ....
    um zu schauen ob sich auf PINB oder PORTB (hab beides schon versucht)....
    da muss ich doch erstmal fragen, ist der Port auf Eingang eingestellt (DDRB) ?
    Dann muss mit lesen von PINB auch was zu sehen sein, und interne Pullups de-/aktivieren (mit PORTB).

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    07.07.2005
    Beiträge
    13
    man hat mir gesagt dieser port sei automatisch auf eingang geschaltet. ich hab nämlich außerdem ein dummes problem. ich habe 2 compiler, benutze ich compiler und AVR libraries nr 1. kann ich den portb nicht auf eingang schalten weil kommt: invalid lvalue. bei compiler und AVR library nr.2 klappt das prima. jedoch bekomme ich hier immer diese fehlermeldung:
    undefined reference to 'sbi'
    undefined reference to 'cbi'

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    07.07.2005
    Beiträge
    13
    so, das mit den undefined references hab ich in den griff bekommen und den portb auf eingang geschaltet.

    ich benutze jetzt folgenden code, und trotzdem bleiben beide led's an.

    Code:
    DDRB = 0xFF;
    
    uint8_t i;
    uint8_t x;
    
    sens_setLED(0,1);
    sens_setLED(1,1);
    
    i=PINB;
    
    while (20<40){
    x=PINB;
    
    if (i!=x)   // hat sich was geändert ?
      {
    
    sens_setLED(0,0);
    sens_setLED(1,1);
    
    }}
    wo könnte da ein fehler drin liegen ? oder besser, wie kann ich anhand 2 led's die ich ansteuern kann prüfen ob auf portb was ankommt ? gibt es noch eine andre methode als jene stupide, die ich oben verwende ? und wenn ja, wie schaut der code ?

    danke, danke, danke, danke für eure hilfe.

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.11.2003
    Beiträge
    991
    Zitat Zitat von Bonestruca
    so, das mit den undefined references hab ich in den griff bekommen und den portb auf eingang geschaltet.
    ...
    DDRB = 0xFF;
    Nein! Port B ist bei dir ein Ausgang. Dann ließt du mit Pin B nur den Zustand des Registers PORTB!

    Code:
    DDRB = 0x00;
    Wäre da wesentlich besser

    Was soll den die komische while Schleife ?? 20<40 ist doch immer erfüllt. Da kannst du doch gleich while(1) schreiben.

    MfG Kjion

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Mit
    DDRB = 0xFF;
    setzt man das Port auf OUTPUT
    DDRB = 0x00;
    wäre input
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    07.07.2005
    Beiträge
    13
    ok, super, jetzt empfang ich was auf dem port b.
    wie frage ich jetzt aber ab ob die einzelnen dinger von PB0 bis PB4 was empfangen ?

    reicht es da wenn ich schreib
    if(PB0==1){ ....

    oder wie mache ich das ?
    danke !

    // EDIT //

    Hab das jetzt mal so geschrieben:

    sens_setLED(1,1);

    while(1){
    if ( PINB & (1<<PINB0) ) {
    sens_setLED(1,0);
    }

    wenn pinb0 also logisch auf 1 gesetzt ist geht die lampe aus. so, habs gleich ausprobiert, die led geht aber schon aus bevor ich irgendwas sende. sofort, zack. gleiches spiel mit den andren PB0 bis PB4, was hab ich jetzt schon wieder falsch gemacht ?

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    07.07.2005
    Beiträge
    13
    problem behoben, ich hatte den roboter die ganze zeit am kabel des Pc's gelassen und das hat da irgendwie alles durcheinander gebracht. entstöpselt und nu gehts

Berechtigungen

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