Forum: Mikrocontroller und Digitale Elektronik AVR als Slave per TWi abfragen


von Cassio (Gast)


Lesenswert?

Ich möchte einen Atmega 32 dazu veranlassen, Werte von einem Atmega 8 
per TWI zu lesen. Nur irgendwie klappt das nicht.

Ich habe dieses Beispiel aus dem RB Wiki für den Atmega8 verwendet:
1
' TWI-slave test 
2
' zum simulieren eines PCF8574 
3
4
$regfile = "m8def.dat"                                      ' the used chip 
5
$crystal = 16000000                                          ' frequency used 
6
' $baud = 9600                                              ' keine baud rate angeben ! 
7
8
Dim Twi_control As Byte                                     ' Controlregister lokale kopie 
9
Dim Twi_status As Byte
10
Dim Twi_data As Byte
11
12
Dim Count As Byte                                           ' Testwert, jedes mal +1 
13
14
Declare Sub Twi_init_slave
15
16
' Werte zurücksetzen 
17
Count = 0
18
Twi_data = 0
19
Call Twi_init_slave                                         ' TWI aktivieren 
20
21
22
' Hauptschleife 
23
Do
24
    ' hier könnte ihr Code stehen 
25
26
27
    ' schauen ob TWINT gesetzt ist 
28
    Twi_control = Twcr And &H80                             ' Bit7 von Controlregister 
29
30
    If Twi_control = &H80 Then
31
        Twi_status = Twsr And &HF8                          ' Status 
32
33
        ' will der Master ein Byte haben 
34
        If Twi_status = &HA8 Or Twi_status = &HB8 Then
35
            Twdr = Count                                    ' neue Daten ausgeben 
36
            Incr Count                                      ' testwert +1 
37
        End If
38
39
        ' TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht 
40
        Twcr = &B11000100                                   ' TWINT löschen, mit ACK 
41
    End If
42
43
Loop
44
45
End
46
47
48
' Unterprogramme 
49
50
51
' TWI als slave aktivieren 
52
Sub Twi_init_slave
53
    Twsr = 0                                                ' status und Prescaler auf 0 
54
    Twdr = &HFF                                             ' default 
55
    Twar = &H40                                             ' Slaveadresse setzen 
56
    Twcr = &B01000100                                       ' TWI aktivieren, ACK einschalten 
57
58
End Sub

Und das Programm für den Atmega32:
1
$regfile = "M32def.dat"
2
$crystal = 16000000
3
4
$lib "i2c_twi.lbx"                                          ' Für Hardware TWI
5
6
Waitms 100
7
8
Config Twi = 400000                                         ' setzt die TWI-Register
9
' Twsr = 0                                               ' Status reset
10
' Twbr = 12                                              ' Bus Geschwindigkeit 400kHz @ 16MHz
11
Twcr = &B00000100                                           ' TWI Modul aktivieren, nur TWEN
12
13
14
Dim Modus As Byte
15
Dim Wert As Byte
16
17
Const Servom8w = &H40                                       ' Slaveadresse
18
19
20
Do
21
22
    Print  "Senden? : " ;
23
    Input  Modus
24
25
    If Modus = 1 Then
26
27
        I2cstart
28
        I2cwbyte Servom8w
29
        I2crbyte Wert , Nack                                ' "S" Kennzeichen für Servo ansteuern
30
        I2cstop
31
32
        ' Fehler-Flag ausgeben, sollte immer 0 sein, dann war kein Fehler
33
        Print "Wert: " ; Wert
34
        Print "Err " ; Err
35
36
    End If
37
38
39
Loop
40
41
End

Ich erhalte immer als Wert 32 und als Errorwert 0. Das bedeutetja, das 
der Atmega 8 reagiert, nur sendet er nicht das was ich will.
Warum nicht?

Danke schonmal für hilfreiche Antworten. Ich komm seit Stunden nicht 
dahinter wahrscheinlich ist es so einfach...

von Cassio (Gast)


Lesenswert?

Keiner eine Idee?

von Cassio (Gast)


Lesenswert?

Habs selber rausgefunden.

Statt &H40 muss man &H41 einsetzen dann funktioniert es. Was ja klar 
ist, denn das ist dann die Sendeadresse des Atmega8.

Tja je kleiner der Fehler desto länger die Fehlersuche...

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.