mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik timer0 und adc bei mega32 stören sich!?


Autor: randy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich starte Timer0, warte eine gewisse Zeit ab indem in der ISR eine 
Variable hochgezählt wird und lasse dann mein Programm weiterlaufen. Bei 
einem externen Interrupt startet eine AD-Wandlung. Passiert dies während 
der "Wartezeit" verlängert sich diese? Sollte der Timer nicht eigentlich 
unabhängig von irgendwelchen Interrupts laufen?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@randy (Gast)

>einem externen Interrupt startet eine AD-Wandlung. Passiert dies während
>der "Wartezeit" verlängert sich diese?

Nein.

> Sollte der Timer nicht eigentlich unabhängig von irgendwelchen >Interrupts 
laufen?

Das tut er auch.

MFG
Falk

Autor: randy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe mich wohl etwas falsch ausgedrückt, sorry.

Wenn während der Zeit in der ich auch einen bestimmten Zählerstand 
meiner Variable warte, die von der Timer0 ISR hochgezählt wird, eine 
Adwandlung stattfindet, verlängert sich die Zeit bis die Variable 
hochgezählt wurde. Mega32 läuft mit 14,7456 MHz, die Zeit die länger ist 
mit AD-Wandlung sind knapp 330µs
Ist das normal?  Bzw. was kann ich dagegen tun?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@randy (Gast)

>Wenn während der Zeit in der ich auch einen bestimmten Zählerstand
>meiner Variable warte, die von der Timer0 ISR hochgezählt wird, eine
>Adwandlung stattfindet, verlängert sich die Zeit bis die Variable
>hochgezählt wurde.

Klingtz nach Programmierfehler. Poste mal VOLLSTÄNDIGEN Quelltext als 
ANHANG.

MFG
Falk

Autor: randy (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
im anhang der quellcode inkl. Beschreibung des Problems. Vielen Dank für 
die schnelle Hilfe

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@randy (Gast)

Und du wunderst dich, dass dein Timer durch den ADC ausgebremst wird?
'******************************************************************************
'* Interrupt-Service-Routine INT1                                             *
'******************************************************************************
Int1_isr:
 Select Case Tor_over
  Case 0:
   Start Adc
   Ad_hilfswert0 = Getadc(0)
   Stop Adc
   Int1zaehler = 1
  Case 1:
   Start Adc
   Ad_hilfswert1 = Getadc(0)
   Stop Adc
  Case Else : Int1zaehler = 0
 End Select
Return

Schau dir mal den Artikel Interrupt an und überlege, was in dem 
Ausschnitt oben falsch ist.

MFG
Falk

Autor: randy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja ich weiß dass das nicht gerade optimal ist soviel in einer ISR zu 
machen, allerdings wartet mein Hauptprogramm ja in der Do Loop Schleife 
bis die Zeit vergangen ist ich muss aber währenddessen AD-wandeln. Ich 
werde als nächstes das hier ausprobieren:

Im Unterprogramm Messung:
 Do

 If Int1zaehler = 1 Then
   Start Adc
   Ad_hilfswert0 = Getadc(0)
   Stop Adc  
 End If

 If Int1zaehler = 2 Then
   Start Adc
   Ad_hilfswert1 = Getadc(0)
   Stop Adc    
 End If

 If Tor_over = 1 Then Exit Do

 Loop

und die INT1-ISR sieht dan folgendermaßen aus:
Int1_isr:
 Select Case Tor_over
  Case 0:
   Int1zaehler = 1
  Case 1:
   Int1zaehler = 2
  Case Else : Int1zaehler = 0
 End Select
Return

Meinst du so müsste es klappen? Vielen Dank für deine Hilfe

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon besser ;-)

Autor: randy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok jetzt verlängert sich zwar die zeit nichtmehr, allerdings bekomme ich 
innerhalb der Do Loop Schleife auch keine AD-Wandlung, bzw. maximal 2 
Digits anstatt 80 die es sein müssten. weiß irgendwer rat?

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.