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 |