Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Allgemeines (OffTopic) » Bitweise ansprechbare Adressen?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
04.08.2004, 10:05 Uhr
Unwissende
...die wirklich Unwissende 8-)


Hallo,

ich arbeite mit einem speziellen Compiler, uvision von Keil.
Mit dem folgenden Quelltext (Softwaremäßige Emulation einer I²C-Schnittstelle) spreche ich immer jeweils nur 1 Pin (SCL_1 und SDA_1) von meinen Ports an:

hier der Header:

C++:
/*---------------------------------------------
REG552_mod.H
----------------------------------------------*/


#ifndef __REG552_H__
#define __REG552_H__

#define Sfr(x, y)        sfr x = y
#define Sbit(x, y, z)   sbit x = y^z  //z ist der Pin, der gesetzt wird

/*  BYTE Register, hier sind die Adressen der Ports 0-5 festgelegt ->Datenblatt */
sfr P0    = 0x80;
sfr P1    = 0x90;
sfr P2    = 0xA0;
sfr P3    = 0xB0;
sfr P4    = 0xC0;
sfr P5    = 0xC4;


/*
.....................
*/


/*hier werden die einzelnen Pins von Port 3 (nur der ist im Moment für mich relevant) festgelegt*/
Sbit (P3_7 , 0xB0, 7);
Sbit (P3_6 , 0xB0, 6);
Sbit (P3_5 , 0xB0, 5);
Sbit (P3_4 , 0xB0, 4);
Sbit (P3_3 , 0xB0, 3);
Sbit (P3_2 , 0xB0, 2);
Sbit (P3_1 , 0xB0, 1);
Sbit (P3_0 , 0xB0, 0);

/*End of Byteregister for I²C*/

#endif



Hier werden Variablen, die auf P3_2, P3_3, P3_4, P3_5 zugreifen, festgelegt:

C++:
//    I2C.c - IH I2C Driver for Bus Master

#include<reg552_mod.h>
#include "i2c.h"
#include <stdio.h>
#include <string.h>
#include <lcd_4x20.h>

//#define SCL_1 P3_2     //TempSensor2
//#define SDA_1 P3_3    //TempSensor2
#define SCL_1 P3_4       //TempSensor1
#define SDA_1 P3_5       //TempSensor1



Verwendet wird SCL_1 und SDA_1 z.B. in der folgenden Funktion:

C++:
void    I2C_Start(void)      //generiert vom Master (80C552)
{
    SDA_1 = 0;    
    I2C_Delay(3);       //fallende Flanke von SDA während SCL auf HIGH ist. ->siehe  I²C-Spezifikation von Philips
    SCL_1 = 0;    
    I2C_Delay(1);
    I2C_NackCount = 0;   //RESET I2C_NackCount
}



Jetzt würde ich gerne 2 softwaremäßige I²C-Schnittstellen implementieren. Aber wie setze ich jetzt 2 Pins gleichzeitig von meinem Port???
Habt ihr ne Idee?
--
__________________________________
Unwissenheit ist vorläufig- Dummheit für immer
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.08.2004, 10:31 Uhr
ao

(Operator)


1. Thread verschoben, hat mit Ansi-C nix zu tun. Leider haben wir nix, was besser passt, so dass nur Allgemeines (OffTopic) übrigblieb.

2. sbit-Variablen sprechen genau 1 Bit (d.h. 1 Portpin) an. Für 2 Portpins brauchst du 2 Variablen und 2 Zugriffe:
SCL_1 = 0;
SCL_2 = 0;

3. Warum willst du die beiden I2C-Schnittstellen gleichzeitig ansprechen? Lass sie doch unabhängig und frag die Sensoren nacheinander ab. Wenn du nicht gerade ne knallharte zeitliche Kopplung brauchst, ist das vermutlich einfacher.

4. I2C ist keine Punkt-zu-Punkt-Verbindung, sondern ein Bus der (zwar sehr begrenzt, aber immerhin) adressieren kann. Es sollte also möglich sein, beide Sensoren an eine Schnittstelle anzuschließen und über Adressen den einen oder den anderen auszuwählen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.08.2004, 10:36 Uhr
~Hans
Gast



