Hallo, ich simuliere mein Programm mit VMLAB und mein Problem liegt bei der Erzeugung eines 40 kHz-Signals. Ich verwende einen Atmega 8535 und dieser arbeitet mit 4,096 MHz. Die Schaltung ist bereits aufgebaut. Zum Problem: Mit meiner Interrupt-Funktion erreiche ich max. 29850 Hz und dazu kommt, das alle anderen Funktionen nicht aufgerufen werden, weil der uC anscheinend nur mit diesem Interrupt beschäftigt ist. Normalerweise müssten die 4,096 MHz trotz Maschinenzyklus die 40 kHz generieren können. Was läuft da falsch?
Zusatzinfo: Das 40kHz-Signal wird am Pin PB4 mit dem Interrupt vom Timer 2 erzeugt.
Weißt keiner einen Rat dazu?
Constantin Alexandru M. schrieb: > Weißt keiner einen Rat dazu?
1 | // (1/80000)/(1/(4096000/1)) = 51
|
2 | OCR2 = 70-1; |
Du willst OCR2 auf 51 setzen, setzst den aber auf 69. Warum ? Mit:
1 | OCR2 = 50; |
kommst du auf knapp über 40KHz.
Ich hatte auf 50 gehabt und da war maximal 29850 Hz, ich habe nur den Wert nach oben verstellt um eine Änderung festzustellen.
Constantin Alexandru M. schrieb: > Ich hatte auf 50 gehabt und da war maximal 29850 Hz, ich habe nur den > Wert nach oben verstellt um eine Änderung festzustellen. Nein. F=4.096MHz, Prescaler=1, OCR2=69 ergibt 29,257.143 Hz. F=4.096MHz, Prescaler=1, OCR2=50 ergibt 40,156.863 Hz. P.S. M8535 hat auch OC2 Output (PD.7) da wird das von alleine gemacht, man spart sich ISR und verliert keine Zeit.
Die 40 khz habe ich hingekriegt, aber komischerweise fängt das Programm immer bei einem Flankenwechsel am Pin PD7 von neu an und der Rest des Programms arbeitet deswegen nicht richtig. Watchdog hat auch nicht ausgelöst. Wie kann ich das verhindern?
Wenn ich den Timer 2 "raus kommentiere", dann läuft das Programm ganz normal, bis auf das 40 kHz Signal halt. Beim Flankenwechsel, bevor main () von Anfang an aufgerufen wird, ist der letzte Programmbefehl "if (pwm_setting_tmp[j]<min)". Die PWM-Steuerung geschieht über den Timer 1. Beide Timer laufen über die Output Compare Match Interrupt Funktion. Timer 1 -> PWM Steuerung (6 Kanäle) -> PD0, PD1, PD3, PD4, PD5 und PD6 Timer 2 -> 40 kHz Signal -> PD7 (OCR2) Ich schätze mal, der Timer 2 ist im Konflikt mit dem Timer 1 und lässt das Teilprogramm bezüglich der PWM Steuerung nicht bis zum Ende arbeiten. In der Funktion pwm_update () habe ich sowohl mit cli() bzw. sei() als auch mit TIMSK &= ~(1<<OCIE2) bzw. TIMSK |= (1<<OCIE2) am Anfang und am Ende eingesetzt und es passierte dasselbe, Programm fängt wieder bei main() an. Wie kann man das entkomplizieren?
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.

