mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM-Problem mit PIC16F627A - ISR zu langsam?!


Autor: Bastelheini (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin schon lange ganz verzweifelt am Probieren, eine PWM-Routine zu 
schreiben. Momentan ist sie nicht funktionsfähig...

1) Ich habe einen PIC16F627A mit 4MHz getaktet; die Interrupt-Routine 
sollte mit mindestens 2MHz aufgerufen werden (Vorteiler deaktiviert), 
aber irgendwie will mein PIC nicht. Daher flackert auch die Anzeige wie 
wild.
Code im Anhang. Seht ihr den Fehler? Bestimmt irgendwas mit den 
Registern falsch eingestellt, aber ich find's einfach nicht...

2) Gibt's irgendwo einen guten PWM-Table? Meiner (das table[] array) ist 
ja noch ziemlich notdürftig. Ist übrigens auf die Obergrenze 256 
bezogen, wie ihr euch sicherlich denken könnt. Die ISR zählt eine 
Variable c hoch bei jedem Aufruf, erreicht aber pro Sekunde (!) nur ca. 
4000, was darauf hindeutet, dass die Vorteiler noch aktiv sind, obwohl 
ich sie ja ausgeschaltet hab! Wo ist der Fehler?

Beste Grüße,
und danke im Voraus für eure Hilfe,
Jens

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>1) Ich habe einen PIC16F627A mit 4MHz getaktet; die Interrupt-Routine
>sollte mit mindestens 2MHz aufgerufen werden

Das geht gar nicht mit 2MHz. Der PIC arbeitet
intern mit CPU-Takt/4. Das sind schon mal nur 1MHz.
Dein Programm in der ISR braucht auch recht lange.
Du kannst schon froh sein das du 4kHz erreichst.

