Forum: Compiler & IDEs mega 16 & I²C


von Marco Richter (Gast)


Lesenswert?

#include  <avr/io.h>

#define    Takt  3686400UL
#define   AUSAD  0x70
#define    EINAD  0x71
#define   FAKTOR  44
#define    TEILER  1

void init(unsigned char faktor, unsigned char teiler)
{
 TWBR  =  faktor;
 TWSR  =  teiler;
}

void send(unsigned char adres, unsigned char daten)
{
  TWCR  =(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
  loop_until_bit_is_set(TWCR, TWINT);
  TWDR  =adres;
  TWCR  =(1<<TWINT)|(1<<TWEN);
  loop_until_bit_is_set(TWCR, TWINT);
  TWDR  =daten;
  TWCR  =(1<<TWINT)|(1<<TWEN);
  loop_until_bit_is_set(TWCR, TWINT);
  TWCR  =(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
}

unsigned char empf(unsigned char adres)
{
unsigned char daten;
  TWCR  =(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
  loop_until_bit_is_set(TWCR, TWINT);
  TWDR  =adres;
  TWCR  =(1<<TWINT)|(1<<TWEN);
  loop_until_bit_is_set(TWCR, TWINT);
  TWCR  =(1<<TWINT)|(1<<TWEN);
  loop_until_bit_is_set(TWCR, TWINT);
  daten  =TWDR;
  TWCR  =(1<<TWINT)|(1<<TWEA)|(1<<TWEN);
  loop_until_bit_is_set(TWCR, TWINT);
  TWCR  =(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
  return daten;
}

void main (void)
{
unsigned char awert, ewert;
DDRB = 0xff;
init(FAKTOR, TEILER);

while(1);
  {
  awert = PIND;
  send (AUSAD, ~awert);
  ewert = empf(EINAD);
  PORTB = ewert;
  }
}



hi ich hab den quell text einfach mal aus nem buch abgetippt...und keine 
funktion,
mim oskar mal geschaut da tut sich weder auf daten noch auf der takt 
leitung was,
pull up's mit 2mal 10k sind drinne, hat wer noch ne idee?
fuse bits für den I²C muss man nicht setzten oder?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wenn man davon absieht, dass der Code in der völlig optimistischen
Annahme gezimmert ist, dass auf dem Bus nie was schief gehen kann
(keinerlei Fehlerbehandlung), sollte er wohl funktionieren.

Du arbeitest mit einer sagenhaft hohen Taktrate von 10 kHz.  Üblich
sind 100 kHz oder 400 kHz für high-speed 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.