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
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.
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
Ungetestet, aber dem Link zufolge könnte es so gehen: typedef volatile char* port_typ; port_typ PORT[] = { &PORTC, &PORTD }; /* ... */ *PORT[sensor] = 0xFF;
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.