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
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
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
Gruß
Chris
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.
...
@ChrisCode:$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
Wie hast du das gelöst?
Gruß, stefan8010
Geändert von stefan8010 (19.10.2011 um 16:28 Uhr)
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
Man kann einfacher
schreiben.Code:Readadc = ADC
Der ADC ist im Auto-Mode auch ohne ADCC-ISR zu betreiben, das Ergebnis per Var = ADC abgeholt entspricht dem aktuellsten Wert, d.h:
Und sowas hier:Code:If Twi_status = &HA8 Or Twi_status = &HB8 Then Twdr = ADC ...
liest sich so bedeutend besser:Code:Adcsra = &B11101110
Ist auch weniger anfällig für Schreibfehler.Code:Adcsra = Bits(ADEN, ADSC, ADATE, ADIE, ADPS2, ADPS1)
@MagicWSmoke
Vielen Dank!
Habs hinbekommen.
Lesezeichen