Forum: Compiler & IDEs ATMega8 Analogcomparator legt Programm lam


von Frank (Gast)


Lesenswert?

Hallo,

Ich habe glaube ich ein Verständnisproblem mit dem Analogcomparator des 
ATmega8.

Zur Zeit baue ich an einem BLDC Regler, muss aber sagen dass meine 
Programmierkenntnisse schon ein paar Jahre zurückliegen. Aber dass 
sollte nicht das Hauptproblem sein.

Bisher läuft der Motor mit Zwangskommutierung. Um nun den Analogen 
Komparator zu testen. Wollte ich ein Interrupt auslösen und dabei immer 
ein Pin toggeln lassen. Wenn das funktioniert möchte ich dann darüber 
Kommutieren lassen.

Zu meiner Konfiguration:

PD2 => externer Interruptpin zum einlesen meines PPM-Signals der 
RC-Funke
Funktioniert

PWM mit Timer1, PB1 PWM pin. Funktioniert!

Timer2
Timer für die zwangskommutierung (Interrupt). Funktioniert

So und nun zum AD-Komparator:
Erstmal schalte ich den Analog-Digital Wandler aus. Sollte standard 
Ausgeschaltet sein. Aber sicher ist sicher :-)
> ADSRA &= ~(1<<ADEN);

Dann schalte ich den Analog Comparaor ein und sage dass ich anstatt Ain1 
die AnalogDigital eingänge verwenden will (Multiplexer)
> SFOIR |= (ACME);

Dann aktiviere ich den Interrupt für den Analog Komparator, und möchte 
dass er bei einer steigenden Flanke auslösen soll
> ACSR |= ((1<<ACIE) | (1<<ACIS1) | (1<<ACIS2));

Dann möchte ich im Multiplexer den AD0 eingang verwenden
> ADMUX &= ~((1<<MUX2) | (1<<MUX1) | (1<<MUX0));

Der Interrupt sieht dann so aus:
ISR(ANA_COMP_vect)
{
   PORTB ^= (1<<PB2);    PB2 ist natürlich auf ausgang
}

Testweise habe ich auch die ganzen Pins die ich für die Analog 
komparator geschichte brauche auf eingang gesetzt.

Und nun das Problem wenn ich diese 2 (die ich oben beschrieben habe) 
verwende:
> ACSR |= ((1<<ACIE) | (1<<ACIS1) | (1<<ACIS2));
> ADMUX &= ~((1<<MUX2) | (1<<MUX1) | (1<<MUX0));

... Dann macht mein uC gar nichts mehr. Kommentiere ich sie wieder aus, 
dann läuft mein Programm

Hat jemand eine Idee? Verstehe ich die Register vom Analogkomparator 
nicht?

Wäre fein wenn mir jemand helfen könnte.

Grüße
Frank

von Stefan E. (sternst)


Lesenswert?

Frank schrieb:
>> ACSR |= ((1<<ACIE) | (1<<ACIS1) | (1<<ACIS2));

ACIS2 ???

von Karl H. (kbuchegg)


Lesenswert?

> SFOIR |= (ACME);

?
SFOIR |= (1<<ACME);

von Frank (Gast)


Lesenswert?

@ Stefan,

huch das kommt davon wenn man es abtippt.

Richtig ist:
ACSR |= ((1<<ACIE) | (1<<ACIS1) | (1<<ACIS0));

Genau so wie
SFOIR |= (ACME); Auch SFOIR |= (1<<ACME); bedeuten soll

Habe eben nochmal geguckt, ich hatte bei einem Interruptvector das _vect 
groß geschrieben. wusste gar nicht, dass der compiler so pingelig ist.

Und das war dann auch des Rätzels lösung, aber danke schön :-) da war 
ich schon 5 stunden davor gesessen und habe es nicht erkannt :-)

Grüße

von Frank (Gast)


Lesenswert?

Und danke für die Antworten :-)

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.