mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt in Klasse


Autor: Christian Karle (christiankarle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe Community,


ich habe folgendes Problem:


Ich möchte eine Klasse konstruieren, in welcher eine Methode aufgerufen 
wird, welche einen Timer startet.

Innerhalb der Klasse, soll es dann eine Methode geben, welche beim 
Überlauf ausgeführt wird.

Meine Frage: Wie macht man das am Besten?

C++

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Interrupt Handle sind C-Funktionen und die lassen sich schwer in eine 
C++-Klasse unterbringen

Workarounds gibt es hier
http://www.mikrocontroller.net/articles/AVR_Interr...

Autor: Christian Karle (christiankarle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, vielen Dank

Noch eine Frage, ich habe eine Klasse, mit Namen Test.

Diese Klasse besitzt keinen Default Konstruktor.

Um ein Objekt dieser Klasse zu erzeugen müssen jeweils zwei Pinnamen 
übergeben werden.

Wenn ich nun ein Objekt der Testklasse in einer anderen Klasse erzeugen 
möchte und dabei die Pinnamen übergeben möchte, wie müsste das aussehen?

Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian K. schrieb:
> Wenn ich nun ein Objekt der Testklasse in einer anderen Klasse erzeugen
> möchte und dabei die Pinnamen übergeben möchte, wie müsste das aussehen?

einfach mit übergeben

//constructor
foo::foo( port, pin ) 
: bar( port, pin )
{
}

//oder mit festen parametern

//constructor
foo::foo() 
: bar( PORTA, PIN1 )
{
}


Autor: Christian Karle (christiankarle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include "DMX.h"
#include "mbed.h"

DMX dmx_interface;

int main ( void ) {

                                      //Application Code

    while ( 1 ) {

        dmx_interface.dmx.printf("Test");
    };
};



#ifndef DMX_H_
#define DMX_H_

#include "mbed.h"

class DMX {

    private:

        char dmx_data [ 512 ];

    public:

        DMX ( );
        ~ DMX ( );

        void dmx_interrupt ( void );

        Timer dmx_timer;
        Ticker dmx_ticker;

        Serial dmx ( PinName, PinName );
};

#endif



Frage: Wie weise ich Serial nun die Pins zu? Der Konstruktor benötigt 
zwei Pinnamen...

Autor: Christian Karle (christiankarle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fehler:


Error: A pointer to a bound function may only be used to call the 
function in "Main/Main.cpp", Line: 16, Col: 24

Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
[c]
class DMX {
    private:
        char dmx_data [ 512 ];
    public:
        DMX ( );
        ~ DMX ( );

        void dmx_interrupt ( void );
        Timer dmx_timer;
        Ticker dmx_ticker;
        Serial dmx;
};

DMX::DMX()
: Serial( PinName, PinName )
{ };

[c]

Autor: Christian Karle (christiankarle)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Liefert folgende Fehler:

Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian K. schrieb:
> Liefert folgende Fehler:

etwas mitmachen must du schon

Fehler
: Serial( PinName, PinName )

so müsste es sein
: dmx( PinName, PinName )


(dmx ist ein doofer namen für das Serial objekt)

Autor: Christian Karle (christiankarle)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ok, habe es abgeändert, macht natürlich Sinn.

Nun spuckt er mir allerdings den Fehler aus:

Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian K. schrieb:
> Nun spuckt er mir allerdings den Fehler aus:

du musst den Port und pin hinschreiben, oder deiner Klasse selber als 
Parameter mitgeben.

Und bitte mal den aktuellen code mit posten, damit alle auf dem gleichen 
Stand sind.

Autor: Der Andere (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Der lässt programmieren :-)

Autor: Christian Karle (christiankarle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#ifndef DMX_H_
#define DMX_H_

#include "mbed.h"

class DMX {

    private:

        char dmx_data [ 512 ];

    public:

        DMX ( );
        ~ DMX ( );

        void dmx_interrupt ( void );

        Timer dmx_timer;
        Ticker dmx_ticker;
        Serial dmx;
};

#endif



#include "DMX.h"
#include "Configuration.h"

DMX :: DMX ( ) : dmx ( PinName, PinName ) { };

DMX :: ~ DMX ( ) { };

void DMX :: dmx_interrupt ( ) {

}

Wie meinst Du das?

Autor: Christian Karle (christiankarle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin gerade erst dabei es zu lernen... Leider rennt man da oft gegen eine 
Wand...

Autor: Reginald Leonczuk (Firma: HS Ulm) (reggie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian K. schrieb:
> Bin gerade erst dabei es zu lernen... Leider rennt man da oft gegen eine
> Wand...
Du musst lernen solche Posts gekonnt zu ignorieren. Das kann wirklich 
Spaß machen ;D

Autor: c-hater (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian K. schrieb:

> Bin gerade erst dabei es zu lernen... Leider rennt man da oft gegen eine
> Wand...

Ja, klar. Jeder hat mal angefangen und mit Problemen zu kämpfen gehabt.

Aber: nur wenn man selber nachdenkt und selber versucht, die Fehler 
zu beseitigen, kann man Programmieren lernen. Genau genommen besteht 
"Programmieren lernen" sogar genau darin.

Autor: Eric B. (beric)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian K. schrieb:
> Ok, habe es abgeändert, macht natürlich Sinn.
>
> Nun spuckt er mir allerdings den Fehler aus:

PinName ist offensichtlich ein Typ oder eine Klasse. Du musst an der 
Stelle wo der Compiler meckert aber einen Wert von dieser Klasse als 
Parameter angeben. Vergleich sin(double) versus sin(3.14). Wie ein Wert 
von Typ PinName aussieht, findest du wahrscheinlich irgendwo in der 
Header-Datei "mbed.h".

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.