Seite 7 von 7 ErsteErste 1234567
Ergebnis 91 bis 97 von 97
Like Tree1Likes

Thema: für xorg1990

  1. #91
    Avatar von xorg1990
    xorg1990 ist offline König
    registriert
    19-12-2013
    Beiträge
    765

    AW: für xorg1990

    Zitat Zitat von tsseh
    dann würde die klasse auch nicht funktionieren. du meinst die funktionieren nicht wie normale INT0-n? ja! der einzige externe interrupt beim tiny, INT0, liegt auf PB2.
    Ja das weiß ich, die attachInterrupt Funktion funktioniert nur mit dem INT0-n Pins. Meinte die PCINT Pins also die Pin Change Interrupts funktionieren nicht

    Folgende kleine Script geht nicht:
    Code:
    void setup() {
       pinMode(4, OUTPUT);
      pinMode(2, INPUT_PULLUP);
      cli();
      GIMSK |= (1 << PCIE);   // pin change interrupt enable
      PCMSK |= (1 << PCINT2); // pin change interrupt enabled for PCINT2
      sei();
      digitalWrite(4, HIGH);
     }
    
    ISR(PCINT2_vect){
      digitalWrite(4, !digitalRead(4));
    }
    
    
    void loop() {
     
    }
    Noch eine Kleien Frage, kann ich ein Register in einer Variable speicher und dann wider auslesen z.B:
    byte adcCopy = ADCSRA; und dann ADCSRA = adcCopy.

  2. #92
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.578

    AW: für xorg1990

    Zitat Zitat von xorg1990 Beitrag anzeigen
    Folgende kleine Script geht nicht:
    und woran merkst du das? das geht allerdings wahnsinnig schnell, da du pin4 gleich wieder änderst.
    und pin4 muss dann auch PCINT2, also PB2 sein. ist das so? kannst ja mal PCMSK |= (1 << PCINT2); in PCMSK |= (1 << PCINT0) | (1 << PCINT1) | (1 << PCINT2) | (1 << PCINT3) | (1 << PCINT4) | (1 << PCINT5); ändern um sicherzugehen

    Zitat Zitat von xorg1990 Beitrag anzeigen
    Noch eine Kleien Frage, kann ich ein Register in einer Variable speicher und dann wider auslesen z.B:
    byte adcCopy = ADCSRA; und dann ADCSRA = adcCopy.
    ja, natürlich

  3. #93
    Avatar von xorg1990
    xorg1990 ist offline König
    registriert
    19-12-2013
    Beiträge
    765

    AW: für xorg1990

    Zitat Zitat von tsseh
    und woran merkst du das? das geht allerdings wahnsinnig schnell, da du pin4 gleich wieder änderst.
    Naja an PB4 Hängt 'ne LED und jedes mal wenn ein Pin change auf PB2 Auftritt müsste die LED Aus und An gehen. Es Passiert einfach Nüscht.
    Und Wieso soll das Schnell gehen? Wenn ich den mc einschalte, hängt PB2 via KABEL an GND, stecke ich das Kabel an + Müsste der Pin Change auftreten.


    Zitat Zitat von tsseh
    ja, natürlich
    supi, dann kann ich den code nochmal Übersichtlicher gestalten.

  4. #94
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.578

    AW: für xorg1990

    Zitat Zitat von xorg1990 Beitrag anzeigen
    müsste die LED Aus und An gehen.
    an ODER aus

    Zitat Zitat von xorg1990 Beitrag anzeigen
    Und Wieso soll das Schnell gehen?
    weil ich vermutet habe pin 4 ist PB2. und du wechselst bei jedem int den level von pin 4
    machst du aber anscheinend nicht, sondern pin 2 ist PB2 und du änderst das level händisch durch ein kabel auf GND

    Zitat Zitat von xorg1990 Beitrag anzeigen
    stecke ich das Kabel an + Müsste der Pin Change auftreten.
    AB und AN, steckst du das Kabel ab müsste der Pin Change auftreten steckst du es wieder an GND ein weiterer

  5. #95
    Avatar von xorg1990
    xorg1990 ist offline König
    registriert
    19-12-2013
    Beiträge
    765

    AW: für xorg1990

    Zitat Zitat von tsseh
    an ODER aus
    Meinte ich doch.
    Zitat Zitat von tsseh
    sondern pin 2 ist PB2 und du änderst das level händisch durch ein kabel auf GND
    So ist es.

    Habe das Problem gefunden die ISR ist falsch es heißt ISR(PCINT0_vect)
    Innerhalb der isr muss man dann feststellen das der int vom richtigen Pin kam.
    Code:
    uint8_t pinOld;
    void setup() {
       pinMode(4, OUTPUT);
      pinMode(3, INPUT_PULLUP);
      cli();
      GIMSK |= 1<<PCIE;                            // Enable Pin Change Interrupt
      PCMSK |= 1<<PCINT3;                          // Watch for Pin Change (Falling) on D2 (PB2)
      sei();
      digitalWrite(4, HIGH);
     }
    
    ISR(PCINT0_vect){
       uint8_t pinNow = PINB;
      uint8_t diff = pinNow ^ pinOld;
       if( diff & (1<<PB3)){
          digitalWrite(4, !digitalRead(4));
       }
       pinOld = pinNow;   // für den nächsten Interrupt merken
    }
    
    
    void loop() {
     
    }

  6. #96
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.578

    AW: für xorg1990

    Zitat Zitat von xorg1990 Beitrag anzeigen
    Innerhalb der isr muss man dann feststellen das der int vom richtigen Pin kam.
    das kannst du dir spaaren, das brauchst du nur, wenn du mehrere ints an verschiedenen pins unterscheiden musst.
    da du aber nur einen, PCINT2 bzw. jetzt PCINT3, enabled hast, kann der int nur von diesem einen pin ausgelöst werden.

    - - - Aktualisiert - - -

    Zitat Zitat von xorg1990 Beitrag anzeigen
    Habe das Problem gefunden die ISR ist falsch es heißt ISR(PCINT0_vect)
    kam da nicht ein compilerfehler, "PCINT2_vect not defined"?

    - - - Aktualisiert - - -

    für den attiny85 ist nur PCINT0_vect definiert, es sollte also ein compilerfehler kommen

    - - - Aktualisiert - - -

    ok, doch nicht das makro ISR macht nur eine functiondeklaration, wenn PCINT2_vect nicht definiert ist, wird einfach eine funktion PCINT2_vect erzeugt.

  7. #97
    Avatar von xorg1990
    xorg1990 ist offline König
    registriert
    19-12-2013
    Beiträge
    765

    AW: für xorg1990

    Zitat Zitat von tsseh
    ok, doch nicht das makro ISR macht nur eine functiondeklaration, wenn PCINT2_vect nicht definiert ist, wird einfach eine funktion PCINT2_vect erzeugt.
    Aber das ist doch total unsinnig.

Seite 7 von 7 ErsteErste 1234567

Lesezeichen

Berechtigungen

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