www.mikrocontroller.net

Forum: Compiler & IDEs Array mit PORT Elementen


Autor: Stefan Utsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum,
µC: AT90S8515,
schreibe in: AVRGCC

ich lese über einen DS1620 die Temperatur aus. Jetzt möchte ich einen
weiteren DS1620 in das System intigrieren. Ich habe mir jetzt überlegt,
ob es möglich ist, die schon benutzten Routinen wieder zu benutzen und
zwar in dem Sinne, dass ich über ROUTINE[welcher] die beiden DS1620
unabhängig von einander betreiben kann. Habe jetzt die Routinen so
umgearbeitet, dass über "if(sensor == x)" geschaut wird, welchen ich
ansprechen möchte und danach dann den PORT, PINS usw. abfrage.
Jetzt die eigentliche Frage:
Gibt es eine "elegante" Methode so etwas zu realisieren?
Versuch meinerseits dies über Array's zu bauen, hat nicht funkt.

char PORT[] = {PORTB,PORTC};
char DQ[] = {1,1};

und dann in den Routinen mit Functionheader
FUNKTION(sensor)
{
SETBIT(PORT[sensor], DQ[sensor]);
}

Ich kann natürlich einfach meine ds1620.c umbenennen in ds1620_1.c und
ds1620_2.c und dann je nachdem anpassen, was ich allerdings recht
zweifelhaft finde!
Bin dankbar für Vorschläge :-)
Gruß
Stefan

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe:
http://www.nongnu.org/avr-libc/user-manual/FAQ.htm...

Du kannst Zeiger auf Ports übergeben, musst dafür aber in Kauf nehmen,
dass die Ports nicht mehr über in/out angesprochen werden können.

Autor: Stefan Utsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
danke für den Link, habe ich mir auch angeschaut. Es kann sein, dass
ich es nicht richtig verstanden habe, aber ich glaube nicht, dass mir
das weiterhilft. :-(
Ich dachte an sowas wie deiser Schnippsel


char PORT[] = {PORT,PORTC};
char RST[] = {0,0};

int GetTemp(char sensor)
{
  int temp;
  SETBIT(PORT[sensor], RST[sensor]);
  Put1620byte(0xAA,sensor);
  temp=Read1620byte(sensor);
  CLEARBIT(PORT[sensor], RST[sensor]);
  return temp;
}

Die ganze Sache, wollte ich dann aus dem main-Programm so aufrufen:

GetTemp(0) bzw. GetTemp(1) und je nachdem welchen Wert sensor hat auf
die verschiedenen Ports zugreifen

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ungetestet, aber dem Link zufolge könnte es so gehen:

typedef volatile char* port_typ;
port_typ PORT[] = { &PORTC, &PORTD };

/* ... */

*PORT[sensor] = 0xFF;

Autor: Stefan Utsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke,

ich werde das mal ausprobieren und Rückmeldung geben!

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wobei ich mich frage, warum du die beiden nicht parallel schaltest und
dann die interne ID ausliest. Dann kannst du auch beide einzeln
ansprechen und belegst nicht zusätzliche Pins/Ports.
Werner

Autor: Stefan Utsc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

@ Werner
was meinst Du mit int. ID? Ich kann in dem Datenblatt nichts über eine
ID-Abfrage finden. Ich benutze den AT90S8515, da ich nur AT90-µC
benutzen kann und die kleineren der Serie nicht genügend Speicher für
das was ich programmieren möchte haben. So gesehen ist PIN-Sparen immer
eine tolle Sache, nur nicht nötig :-)

Sinn und Zweck meiner Anfrage war, ob es möglich ist, das mein Programm
kleiner wird! Ich dachte mir, wenn ich den schon geschrieben Code so
modifiziere, dass er beide Abfragen kann, kann ich mir es sparen, den
Code zwei mal einzubinden.

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der I²C-Bus ist ein Bus, d. h. man kann mehrere Geräte parallel
schalten und sie über ihre Adresse ansprechen.  Bei I²C ist ein Teil
der Adresse typischerweise fest durch den Chip vorgegeben, ein paar
Bits sind normalerweise variabel und werden durch Belegung von ein
paar Pins am Chip (auf low oder high klemmen) gebildet.  Damit musst
Du beiden Chips verschiedene Adressen geben, dann kannst Du sie an
einem Bus betreiben.

Ich verstehe nicht, warum musst Du denn einen AT90xxx Chip benutzen?
Es gibt doch für alle pinkompatible ATmegas, die einem das Leben oft
merklich erleichtern.  Für den AT90S8515 gibt's erstens den
ATmega8515, außerdem noch den ATmega162 mit doppelt so viel Speicher
und sogar noch der Möglichkeit, ihn per JTAG-ICE zu debuggen.

Autor: Stefan Utsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

@ Jörg
Ja, Du hast natürlich Recht! Ich könnte auch einen anderen µC benutzen,
habe aber nun mal zwei AT90S8515 umsonst bekommen und das ganze ist ja
auch "nur" ein Projekt für zu hause. Und da ich erst mal warm werden
möchte mit AVRs nutze ich diese.

Zum I²C:
Der DS1620 besitzt ein 3-Wire-Interface und kein I²C.

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.