Forum: Mikrocontroller und Digitale Elektronik ADC Interrupt mit Freerunning mode


von Dominik V. (nasryn)


Lesenswert?

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
}

von Ralf G. (ralg)


Lesenswert?

Dieter V. schrieb:
> ISR(ADC-vect)

Das wird nicht mal compilert!

von Karl M. (Gast)


Lesenswert?

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.

von Karl M. (Gast)


Lesenswert?

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.

von Dergute W. (derguteweka)


Lesenswert?

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

von Draco (Gast)


Lesenswert?

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!

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.