Forum: Mikrocontroller und Digitale Elektronik USI Verbindung von ATmega 1284p zu Attiny2313A


von Achim S. (achims)


Lesenswert?

Hallo
versuche eine Verbindung zwischen einem ATmega 1284p(Master) zu einem 
Attiny2313 (Slave) mit I2C bzw USI zubekommen. Verwende dazu die Datein 
vom Martin Junghanns. Als Sender nutze ich das folgende:
1
void s_write1 (void)              // schreibe Daten von Master zu Slave
2
    {
3
    i2c_start(slave_adresse);        // Slave ist bereit zum Schreiben
4
    i2c_write(0x00);                        // Buffer Startadresse setzen
5
    i2c_write(42);                          // ... 42-44
6
    i2c_stop();                             // Zugriff beenden  
7
    }
DerAufruf erfolgt damit. Zur Kontrolle lasse ich mit die Tasten 
anzeigen.
1
if (!(PINC & (1<<PINC2)) )      // Taster T1
2
      {                  // Wenn T1 gedrückt...
3
      PORTA &=~(1<<PA7);        // LED Kontrolle ein  
4
      s_write1();            // Schreib-Funktion aufrufen
5
      }
6
    else
7
      {
8
        PORTA |=(1<<PA7);        // LED Kontrolle aus
9
      }
Beim Slave werte ich damit ais bzw. versuche in buffer zu schreiben.
1
for (int i = 0; i < 4; i++)         // rxbuffer[0-3] (Receiving/Empfangen)
2
  rxbuffer[i] = i + 20; 
3
4
byte1 = rxbuffer[0];
5
    byte2 = rxbuffer[1];
Damit möchte ich eine LED als Anzeige nutzen
1
if (!(byte1==43))
2
      {                  
3
      PORTD &=~(1<<PD3);        // LED Kontrolle ein
4
      PORTD |=(1<<PD4);        // LED Kontrolle aus
5
      }
6
    
7
    
8
    if (!(byte2==42))
9
    {
10
      PORTD &=~(1<<PD4);        // LED Kontrolle ein
11
      PORTD |=(1<<PD3);        // LED Kontrolle aus
12
    }
Leider erfolgt kein Empfang von Daten bzw keine änderung.
Danach soll das senden vom Slave zum Master erfolgen.
Könnte mal jemand drüber schauen, was ich falsch mache.
achim

von N. G. (newgeneration) Benutzerseite


Lesenswert?

Hallo,

Als erstes was allgemeines: Nimm wann immer es geht nur einen 
Controller. Das nimmt einem viel Arbeit ab, zB weil man nicht auf 
den/die Partner warten muss.
Und wenn es doch sein muss und es nur wegen fehlender Pins ist, könnte 
man über SPI/I2C Portexpander nachdenken.

Aber jetzt zu deinem Code.
(Ich kenne deinen Code zur Ansteuerung nicht und kann ihn mir wegen 
Zeitmangel auch nicht runterladen)

Selbst wenn du in einem ungenanntencodestück was in rxbuffer schreibst, 
spätestens hier überschreibst du die ersten 4 Byte mit 20, 21, 22 und 23

Achim S. schrieb:
> for (int i = 0; i < 4; i++)         // rxbuffer[0-3]
> (Receiving/Empfangen)
>   rxbuffer[i] = i + 20;

Das bedeutet was immer du sendest geht gar nicht in deine Berechnung 
beim Slave ein. (Falls ich keine Tomaten auf den Augen habe)

Mfg
N.G.

von Achim S (Gast)


Lesenswert?

Hallo
wenn ich das richtig verstehe, darf ich die rxbuffer nicht mit Werten 
vorher füllen. Sonst könnte ich die falschen Werte drin haben
achim

von Bastian W. (jackfrost)


Lesenswert?

Achim S. schrieb:
> Beim Slave werte ich damit ais bzw. versuche in buffer zu schreiben.for
> (int i = 0; i < 4; i++)         // rxbuffer[0-3] (Receiving/Empfangen)
>   rxbuffer[i] = i + 20;
>
> byte1 = rxbuffer[0];
>     byte2 = rxbuffer[1];


Damit ist Byte1 20 und Byte2 21 wenn du damit nichts mehr machst dann 
treffen beide Bedingungen der If Abfragen zu.  Die zweite überschreibt 
aber die erste.

Gruß JackFrost

von Achim S. (achims)


Lesenswert?

Danke Bastian
werde das ändern
achim

von Carl D. (jcw2)


Lesenswert?

Warum müssen es eigentlich 3 (auf die schnelle gefundene) parallele 
Threads zu I2C-Slave mit USI sein?

von Achim S. (achims)


Lesenswert?

Wieso 3 Threads?
USI mit Display ist was anderes
Welche meinst du noch?

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.