C++:
#define bit0 1
#define bit1 2
#define bit2 4
#define bit3 8
#define bit4 16
#define bit5 32
#define bit6 64
#define bit7 128

volatile unsigned a;   // es handelt sich um ein Register
...
a=a|(bit0 | bit7) & bit5;   //setzte Bit 0 und 7 und lösche Bit 5

>
Zitat von unwissende:
Aber wie setze ich jetzt 2 Pins gleichzeitig von meinem Port???
Habt ihr ne Idee?

Hi,

normalerweise macht man mit den Bit-operatoren erst mal ein paar logische Verknüpfungen, und schreibt das Ergebniss in die Variable oder das Register, also z.B. so|CPP||

ich hoffe, das nützt Dir was.

Hans,
der gerade als Gast postet, weil nicht am eigenen Rechner...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.08.2004, 10:38 Uhr
~Hans
Gast


an die admins: kann mal einer das obige posting korrigieren???
Anschiessend könnt ihr dieses hier löschen.

Hans
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.08.2004, 10:48 Uhr
Unwissende
...die wirklich Unwissende 8-)


@ao:
Sorry, ich wusste selbst nicht so genau, in welches Forum ich meinen Beitrag posten soll...Der Compiler ist Keil, aber bisher hab ich leider noch keine gescheiten Foren gefunden (arbeitet denn niemand mit Keil? )

Das hab ich mir ja auch gedacht, dass ich 2 Zugriffe brauche....Leider bin ich mir nicht so sicher, ob dann das ganze noch funktionniert...(Timing), aber das dürfte sich ja mitm Oszi nachmessen lassen...


Zitat von Verfasser:

4. I2C ist keine Punkt-zu-Punkt-Verbindung, sondern ein Bus der (zwar sehr begrenzt, aber immerhin) adressieren kann. Es sollte also möglich sein, beide Sensoren an eine Schnittstelle anzuschließen und über Adressen den einen oder den anderen auszuwählen.


Mir ist schon klar, dass man an den Bus 2^3 verschiedene Devices anstöpseln kann. Das vorhandene Board ist lediglich eine Schmalspurversion von der Version, die noch folgt-und an die sollten >8 Temperatursensoren angeschlossen werden, daher brauchen wir 2 I²C-Interfaces.
Ich frag jetzt nochmal meinen Chef, wie er das genau haben will, und ob ich die Sensoren auch hintereinander abfragen kann...

@hans:
Ähm, ja, dass ich mittels Bitmasken mehrere Pins gleichzeitig setzen kann, war mir schon bewusst (hätte ich vielleicht in meinem ersten Posting auch mal erwähnen sollen ........)
Ich dachte, dass es vielleicht ähnlich wie bei sbit einen Datentyp gibt, der gleichzeitg schön einfach mehrere Pins setzen kann...

@beide:
Danke für die Antworten, hilft mir immer wieder weiter (Ihr schont so meine Kollegen, die mir sonst immer alles beantworten müssen )

Grüßle Caro
--
__________________________________
Unwissenheit ist vorläufig- Dummheit für immer
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
04.08.2004, 11:07 Uhr
~Hans
Gast


Hi,


Zitat von unwissende:
Ähm, ja, dass ich mittels Bitmasken mehrere Pins gleichzeitig setzen kann, war mir schon bewusst (hätte ich vielleicht in meinem ersten Posting auch mal erwähnen sollen ........)

Ach ja, es ist doch gerade wenn man mit etwas neuem anfängt oft so, das man vor lauter Bäumen den Wald nicht sieht...


Zitat:
Ich dachte, dass es vielleicht ähnlich wie bei sbit einen Datentyp gibt, der gleichzeitg schön einfach mehrere Pins setzen kann...

