Forum: Mikrocontroller und Digitale Elektronik Atmel -> ATmega32 -> Software I2C


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Naj H. (janiiix3)


Bewertung
0 lesenswert
nicht lesenswert
Nabend,

ich habe gerade das Problem, dass sich mein "SCL" Pin nicht bewegt ( 
toggelt ).

Was mache ich falsch?

Meine main()
1
tI2c SoftI2c;
2
3
int main(void):
4
{
5
  SoftI2c.Port = &PORTC;
6
  SoftI2c.Scl = 1<<PC0;
7
  SoftI2c.Sda = 1<<PC1;
8
  I2cSoftInit( &SoftI2c );
9
  
10
  uint8_t Commando[] = { 13 , 0x83 }; // Frequenz Modus + 1Hz
11
  
12
    while (1) 
13
    {
14
     *SoftI2c.Port |=  (1<<SoftI2c.Scl);
15
    *SoftI2c.Port |=  (1<<SoftI2c.Sda);
16
     
17
     *SoftI2c.Port &= ~(1<<SoftI2c.Scl);
18
    *SoftI2c.Port &= ~(1<<SoftI2c.Sda);
19
    }
20
}

Makros:
1
#ifdef __AVR__
2
#define  __PORT_DDR__( _p )    (*( (_p-1) ))  
3
#define __PORT_PIN__( _p )    (*( (_p-2) ))
4
#else
5
#error Library not Supported for our Device
6
#endif 
7
8
#define Q_DEL _delay_loop_2(3)
9
#define H_DEL _delay_loop_2(5)
10
11
typedef uint8_t PortBit_t;
12
typedef uint8_t Port_t;
13
14
typedef struct
15
{
16
  /*
17
  *  Port für das I²C Modul.
18
  *  Es wird die Adresse von dem Daten Richtungs Register
19
  *  später rechnerisch ermittelt.
20
  */
21
  volatile Port_t *Port;
22
  
23
  /*
24
  *  SCL Pin 
25
  */
26
  PortBit_t Scl;
27
  
28
  /*
29
  *  SDA Pin
30
  */
31
  PortBit_t Sda;
32
  
33
}tI2c;

Und die Init (I2cSoftInit()):
1
void I2cSoftInit( tI2c *Object ) 
2
{
3
  __PORT_DDR__( Object->Port ) |= ( 1 << Object->Scl ); // Scl als Ausgang konfigurieren
4
  __PORT_DDR__( Object->Port ) |= ( 1 << Object->Sda ); // Sda als Ausgang konfigurieren
5
  
6
  *Object->Port |= ( 1 << Object->Scl ); // Default Pegel einstellen
7
  *Object->Port |= ( 1 << Object->Sda ); // ..  
8
}

Irgendwo mache ich etwas gravierendes falsch..

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Du shiftest doppelt gemoppelt:
1
SoftI2c.Sda = 1<<PC1;                   // = 2
2
*SoftI2c.Port &= ~(1<<SoftI2c.Sda);     // = 4
3
*Object->Port |= ( 1 << Object->Sda );  // = 4

von Naj H. (janiiix3)


Bewertung
0 lesenswert
nicht lesenswert
Stefanus F. schrieb:
> Du shiftest doppelt gemoppelt:
>
1
> SoftI2c.Sda = 1<<PC1;                   // = 2
2
> *SoftI2c.Port &= ~(1<<SoftI2c.Sda);     // = 4
3
> *Object->Port |= ( 1 << Object->Sda );  // = 4
4
>

Oh man.. Man sollte früher Feierabend machen.
Ich danke Dir vielmals!

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]
  • [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.