AVR als Slave per TWi abfragen

Gast #2763195
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren