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


von randy (Gast)


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?

von Falk B. (falk)


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

von randy (Gast)


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?

von Falk B. (falk)


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

von randy (Gast)


Angehängte Dateien:

Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@randy (Gast)

Und du wunderst dich, dass dein Timer durch den ADC ausgebremst wird?
1
'******************************************************************************
2
'* Interrupt-Service-Routine INT1                                             *
3
'******************************************************************************
4
Int1_isr:
5
 Select Case Tor_over
6
  Case 0:
7
   Start Adc
8
   Ad_hilfswert0 = Getadc(0)
9
   Stop Adc
10
   Int1zaehler = 1
11
  Case 1:
12
   Start Adc
13
   Ad_hilfswert1 = Getadc(0)
14
   Stop Adc
15
  Case Else : Int1zaehler = 0
16
 End Select
17
Return

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

MFG
Falk

von randy (Gast)


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:
1
 Do
2
3
 If Int1zaehler = 1 Then
4
   Start Adc
5
   Ad_hilfswert0 = Getadc(0)
6
   Stop Adc  
7
 End If
8
9
 If Int1zaehler = 2 Then
10
   Start Adc
11
   Ad_hilfswert1 = Getadc(0)
12
   Stop Adc    
13
 End If
14
15
 If Tor_over = 1 Then Exit Do
16
17
 Loop

und die INT1-ISR sieht dan folgendermaßen aus:
1
Int1_isr:
2
 Select Case Tor_over
3
  Case 0:
4
   Int1zaehler = 1
5
  Case 1:
6
   Int1zaehler = 2
7
  Case Else : Int1zaehler = 0
8
 End Select
9
Return

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

von Falk B. (falk)


Lesenswert?

Schon besser ;-)

von randy (Gast)


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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.