Autor: Bastelheini (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, 1MHz ist ja auch genug.

Aber auch als nichts anderes in der ISR drinstand, über 4000 ging der 
Zähler nie pro Sekunde... Das KANN doch nicht sein, oder?

Gruß
Jens

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Aber auch als nichts anderes in der ISR drinstand, über 4000 ging der
>Zähler nie pro Sekunde

Wieso? Das passt doch:

1MHz Takt intern. Timer0 Overflow alle 256 Ticks.
1000000 / 256 = 3906

Wenn du möchtest das der Timer0 schneller überläuft
musst du ihn in der ISR auf einen neuen Wert setzen.
Z.B. 128. Dann solltest du auf ca. 8000 kommen.

Autor: Bastelheini (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem hat sich gelöst...

Das Resetten des Interrupt-Flags war unnötig; nach dem Entfernen von

T0IF = 0;

aus der ISR ging alles wie geplant... Oh mann. Aber warum?

Gruß
Jens

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Das Resetten des Interrupt-Flags war unnötig; nach dem Entfernen von

>T0IF = 0;

Pfui Deibel! Das macht man nicht.

>aus der ISR ging alles wie geplant... Oh mann. Aber warum?

Weil der Interrupt nicht gelöscht wird und sofort
wieder aufgerufen wird.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:

>Weil der Interrupt nicht gelöscht wird und sofort
>wieder aufgerufen wird.

Da kannst du dir den Timer auch gleich sparen
und das Programm in die Mainloop setzen. Wird
dann sogar noch schneller ;)

Autor: Bastelheini (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber dann hängt's von den sonstigen Anwendungen ab, die noch "nebenher" 
laufen, so ist's eher unabhängig...

Gruß
Jens

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Aber dann hängt's von den sonstigen Anwendungen ab, die noch "nebenher"
>laufen, so ist's eher unabhängig...

Wenn du den Interrupt nicht löschst gibt es
für deine sonstigen Anwendungen sowieso fast keine
Rechenzeit mehr. Kannst du so also vergessen.
Wie schnell soll die PWM denn laufen?

Autor: Bastelheini (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So mit 100Hz dachte ich.

Autor: morph1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Der PIC arbeitet intern mit CPU-Takt/4. Das sind schon mal nur 1MHz.

woher kommt dieser perverse mythos? das wär mir echt noch nie 
aufgefallen.

Autor: Bernd Rüter (Firma: Promaxx.net) (bigwumpus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na, toller Thread.

Jeder Gast darf mal sein Unwissen präsentieren.

Welche PWM soll mit 2MHz laufen und 100Hz-Impulse liefern ?

Wo ist der Sinn ?

Warum keine Hardware-PWM ?

Warum kein Lesen der Datenblätter ?

Autor: Patrick Weinberger (seennoob)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Hast schon mal geschaut ob der Watchdog mitläuft, dass war mal mein 
Problem.

Noch was nimm stat int lieber unsigned char das spart dir schon mal ein 
paar Befehle und einfach gewisse sachen vereinfachen usw.
So müsste dann der code etwas schneller werden.


MFG Patrick

Autor: Bastelheini (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Patrick, ich werde das ausprobieren.

@Bernd: Ich hab nie behauptet ein Profi zu sein, aber die PWM-Routine im 
Quelltext habe ich nach meinem besten Wissen erstellt. Sie sollte ja 
eigentlich so schnell wie möglich laufen. Habe auch im 
PICC-Lite-Compiler examples-Ordner gefunden, dass man das Interrupt-Flag 
(hier: T0IF) am Ende der ISR wieder löschen soll. Was hat es damit auf 
sich?

@Alle: Wie oft wird die Routine denn jetzt aufgerufen? Wir haben 4MHz 
Takt, der Timer1 teilt das durch 2^8 (256), das wären dann 15625mal pro 
Sekunde, oder? Aber die Zahl erreicht er doch nicht. Warum?

Gruß
Jens

Autor: Patrick Weinberger (seennoob)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Bastelheini

Du hast nen kleinen Rechenfehler gemacht. Wenn mich nicht alles täuscht 
so kommt am Timer fosc/4 an also hast stat 15625 nur 3906!!!

Also mal Datenblatt lesen

MFG Patrick

Autor: Bastelheini (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja stimmt, das macht Sinn.

Aber vorher (als im Code noch T0IF = 0; am Ende der ISR stand) waren es 
3906 Durchläufe pro Sekunde. Aber es flimmerte mit der PWM-Methode, die 
ich im obigen Quellcode verwendete. Aber nun, nach Entfernen, läuft es 
genau so schnell (3906Hz). Aber 100Hz müssten doch ausreichen?!?!

Autor: Bernd Rüter (Firma: Promaxx.net) (bigwumpus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das T0IF-Bit muß in der Software (in der INT-Routine) gelöscht werden.
Bleibt es stehen, wird nach Verlassen der Int-Routine gleich sofort 
wieder ein neuer Int ausgelöst.

Dann kann man den Kram auch direkt als Main-Loop programmieren....


ABER !

Der 627A hat doch ein Hardware-Modul zer Erzeugung einer PWM ganz ohne 
Software und INTs!!!

Was willst Du eigentlich ansteuern ?

Autor: Bastelheini (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat er echt? Das ist ja super. Stand NICHT in meinem Datasheet!

Ich hab mal gegoogelt und direkt eins gefunden, wo das ausführlich 
erklärt wird, danke für den Hinweis! Da könnte man sich doch echt 
aufregen; im Datasheet was ich habe steht KEIN wort von PWM!

Danke nochmal,
melde mich mal wieder wenn's funktioniert!

Gruß
Jens

Autor: Bastelheini (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja: Ich will die Helligkeit von LEDs dimmen; ich steuere nehrere per 
CD4094-CMOS-Schieberegister an, und die haben einen ENABLE-Pin, den ich 
PWMmen will.

Jens

Autor: Bastelheini (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt läuft's, danke nochmals für den Hinweis, Bernd. :-))

Gruß
Jens

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.