Analog Digital Converter ATMega8 mit Interrupt betreiben

OP #1965496
Lesenswert?
• ▲
▼
Hallo zusammen,

nachdem jetzt der ADC tadellos funktioniert, möchte ich nun die 
"einfache" ADC-Wandlung in ein Interruptgesteuertes Ereignis umbauen.

Funktioniert nur noch nicht so ganz.

Es soll ein Lauflicht aus 4 LEDs werden, je nachdem ob das Poti auf 0 V 
oder auf 5 V ist, soll die Laufgeschwindigkeit schneller oder langsamer 
sein.

Irgendwas stimmt aber mit meinem ISR-Abschnitt noch nicht.

Oder liegt der Fehler woanders?

Kann mal bitte jemand kurz drübersehen? Wenn ich es richtig deute, 
bleibt die Variable "result" ständig auf Null.

Christian
Angehängte Dateien:
#1965514
Lesenswert?
• ▲
▼
Das geht nicht
1
      PORTD |= (1<<PD0); _delay_ms(result); PORTD &= ~(1<<PD0);

_delay_ms kann man nicht mit Variablen benutzen.
D.h. man kann schon. Nur stimmen die Zeiten nicht
1
void my_delay_ms( uint16_t value )
2
{
3
  while( value ) {
4
    _delay_ms( 1 );
5
    value--;
6
  }
7
}
8

9
....
10

11
      PORTD |= (1<<PD0); my_delay_ms(result); PORTD &= ~(1<<PD0);




1
ISR(ADC_vect) 
2
{
3
  char sreg=SREG; // Interrupt Status auslesen
4

5
  cli(); // Interrupts aus
6
  
7
  // Ergebnis der Konvertierung auslesen
8
    result = ADCW;
9
  
10
  SREG=sreg; // Interrupt Status zurückschreiben
11
}

Lass das SREG in Ruhe. Das ist ein Register, das geht dich nichts an!
cli brauchst du nicht innerhalb einer ISR. In einer iSR sind Interrupts 
automatisch aus.
Gast #1965517
Lesenswert?
• ▲
▼
>_delay_ms(result);

Blödsinn Nummer 1:
_delay_ms(); arbeitet nur mit Konstanten Werten.

Für variable delays bau dir eine Routine ala:

void MyDelayMs(uint16_t delay)
{
 while(delay--) _delay_ms(1);
}

Blödsinn Nummer 2:

cli(); in einem Interrupt macht keinen Sinn

ISR(ADC_vect)
{
  // Ergebnis der Konvertierung auslesen
    result = ADCW;
}

Ach wie schön klein ist diese Interruptroutine jetzt;)
Und funktioniert ohne das ganze Geraffel das von einem
unglaublichen Halbwissen zu stammen scheint.
OP #1965544
Lesenswert?
• ▲
▼
holger, spar dir diese saublöde Anmache, bitte.

Wenn du dich über "Geraffel" und "Halbwissen" beschwerst, dann macht 
vielleicht mal dieses Forum dicht, schließlich ist es dafür da, Fragen 
von Personen zu beantworten die sich nicht so gut auskennen (Ich).

Da kann ich sonst auch genausogut meine Glaskugel zu Hause fragen, die 
gibt mir bestimmt keine so dummen Kommentare als Antwort.

Falls jemand noch konstruktive Vorschläge hat, die mir wirklich 
weiterhelfen, ich bin ganz Ohr. Danke.

Die besagten Vorschläge von vorhin brachten übrigens keine Besserung im 
Programmablauf. Trotzdem Danke.

Christian

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.