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...