-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Anfänger-Problem mit Eingangsabfrage

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    29.07.2009
    Beiträge
    20

    Anfänger-Problem mit Eingangsabfrage

    Anzeige

    Hallo zusammen,
    Ich habe leider schon wieder ein Problem. Ich versuche den Status eines Eingangs abzufragen, aber das will nicht so klappen.

    Ich möchte testweise in einer Endlosschleife einen Eingang abfragen, und falls dieser gesetzt ist, eine Aktion durchführen

    Das Problem: Wenn ich den Status des Eingangs verändere und danach den Controller "resete", funktioniert es, den Ausgang auf High/Low zu setzen aber nicht im Verlauf des Programms. Hab auch schon verschiedene Endlosschleifen versucht. Alles nichts genützt.

    Hier mein Program:
    #include "asuro.h"
    #include <avr/io.h>
    #include "iom8.h"
    #include <stdlib.h>
    #include <avr/delay.h>
    #include <inttypes.h>

    int main(void)
    {

    DDRD = 0xff;
    DDRB = 0x00; //PB als EIngang
    PORTB = 0xff; //internen PULL-UP einschalten
    while (1) {
    if (PINB & (1<<PINB0))
    PORTD = (1<<PD3);
    }
    }

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    29
    Beiträge
    4.544
    if (PINB & (1<<PINB0))
    Probier es mit einer While Schleife
    while (PINB & (1<<PINB0)) PORTD = (1<<PD3);
    oder
    while (PINB & (1<<PB0)) PORTD = (1<<PD3);

    Das 2te sollte funktionieren. So haben wir es in der Schule gemacht.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    Du sollst die Headerfiles unter "ioXXXX.h" nicht includen, also insbesondere nicht ""iom8.h" - das erledigt <avr/io.h> automatisch für dich.

    Ob da noch irgendwelche andere C-Fallstricke versteckt sind, kann ich jetzt aufs erste nicht erkennen ...

    mfG
    Markus

    Edit: Punkt zwei wurde gestrichen, weil grob falsch ...

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    29.07.2009
    Beiträge
    20
    Habe jetzt ioXXXX.h entfernt und die Schleifen so nachgebaut wie 021aet04 gesagt hat, leider ohne Erfolg bzw mit Reseten gehts wieder aber nicht während dem Betrieb. Gibt es noch andere Gründe, an denen es liegen kann?

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551

    Re: Anfänger-Problem mit Eingangsabfrage

    Zitat Zitat von fuxx
    ... Status eines Eingangs abzufragen ... will nicht so klappen
    Die fehlerhafte Aktion mit der ioXXXX.h hat markusj schon beanstandet. Daher wundert es mich, dass Dein Compiler das korrekt übersetzt. Hast Du beim Hexfile schon aufs Datum geschaut? Ob das nicht einer ist, der früher mal erstellt wurde (<< ist ein beliebter Fehler, tritt bei mir öfters nach Mitternacht auf *ggg*).

    Der folgende Code (-schnipsel) läuft bei mir mit ähnlichen Portinitialisierungen auf (m)einem mega168.

    Code:
    // Pins/Ports als Ein- (0) oder Ausgänge (1) konfigurieren, Pull Ups (1) aktivieren
    //   A = Ausgang, E = Eingang ohne , EU = Eingang MIT PullUp
      DDRB  = 0b10011111;   // siehe aktuell oben oder Fortschritt/R2D2
      PORTB = 0b01100000;   //    und Port/Pull Ups (1)  aktivieren
    . . . . . . . 
    // =================================================================================
    . . . . . . .
    /*  while (1)
      { if ( ! (PINB & (1 << PINB5)) )      // Taste abfragen auf SCK 
          { PORTC |=  (1<<PC4); }   // LED auf PC4/MISO einschalten
        else
          { PORTC &= ~(1<<PC4); }   // LED auf PC4/MISO ausschalten
    oder:    if ( PIND & ( 1<<PIND2 ) );      // mache was wenn PinD2 High ist
      }                              
      */
    Übrigens: geposteter Code sieht viel besser aus, wenn man ihn in [Code]-Tags packt.

    Viel Erfolg.
    Ciao sagt der JoeamBerg

  6. #6
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    47
    Beiträge
    497
    Die Frage ist, was du als Ergebnis haben willst.

    Wenn sich der Zustand des Ausgangs mit dem Zustand des Eingangs ändern soll, dann musst du auch den Ausgang wieder zurück setzen.

    Das ist bei Joe's Codeschnipsel gut zu sehen.

    Bisher hattest du nur einmal den Ausgang gesetzt und dann passiert natürlich auch nichts mehr wenn PB0 nicht 1 ist. Der Ausgang setzt sich nicht allein zurück.

    sast

    雅思特史特芬
    开发及研究

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    Zitat Zitat von sast
    Wenn sich der Zustand des Ausgangs mit dem Zustand des Eingangs ändern soll, dann musst du auch den Ausgang wieder zurück setzen
    Damn, du hast recht - hatte ich zuerst auch in meinem Beitrag angekreidet und dann in einem Anfall geistiger Umnachtung wieder rausgenommen ...

    @fuxx: Der zweite Teil deiner Fallunterscheidung fehlt - du setzt zwar den Ausgang auf High, aber wenn die Fallunterscheidung "false" ergibt, tust du genau - nichts, wie du beobachtet hast.

    Korrigiert sähe es etwa so aus:
    Code:
    #include "asuro.h"
    #include <avr/io.h>
    #include <stdlib.h>
    #include <avr/delay.h>
    #include <inttypes.h>
    
    int main(void) {
         DDRD = 0xff;
         DDRB = 0x00; //PB als EIngang
         PORTB = 0xff; //internen PULL-UP einschalten
         while (1) {
              if (PINB & (1<<PINB0)) {
                   PORTD = (1<<PD3);
              } else {
                   PORTD = 0x00;
              }
        }
    }
    mfG
    Markus

    Edit: Nachtrag, die Variante mit der Schleife ist ziemlicher Käse, solange wie die Bedingung erfüllt ist, rennt das Teil im Kreis - wenn du noch was anderes tun willst, gute Nacht ...

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551
    Hi,

    EINE Frage wäre natürlich noch zu stellen, sie ist hardwareorientiert: Wird der Tastenpin wirklich auf GND gezogen? Nichts für ungut, dass ich das frage. Ansonsten - bekomme ich nur riesige Nebenwirkungen (Bauch- Augen- und Kopfschmerzen) bei so waghalsiger Klammernsetzung wie eben. Aber ich bin eben noch ziemlicher Anfänger in C.
    Ciao sagt der JoeamBerg

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    Zitat Zitat von oberallgeier
    Ansonsten - bekomme ich nur riesige Nebenwirkungen (Bauch- Augen- und Kopfschmerzen) bei so waghalsiger Klammernsetzung wie eben. Aber ich bin eben noch ziemlicher Anfänger in C.
    Darf ich fragen, bei wem die Klammersetzung waghalsig ist?
    Die Klammersetzung ist auch teilweise Geschmackssacke, es lohnt sich, einen einheitlichen Stil für sich selbst zu finden, ich bin inzwischen (Universitär begründet) bei einem Stil der den Java Code Conventions folgt angekommen.
    Editoren mit Auto-Formatter sind da etwas feines ...

    mfG
    Markus

  10. #10
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551
    Zitat Zitat von markusj
    ... Klammersetzung ist auch teilweise Geschmackssacke ... ich bin inzwischen (Universitär begründet) ...
    Ok, ich nehme alles zurück. Bin nur ein Simpel von hinterm Wald. Mit entsprechend simplem Geschmack.
    Ciao sagt der JoeamBerg

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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