Hallo,
anbei mal eine Variante.
Folgene Varianten habe ich veruscht:
ADC als erstes auzulesen wenn Twi_isr ausgeführt wird.
ADC in eine Sub.
TWI in Do Loop und ADC mit Interrupt.
ADC und TWI in Do Loop.
...
Code:
$regfile = "M32def.dat" ' the used chip
$crystal = 7372800 ' frequency used
$baud = 9600
$hwstack = 100
$swstack = 100
$framesize = 100
Dim Twi_control As Byte ' Controlregister lokale kopie
Dim Twi_status As Byte
Dim Twi_data As Byte
Dim W1 As Word
Dim W2 As Word
Dim Readadc As Word
'Dim W3 As Word
'Dim W4 As Word
'Dim Readadc2 As Word
On Adc Adcint
Enable Interrupts
Admux = &B01000000
Adcsra = &B11101110
Declare Sub Twi_init_slave 'TWI
Twi_data = 0
Call Twi_init_slave ' TWI aktivieren
On Twi Twi_isr
Enable Twi
Do
Loop
End
' TWI als slave aktivieren
Sub Twi_init_slave
Twsr = 0 ' status und Prescaler auf 0
Twdr = &HFF ' default
Twar = &H40 ' Slaveadresse setzen
Twcr = &B01000101 ' ACK einschalten, TWI aktivieren, enable Interrupt
End Sub
Twi_isr:
Twi_status = Twsr And &HF8 ' Status
' will der Master ein Byte haben
If Twi_status = &HA8 Or Twi_status = &HB8 Then
Twdr = Readadc
End If
' TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht
Twcr = &B11000101
Return
Adcint:
Admux.mux0 = 0
Admux.mux1 = 0
W1 = Adcl
W2 = Adch
W2 = W2 * 256
Readadc = W1 + W2
'Waitms 1
'Admux.mux0 = 1
'Admux.mux1 = 0
'W3 = Adcl
'W4 = Adch
'W4 = W4 * 256
'Readadc2 = W3 + W4
'Waitms 1
Return
@Chris
Wie hast du das gelöst?
Gruß, stefan8010
Lesezeichen