- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 3 von 3

Thema: Port als Variable in Klasse verwenden (C++ Atmel Studio 6.2)?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    22.05.2012
    Ort
    Hannover
    Alter
    31
    Beiträge
    11

    Frage Port als Variable in Klasse verwenden (C++ Atmel Studio 6.2)?

    Anzeige

    Praxistest und DIY Projekte
    Schönen guten Abend,

    ich habe ein kleines Problem beim erstellen einer Bibliothek für meine AVR Projekte und zwar hatte ich vor mir in C++ eine Bibliothek zu schreiben mit allen wichtigen Funktionen die ich wieder verwenden werde. Anfangen wollte ich, da es sich grade gut angeboten hat, mit einer Testfunktion um ein Schieberegister (74HC595) anzusteuern. Hierfür habe ich erst einmal eine Klasse und zwei Funktionen erstellt (eine zum initialisieren und eben eine zum übertragen von 8bit). Die Init-Funktion erhält als Parameter 4 Pins (ser, sck, scl und rck) und eine Port-Variable (volatile uint8_t *), die Write-Funktion bekommt dann nur die 8bit Daten die übertragen werden sollen. An sich macht die Init-Funktion so keine Probleme allerdings muss ich die Port-Variable irgendwie speichern können damit meine Write-Funktion diesen ebenfalls benutzen kann. Die Klassenvariable (in der die Port-Variable gespeichert werden soll) ist ebenfalls vom Typ volatile uint8_t *, dennoch wird diese nicht übernommen. Hier mal ein Beispiel:

    Das funktioniert:


    Code:
    void SR_Init(volatile uint8_t *sr_ddr, volatile uint8_t *sr_port, uint8_t sr_ser, uint8_t sr_sck, uint8_t sr_scl, uint8_t sr_rck) {
    	
    	*sr_ddr |= ((1<<sr_ser)|(1<<sr_sck)|(1<<sr_rck)|(1<<sr_scl));
    	
    	*sr_port &= ~(1<<sr_ser);
    	*sr_port &= ~(1<<sr_sck);
    	*sr_port &= ~(1<<sr_rck);
    	*sr_port &= ~(1<<sr_scl);
    	
    	*sr_port |=  (1<<sr_scl);
    }


    Das hier schon nicht mehr:


    Code:
    void SR_Init(volatile uint8_t *sr_ddr, volatile uint8_t *sr_port, uint8_t sr_ser, uint8_t sr_sck, uint8_t sr_scl, uint8_t sr_rck) {
    	*SR_DDRk	= *sr_ddr;
    	*SR_PORTk	= *sr_port;
    	
    	*SR_DDRk |= ((1<<sr_ser)|(1<<sr_sck)|(1<<sr_rck)|(1<<sr_scl));
    	
    	*SR_PORTk &= ~(1<<sr_ser);
    	*SR_PORTk &= ~(1<<sr_sck);
    	*SR_PORTk &= ~(1<<sr_rck);
    	*SR_PORTk &= ~(1<<sr_scl);
    	
    	*SR_PORTk |=  (1<<sr_scl);
    }
    Aufgerufen wird die Funktion dann über:


    Code:
    SR_Init(&DDRD, &PORTD, PD0, PD1, PD2, PD3);
    Hat zufällig jemand eine Lösung für mich, falls es dafür eine Lösung gibt? Ich könnte natürlich auch der Write-Funktion noch die Port-Variable als Parameter hinzufügen aber besser wäre es wenn es so gehen würde dass die nur einmal gesetzt werden muss (über die Init-Funktion).

    MfG Jawaiica

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    707
    Hallo,

    auch wenn ich nicht mit AVR-Studio arbeite, vielleicht schon mal ein paar Hinweise.

    Wenn Du schon mit einer Klasse arbeitest, kannst Du Dinge wie den Port als Membervariable der Klasse anlegen und diese im Konstruktor initialisieren. Die Init-Funktion kann dann eigentlich entfallen, diese Arbeit kann der Konstruktor übernehmen. Eine Write Funktion wäre dann eine Memberfunktion der Klasse und braucht gar nicht mehr so viele Parameter.

    Bevor ich mir irgendwelche Beispiele aus den Fingern sauge, hier einfach Verweise auf ähnlichen Code für andere Controller:

    Eine Klasse als Verpackung einer SPI-Schnittstelle
    https://developer.mbed.org/handbook/SPI

    Etwas effizienter sind Template-Parameter, wie hier bei einer Klasse für IOs
    https://developer.mbed.org/users/Sis...7b2b3/FastIO.h

    - - - Aktualisiert - - -

    Hier als Ergänzung das Grundprinzip als Visual Studio Program

    Code:
    #include "stdafx.h"
    
    class A
    {
    private:
    
      volatile uint8_t* m_Port;
    
    public:
    
      A(uint8_t* p) : m_Port(p)
      {}
    
      void Write(uint8_t v)
      {
        *m_Port = v;
      }
    };
    
    template<typename T, volatile T* port>
    class B
    {
    public:
    
      void Write(T v)
      {
        *port = v;
      }
    };
    
    uint8_t x;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
      A a(&x);
    
      B<uint8_t, &x> b;
    
      a.Write(1);
      b.Write(2);
    
      return 0;
    }

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    22.05.2012
    Ort
    Hannover
    Alter
    31
    Beiträge
    11
    Schönen guten Morgen,

    vielen Dank für die Antwort, so werde ich aber mehrere Klassen erstellen müssen (Außer ich mache eine Klasse und x Konstruktoren für unterschiedliche Sachen was aber nicht so toll wäre). Sollte es keine andere Lösung dazu geben werde ich das dann so machen. Danke für die Hilfe Mxt.

    MfG Jawaiica

Ähnliche Themen

  1. Luxuslimousine: S-Klasse als Plug-in Hybrid mit 2,8 Litern Verbrauch
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 16.09.2014, 08:00
  2. [ERLEDIGT] ISP-Anschluss als Port verwenden?
    Von ijjiij im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 12.01.2012, 07:45
  3. Port gleichzeitig als Eingang / Ausgang verwenden?
    Von squelver im Forum C - Programmierung (GCC u.a.)
    Antworten: 10
    Letzter Beitrag: 12.09.2008, 17:00
  4. PB6 am Mega8 als normalen I/O PORT verwenden?
    Von MartinFunk im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 06.01.2007, 11:35
  5. Welchen Port kann ich als PWM-Port benutzen?
    Von Zeroeightfifteen im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 26.12.2005, 13:01

Berechtigungen

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

12V Akku bauen