ADC Interrupt mit Freerunning mode

OP #4660893
Hallo zusammen ich habe ein kleines Problem und zwar habe egal wie ich 
es drehe und wende, mein Programm funktioniert nicht.
Es ist für das Studium und wir arbeiten mit einem Hallsensor, der den 
Strom als Spannung zurück gibt(0A = 0,5V). 185mV pro A steigt die 
Spannung am Ausgang des Hallsensors.

Mein Problem dabei ist, dass das Programm niemals in die obere If 
Anweisung gelangt.
1
main
2
{
3
   ADMUX = (0 << REFS1)|(0 << REFS0)|(0 << MUX5)|(0 << MUX4)|(0 << MUX3)|(0 << MUX2)|(1 << MUX1)|(0 << MUX0);
4
   //Free_running Mode
5
   ADCSRB = (0 << BIN)|(0 << ACME)|(0 << ADLAR)|(0 << ADTS2)|(0 << ADTS1)|(0 << ADTS0);
6
   //ADC Interrupt aktivieren
7
   ADCSRA = (1 << ADEN)|(0 << ADSC)|(1 << ADATE)|(0 << ADIF)|(1 << ADIE)|(1 << ADPS2)|(0 << ADPS1)|(1 << ADPS0);
8

9
   ADCSRA |= (1 << ADSC);
10
   sei();
11
   while(1) ;
12
}
13

14
ISR(ADC-vect)
15
{
16
   cli();
17
   uint16_t current = ADC;
18
   current = (current - 102) / 37;//Strom = Spannung vom Hallsensor - 0,5V / 185mV
19
   if(current >= 55)
20
   {
21
      //tu was
22
   }
23
   else if(current <= 19)
24
   {
25
      //lass das
26
   }
27
   else
28
   {
29
      //Mache Weiter mit der letzten Sache
30
   }
31
   sei();
32
}
Gast #4660908
Hallo,

richtig ist sicherlich nicht: main { }

Wir kennen nicht deinen µC, deinen µC Takt, deine ADC-Takt, dein Ziel 
der festgelegten ADC Konfiguration.

Prosa: Es soll sein..

So etwas cli(); in einer pseudeo ISR sei(); ist unsinnig wenn es ein 
Atmel AVR µC ust.
Da fehlt Dir, evtl. noch die grundlegenden Infos, wie so eine µC 
arbeitet.
Gast #4660911
Ach und noch etwas, wie willst Du deine Aussage herleiten:
//Mein Problem dabei ist, dass das Programm niemals in die obere If
Anweisung gelangt.
Dein Programm hat ja nirgends Datenausgaben, wenn man es überhaupt 
übersetzen könnte!

Ein Debugger hilft Dir hier nicht weiter.
#4660996
Moin,

Also erstmal ein Lob an die vorbildliche Initialisierung ;-)
> ADMUX = (0 << REFS1)|(0 << REFS0)|(0 << MUX5)|(0 << MUX4)|(0 << MUX3)|(0 << 
MUX2)|(1 << MUX1)|(0 << MUX0);
usw.

Ansonsten vermute ich mal, dass du deine Integerarithmetik nicht im 
Griff hast: Aus dem ADC vermute ich mal, dass nicht mehr als 10bit 
kommen; also maximal der Wert 1023.

(1023-102)/37 ist aber nur 24; kann also niemals >55 werden.

Gruss
WK
Gast #4661080
Ich tu mich mal:
1
int main(void)
2
{
3
   ADMUX  = (1 << MUX1);
4
   //ADC Interrupt aktivieren
5
   ADCSRA = (1 << ADEN) | (1 << ADSC);
6
   sei();
7
   while(1) ;
8
}
9

10
ISR(ADC_vect)
11
{
12
   uint16_t current = ADC;
13
   current = (current - 102) / 37;//Strom = Spannung vom Hallsensor - 0,5V / 185mV
14
   if(current >= 55)
15
   {
16
      //tu was
17
   }
18
   else if(current <= 19)
19
   {
20
      //lass das
21
   }
22
   else
23
   {
24
      //Mache Weiter mit der letzten Sache
25
   }
26
}

Dergute W. schrieb:
> (1023-102)/37 ist aber nur 24; kann also niemals >55 werden.

Rüchtüg!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.