Sagt denn das Compiler-Handbuch nichts darüber aus? - Oder ist das so kryptisch, das man dafür erst mal ein Extrastudium absolvieren muss?? (soll ja auch vorkommen )

Ansonsten: Danke für die Blumen, - ich schick Dir auch eine , und wünsch noch frohes schaffen.

Hans
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
04.08.2004, 12:20 Uhr
Tommix



Hallo,
man einzelne Bits auch über ein sg. Bitfeld ansprechen:

C++:
typedef union
{
    unsigned value;

    struct
    {
        unsigned b0:1;
        unsigned b1:1;
        unsigned b2:1;
        unsigned b3:1;
        unsigned b4:1;
        unsigned b5:1;
        unsigned b6:1;
        unsigned b7:1;
    } bits;
}  bit_access;


int main()
{
    bit_access test;

    test.value = 0;
    test.bits.b0 = 1;   // test.value = 1
    test.bits.b3 = 1;   // test.value = 9
    test.bits.b0 = 0;   // test.value = 8

    return 0;
}


Allerdings ist das höchst unüblich, vermutlich verwenden die meisten Programmierer in so einem Fall Bitmasken. Die Reihenfolge der Bits ist übrigens nicht festgelegt, d.h. sie muss evtl. umgedreht werden.

Gruss, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
04.08.2004, 12:27 Uhr
ao

(Operator)



Zitat von ~Hans:

normalerweise macht man mit den Bit-operatoren erst mal ein paar logische Verknüpfungen, und schreibt das Ergebniss in die Variable oder das Register, also z.B. so:

C++:
a=a|(bit0 | bit7) & bit5;   //setzte Bit 0 und 7 und lösche Bit 5




Speziell bei IO-Ports kriegt man dabei aber Probleme, wenn man mehrere Tasks, Interruptroutinen oder ähnliches hat, die auf einzelne Bits des Ports zugreifen und asynchron kommen, sich evtl. noch gegenseitig unterbrechen und so weiter. Damit richtet man auf dem Port ein heilloses Durcheinander an.

Eine Software-Lösung dafür würde zumindest sowas wie CriticalSections erfordern; wenn es auch Interruptroutinen umfassen soll, ist zusätzlich ne mehrstufige Interrupt-Bearbeitung nötig: für kleine Mikrocontroller insgesamt viel zu aufwändig und ne echte Performancebremse.

Die sbit-Idee (wenn Compiler und CPU das unterstützen) ist da ein eleganter Ausweg.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
04.08.2004, 12:35 Uhr
ao

(Operator)



Zitat von Unwissende:
Das vorhandene Board ist lediglich eine Schmalspurversion von der Version, die noch folgt-und an die sollten >8 Temperatursensoren angeschlossen werden, daher brauchen wir 2 I²C-Interfaces.
Ich frag jetzt nochmal meinen Chef, wie er das genau haben will, und ob ich die Sensoren auch hintereinander abfragen kann...

Sobald mehrere Sensoren am gleichen Bus hängen, werden die doch eh nacheinander abgefragt. Und bei Temperaturmessungen ist es normalerweise wurscht, ob zwei Werte gleichzeitig oder mit einer Millisekunde Abstand geholt werden (es sei denn ihr wollt einen Urknall messen, da ist ne Millisekunde schon viel).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
04.08.2004, 12:40 Uhr
ao

(Operator)



Zitat von Tommix:
man einzelne Bits auch über ein sg. Bitfeld ansprechen:

Das Bitfeld ist aber nur ne Tapete, in Wahrheit wird dahinter genauso mit Masken gearbeitet wie wenn man das direkt selber kodieren würde.

Zitat:
Allerdings ist das höchst unüblich, vermutlich verwenden die meisten Programmierer in so einem Fall Bitmasken. Die Reihenfolge der Bits ist übrigens nicht festgelegt, d.h. sie muss evtl. umgedreht werden.

... was der Grund dafür sein dürfte, dass sich die Bitfelder nicht wirklich durchsetzen: sie sind einfach zu wenig portabel.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Allgemeines (OffTopic) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: