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?
@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
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?
@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
im anhang der quellcode inkl. Beschreibung des Problems. Vielen Dank für die schnelle Hilfe
@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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.