Forum: Compiler & IDEs Array mit PORT Elementen


von Stefan Utsch (Gast)


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

von Chris (Gast)


Lesenswert?

Siehe:
http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_port_pass

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.

von Stefan Utsch (Gast)


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

von Chris (Gast)


Lesenswert?

Ungetestet, aber dem Link zufolge könnte es so gehen:

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

/* ... */

*PORT[sensor] = 0xFF;

von Stefan Utsch (Gast)


Lesenswert?

Danke,

ich werde das mal ausprobieren und Rückmeldung geben!

von Werner (Gast)


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

von Stefan Utsc (Gast)


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.

von Jörg Wunsch (Gast)


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.

von Stefan Utsch (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.