- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 7 von 7

Thema: ADC mit TWI

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    16.04.2011
    Beiträge
    15

    ADC mit TWI

    Anzeige

    Praxistest und DIY Projekte
    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

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    33
    Beiträge
    1.192
    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

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    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

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    16.04.2011
    Beiträge
    15
    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
    Geändert von stefan8010 (19.10.2011 um 16:28 Uhr)

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    16.04.2011
    Beiträge
    15
    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

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Man kann einfacher
    Code:
    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:
    Code:
    If Twi_status = &HA8 Or Twi_status = &HB8 Then
       Twdr = ADC
    ...
    Und sowas hier:
    Code:
    Adcsra = &B11101110
    liest sich so bedeutend besser:
    Code:
     Adcsra = Bits(ADEN, ADSC, ADATE, ADIE, ADPS2, ADPS1)
    Ist auch weniger anfällig für Schreibfehler.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    16.04.2011
    Beiträge
    15
    @MagicWSmoke
    Vielen Dank!
    Habs hinbekommen.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test