www.mikrocontroller.net

Forum: Compiler & IDEs Port/Pin in struktur aufnehmen


Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo!

Ich habe ein kleines Problem damit, den Pin eines Portes in eine 
Struktur zu übernehmen.
Aufhänger ist es, Leds, Weichen, o.ä als Array einer Struktur zu 
schreiben. Größe soll beliebig sein. Sprich ich initialisiere x-mal eine 
Struktur mit entsprechendem Zeitverhalten und zugehörigem Port/Pin, 
ändere einen define NUMBER und die isr verarbeitet alle vorhandenen 
Einheiten. Frage ist : welchen Typ hat ein Port wenn ich quasi die 
Adresse direkt verwende?

also konkreter:
typedef struct TSignale
{
  char    counter;  //dec in isr. Toggeln wenn Null  
  char    defaultCounter;  //Nach Togglen initialisieren

  portTyp port;
  pinTyp  pin; //??HIER DAS PROBLEM, SOLL DIRKET DER PORT/PIN STEHEN
              //wie macht man das?

  
}TSignale;


TSignale Signal[NUMBER];
(...)

ISR(TIMER2_COMP_vect)
{
  int n=0;

  for(; n<NUMBER; n++)
  {
    if(!Signal[n].counter--)
    {
      Signal[n].pin ^= Signal[n].pin;
      Signal[n].counter = Signal[n].defaultCounter; 
    }
  }
}


Ich hoffe ich könnte mein Problem ausreichend erklären. Oder wie mache 
ich das besser ganz anders?

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich frage noch einmal nach, ich glaube man kann nichts editieren:

Wenn ich das Datenblatt richtig verstehe, hat der I/O-Breich ja 8 Bit 
Adressen.
Wäre es korrekt, wenn ich als struktur folgendes verwende:
typedef struct TSignale
{
  char    counter;  //dec in isr. Toggeln wenn Null  
  char    defaultCounter;  //Nach Togglen initialisieren

  unsigned char port;
  unsigned char pin;        
}TSignale;

und in der Initialisierung eines Eintrages so vorgehe:
Signal[n].port = PORTC;
Signal[n].pin  = 1;
(...)

ISR(TIMER2_COMP_vect)
{
  int n=0;

  for(; n<NUMBER; n++)
  {
    if(!Signal[n].counter--)
    {
      Signal[n].port   ^= (1<<Signal[n].pin);
      Signal[n].counter = Signal[n].defaultCounter; 
    }
  }
}

Danke euch

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gast wrote:
> Ich frage noch einmal nach, ich glaube man kann nichts editieren:
Doch, kann man. Aber nur, wenn man angemeldet ist...

> Frage ist : welchen Typ hat ein Port wenn ich quasi die
> Adresse direkt verwende?
Versuche es mal mit
volatile unsigned char* ptr = PORTx;

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes M. wrote:
volatile unsigned char* ptr = PORTx;

->
volatile unsigned char* ptr = &PORTx;

Autor: Chrissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So hab ich das auch gelöst zur zu Fuß Ansteuerung von mehreren 
Schrittmotoren.
Das Blöde an der Sache ist, wie ich finde, kostet auf Dauer recht viel 
Ram. Die Verkabelung ändert sich ja nicht mehr - könnte also auch 
irgendwo ins rom. kA ob das bei dir auch zutrifft.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> (1<<Signal[n].pin)

Sowas ist sehr ineffizient.
Speichere in pin dann lieber gleich die Maske.
Also:
Signal[n].pin  = 1<<3;
..
*Signal[n].port ^= Signal[n].pin;

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Ernst wrote:
> Johannes M. wrote:
>
> volatile unsigned char* ptr = PORTx;
> 
>
> ->
>
> volatile unsigned char* ptr = &PORTx;
> 
Jau, das & ist mir durchgerutscht. Sorry.

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.