Archiv verlassen und diese Seite im Standarddesign anzeigen : ADC mit TWI
stefan8010
18.10.2011, 16:27
Hi,
wurde schon mal folgendes Problem gelöst? TWI- Slave und ADC zusammen zu nutzen?
TWI einzeln funktioniert super
ADC einzeln funktioniert super
Zusammen funktioniert nichts
VG stefan8010
Hallo,
ich denke nicht, dass man das so ohne weiteres pauschal sagen kann.
Da musst du schon dein Programm zeigen, sonst ist das nicht nachvollziehbar.
Kann mir vorstellen, dass wenn zu viele Anfragen über I2C kommen, um
einen Analogwert anfordern, dass z.B. der ADC immer wieder neu mit einer
Wandlung beginnen muss und nicht fertig wird.
Grüße,
Bernhard
Che Guevara
18.10.2011, 23:45
Hallo,
ich habe vor 2 Tagen einen M328P als Twi-Slave programmiert, welcher einen ADC einliest und diesen Wert dann an den Master sendet. Funktioniert ohne Probleme ;)
Also sollte es an deinem Programm liegen, zeig doch mal her :D
Gruß
Chris
stefan8010
19.10.2011, 13:19
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.
...
$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
stefan8010
20.10.2011, 07:05
Hi,
hat keine eine Idee?
@Che Guevara
Du schriebst, dass dein Programm ohne Probleme funktioniert. Kannst du mal dein Programm zeigen? Wäre wirklich super :)
VG Stefan8010
MagicWSmoke
20.10.2011, 10:28
Man kann einfacher
Readadc = ADC
schreiben.
Der ADC ist im Auto-Mode auch ohne ADCC-ISR zu betreiben, das Ergebnis per Var = ADC abgeholt entspricht dem aktuellsten Wert, d.h:
If Twi_status = &HA8 Or Twi_status = &HB8 Then
Twdr = ADC
...
Und sowas hier:
Adcsra = &B11101110
liest sich so bedeutend besser:
Adcsra = Bits(ADEN, ADSC, ADATE, ADIE, ADPS2, ADPS1)
Ist auch weniger anfällig für Schreibfehler.
stefan8010
20.10.2011, 20:23
@MagicWSmoke
Vielen Dank! :)
Habs hinbekommen.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.