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
@ 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
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.