www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC Zeit Problem


Autor: René (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich benötige eine Schleife durch einen ADC Hindurch aTMEGA16
Die von der Zeit her immer konstant ist. Das Problem besteht darin das 
der ADC pro wert immer unterschiedlich viele Zyklen braucht. kann man 
die Zyklen irgendwie erfassen? Die schleife schon läuft in einem 
Interrupt.
Habt Ihr Ideeen wie man das lösen kann?

Autor: 6637 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der ADC hat immer gleich lange. Man kann den ADC mit sich selbst 
starten, oder von einem Timer. Wenn das Timing sehr stabil sein muss, 
unbeeinflusst von irgendwelchen interrupts, so sollte man sich nach 
einem CPLD/FPGA umschauen.

Autor: le maestro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der ADC wert braucht unterschiedliche Zyklen? Das waere wirklich 
merkwuerdig... oder braucht deine Schleife immer unterschiedlich lange, 
vielleicht wir sie von nem anderen Interrupt unterbrochen. Kenne den 
Controller jetzt nicht, aber kann man da keine Prioritaeten fuer 
Interrupts setzen?

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den ADC des Mega16 kann man, soweit ich mich recht erinnere, per Timer 
starten. Dann würde der Timmer immer im selben Intervall gestartet 
werden.

Autor: René (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe diese schleife im Interrupt mit ein bisschen gerassel vorneweg und 
hinterher die aber mit nop usw, angepasst sind ohne ADC sind die Zeiten 
konstant. Mache ich die ADC Schleife hinzu dann ändern sich die Zeiten.
Im AVR Studio sind die Zeiten gleich in der Praxis nicht.

start:
        sbi     ADCSRA, ADSC
wait:   sbic    ADCSRA, ADSC
rjmp    wait


Ich frage nacheinander 3 verschiedene Eingänge im Interrupt ab sobald 
ich die ADC Schleife einfüge "Wandern die Zeiten". Schleife ADC + 
darüber liegende Schleife für das Umschalten und Speichern der Werte im 
RAM. Schleifen wurden mit nop wegen der Sprünge angepasst und im 
Simulator sind die Intervalle immer
gleich. ob mit oder ohne ADC Schleife in der Praxis leider nicht.

bin echt ratlos

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum schickst Du nicht den kompletten Code? Und warum nutzt Du nicht 
den ADC-Interrupt? Eine Warteschleife mit derart großen Zeitkonstanten 
in einem Interrupt Handler ist miserabler Programmierstil! Auf die 
Weise wundert mich überhaupt nicht, dass Du Timing-Probleme bekommst.

Und auch wenn Du es nicht glauben willst: Bis auf die erste Wandlung 
nach dem Einschalten dauern alle Wandlungen prinzipbedingt gleich lange.

Autor: René (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Kanalwahl:     
            cpi    Flag,0
            brne   nex01
      nop
      nop
      nop
      nop
      nop
      nop
      nop
      nop
      nop
            ldi    tempL,(0<<MUX1)|(0<<MUX0)|(1<<REFS1) |(1<<REFS0) |(1<<ADLAR) | (0<<MUX3) ;Kanal 0 (Rot)
            out    ADMUX,tempL
            rjmp   a
nex01:      cpi    Flag,1
            brne   nex02
      nop
      nop
      nop
      
            ldi    tempL,(0<<MUX1)|(1<<MUX0)|(1<<REFS1) |(1<<REFS0) |(1<<ADLAR) | (0<<MUX3) ;Kanal 1(Grün)
            out    ADMUX,tempL
      
                                               
            rjmp   a
nex02:      cpi    Flag,2
            brne   a
            ldi    tempL,(1<<MUX1)|(0<<MUX0)|(1<<REFS1) |(1<<REFS0) |(1<<ADLAR) | (0<<MUX3) ;Kanal 2(Blau)
            out    ADMUX,tempL
            nop
a:           
             clr     zaehl
       clr     puf1

           
weiter:
Toggel:    sbis    portC,0 ;toggeln portC,0 für Anzeige auf Monitor
           rjmp    PC0an
           rjmp    PC0aus
PC0an:     sbi     PortC,0
           rjmp     Toggel1
PC0aus:    cbi     PortC,0
            nop      
      
Toggel1:    sbis    portC,0 ;toggeln portC,0 für Anzeige auf Monitor
           rjmp    PC0an1
           rjmp    PC0aus1
PC0an1:     sbi     PortC,0
           rjmp     start_adc
PC0aus1:    cbi     PortC,0
            nop
      
      
      
    
       

                     
;********************Messung*****************************************************           
start_adc:  
            sbi     ADCSRA, ADSC        ; den ADC starten
wait_adc:   sbic    ADCSRA, ADSC
           
            rjmp    wait_adc

      
            


;************************************************************************


mittel:     in      PUF0 ,ADCL
           in      temph ,ADCH ;

                              
           
          ;lsr     tempH
          ;lsr     tempH
          ;lsr     temph
      
                    ;/8
      add     puf1,tempH
      inc     zaehl
      cpi     zaehl,1
      brne    weiter
         
          clr     zaehl
          


                                  
weit0:      cpi    flag,0
          brne   weit1
          sts    Rot,Puf1
          inc    Flag
             ;Flag +1
          rjmp   Kanalwahl
weit1:      cpi    flag,1
        brne   weit2
        sts    Gruen,Puf1
        inc    Flag  
            ;Flag +1
            rjmp   Kanalwahl
weit2:      
            sts    Blau,Puf1
            clr    Flag          ;Lösche Flag um wieder bei Null zu 


hier der Relevate Teil durch die Teilweise Rumprobierrei ist es ziemlich 
Caotisch. Serg und andere Register werden vorher gesichert und nachher 
wieder zurückgeschrieben hab das jetzt weggelassen

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
René wrote:
> hier der Relevate Teil durch die Teilweise Rumprobierrei ist es ziemlich
> Caotisch. Serg und andere Register werden vorher gesichert und nachher
> wieder zurückgeschrieben hab das jetzt weggelassen
Ich habe gesagt KOMPLETTER Code! Schreibe ich so undeutlich?

Und wenn das da oben alles in einer Interrupt Routine steht, dann 
brauchst Du Dich über gar nichts zu wundern!

Autor: René (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Seit wann darf in einem IR nur 3 Zeilen Code stehen?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
René wrote:
> Seit wann darf in einem IR nur 3 Zeilen Code stehen?
Habe ich nicht behauptet. Ich habe lediglich darauf hingewiesen, dass 
Warteschleifen in Interrupt Handlern meist dazu führen, dass es 
Timing-Probleme gibt. Und Du hast noch nicht mal erzählt, welchen 
Interrupt Du da überhaupt verwendest. Aber wenn Du nicht mit dem Code 
rausrückst, dann wünsche ich Dir noch einen schönen Tag. Das kann doch 
nicht so schwer sein!

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich mache solche Sachen eigentlich immer im Timer-IRQ.

Die Zeit des Timer-IRQ so lang, daß es für eine ADC-Wandlung + ein paar 
Takte Reserve reicht.

Dann muß ich die Fertig-Meldung des ADC garnicht auslesen, er ist immer 
fertig.
Wert holen, neu starten, Flag für Daten da setzen, raus.
Bei mehreren zu wandelnden Eingängen eben entsprechend viele Flags 
vereinbaren und dann im Kreis rum. Webb Dummy-Zyklen nötig sind 
(Umschalten von ARef oder sonstige Gründe, dann eben Hilfsflag und 
ersten Wert wegwerfen.

Wenn nur die Eingänge wechseln, kann man die Timer-Zeit auch auf die 
Hälfte setzen und im IRQ "dazwischen" den MUX schon umschalten.

Die Timerzeit hängt dann davon ab, wie oft ich überhaupt neue Werte 
einlesen will.

Wenn man sich das Zeitraster einaml aufgestellt hat, bleibt da nur wenig 
Code übrig.

Gruß aus Berlin
Michael

Autor: René (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Gute Idee das mit dem Timer IRQ aber den würde das auch mit einer 
normalen schleife als Pause funktionieren. Ich Zähle also im AVR Studio 
die Zyklen gebe noch ein bisschen reserve dazu und lese dann den ADC aus 
und habe immer die selbe Pause zwischendurch.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.