Forum: Mikrocontroller und Digitale Elektronik VMLAB: 40 kHz wird nicht erreicht und alle anderen Funktionen werden übersprungen


von Constantin Alexandru M. (azzuro)


Angehängte Dateien:

Lesenswert?

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?

von Constantin Alexandru M. (azzuro)


Lesenswert?

Zusatzinfo: Das 40kHz-Signal wird am Pin PB4 mit dem Interrupt vom Timer 
2 erzeugt.

von Constantin Alexandru M. (azzuro)


Lesenswert?

Weißt keiner einen Rat dazu?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von Constantin Alexandru M. (azzuro)


Lesenswert?

Ich hatte auf 50 gehabt und da war maximal 29850 Hz, ich habe nur den 
Wert nach oben verstellt um eine Änderung festzustellen.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von Constantin Alexandru M. (azzuro)


Angehängte Dateien:

Lesenswert?

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?

von Constantin Alexandru M. (azzuro)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.