Forum: Mikrocontroller und Digitale Elektronik Timer & Interrupt in "C" für einen PIC16F887A


von Lukas K. (luckystrike)


Lesenswert?

Guten Morgen,

ich suche seit mehreren Tagen eine Hilfe oder ein Nachschlagewerk, wo 
für Microchip µC in der Sprache "C" programmiert wird.
Folgendene Seiten hab ich schon gefunden & finde es nicht für mein 
Problem ansprechend:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR#Die_PWM-Betriebsart
http://www.mikrocontroller.net/articles/Interrupt

Ich würde mich eine Hilfe dies bezüglich sehr freuen, weil es mir bei 
meinem Projekt sehr weiter hilft.

MfG,
Lukas

von Chris B. (dekatz)


Lesenswert?

Vielleicht hier:
http://pic-projekte.de/wordpress/?p=133#more-133
Dort wird auch auf Interrupts eingegangen.

Speziell was Interrupts betrifft findest du die genaue Vorgangsweise in 
der Dokumentation des verwendeten Compilers.
(ohne Kentniss der PIC-Familie und des verwendeten Compilers kann man 
kaum sinnvolle Tips geben).

von San L. (zwillingsfreunde)


Lesenswert?

Dir ist klar, dass der erste Link für AVR's ist? Erklärt dir zwar das 
Beispiel relativ gut, da es vom Prinzip her überall das selbe sein 
dürfte, allerdings wirst du erstens mit den Registernamen nichts 
Anfangen können, zweitens wirst du kleine Unterschiede zwischen PIC <-> 
AVR so nicht feststellen.

Für das bessere Verständniss von PIC's rate ich wie immer zu:
http://www.sprut.de/electronic/pic/index.htm

Sprut ist eine geniale Seite, wenn auch langsam etwas alt. Da du dich 
aber auch nicht gerade für den neusten Controller entschieden hast, wird 
das schon gehen.

Sprut basiert zwar Hauptsächlich auf Assembler, du findest sehr viele 
Beispiele aber auch in C.

Ansonsten ist das Thema an keinem mir bekannten Ort wirklich ausführlich 
erklärt. Am besten wirst du vorran kommen, wenn du deine Probleme die 
sich dir beim Programmieren stellen individuell gezielt googelst, oder 
du kaufst dir ein Lernbuch, davon gibt es viele tolle und die kosten 
alle nicht sonderlich viel.

Hoffe konnte helfen
Gruss

von Lukas K. (luckystrike)


Lesenswert?

Danke für die schnellen Antworten.

San Lue schrieb:
> Dir ist klar, dass der erste Link für AVR's ist? Erklärt dir zwar das
> Beispiel relativ gut, da es vom Prinzip her überall das selbe sein
> dürfte, allerdings wirst du erstens mit den Registernamen nichts
> Anfangen können, zweitens wirst du kleine Unterschiede zwischen PIC <->
> AVR so nicht feststellen.

Ich weiß, dass die Links von AVR ist bzw. AVR´s. Es sollte halt nicht so 
aussehen, als würde ich hier irgendwas reinposten, anstatt selber zu 
googlen.

Chris B. schrieb:
> Speziell was Interrupts betrifft findest du die genaue Vorgangsweise in
> der Dokumentation des verwendeten Compilers.
> (ohne Kentniss der PIC-Familie und des verwendeten Compilers kann man
> kaum sinnvolle Tips geben).

Kenntnisse über den PIC und den Compiler habe ich, weil wir seit einem 
Jahr in der Ausbildung programmieren. Das Problem ist nur, dass mein 
Ausbilder mir keine Hilfe kann über Interrupts und in der Schule machen 
wir seit einem halben Jahr Assembler Grundbefehle.

San Lue schrieb:
> Am besten wirst du vorran kommen, wenn du deine Probleme die
> sich dir beim Programmieren stellen individuell gezielt googelst, oder
> du kaufst dir ein Lernbuch, davon gibt es viele tolle und die kosten
> alle nicht sonderlich viel.

Ich google seit circa einem Monat nach meinem "Problem" und lande nur 
auf AVR Seiten bzw. auf AVR Foren. Außerdem hatte ich mir 2 Bücher schon 
gekauft für "C-Prgrammieren".

MfG,
Lukas

von GroberKlotz (Gast)


Lesenswert?

Hallo Lukas

vielleicht hilft Dir diese Seite weiter:
[http://www.engscope.com/pic24-tutorial/7-interrupts/]

mfG GroberKlotz

von Chris B. (dekatz)


Lesenswert?

Oder hier, das ist für PIC16 und ziemlich ausführlich.
http://www.gooligum.com.au/tutorials/midrange/PIC_Mid_C_3.pdf

von San L. (zwillingsfreunde)


Lesenswert?

Lukas K. schrieb:
> Ich google seit circa einem Monat nach meinem "Problem"

Was ist denn dein Problem? Wenn du es uns beschreiben magst, können wir 
dir eventuell weiterhelfen.

Lukas K. schrieb:
> und in der Schule machen
> wir seit einem halben Jahr Assembler Grundbefehle.

Das ist endlich mal schön zu hören. Auch ich habe die ersten zwei Jahre 
in der Schule nur Assembler programmiert, glaub mir, du wirst später 
einmal sehr froh darüber sein es zu beherrschen. Zumindest ich bin 
regelmässig froh darüber, da es mir sehr weiterhilft.

von Lukas K. (luckystrike)


Lesenswert?

San Lue schrieb:

> Was ist denn dein Problem? Wenn du es uns beschreiben magst, können wir
> dir eventuell weiterhelfen.

Ich habe nämlich vor eine binäruhr zu programmieren mit einem 
DCF77-Empfänger.
Wo dran ich scheitere ist, dass mir die Grundlagen fehlen für externe 
Interrupts, zwei Timer zu programmieren, Abtastung von Signalen & 
parallel zum Interrupt das Hauptprogramm weiterlaufen zu lassen (die Uhr 
soll nämlich durch den zweiten Timer weiter zählen bis zur 
Synchronisierung sprich Ablauf des interrupts)

MfG,
Lukas

von Max H. (hartl192)


Lesenswert?

Lukas K. schrieb:
> Kenntnisse über den PIC und den Compiler habe ich
Wir wissen aber nicht welcher Compiler du verwendest und je nach 
Compiler wird das mit den Interrupts ein bisschen anders gemacht.

Lukas K. schrieb:
> in der Schule machen
> wir seit einem halben Jahr Assembler Grundbefehle.
Habe wir auch, bei uns waren Interrupts in diesem halben Jahr auch drin.

Was genau ist dein Problem mit den Interrupts?
Wie du alles Konfigurieren musst, oder nur wie du die ISR erstellst,...?

Da du ASM kannst, sollte es kein Problem sein Sprut zu verstehen:
http://www.sprut.de/electronic/pic/grund/timer/timer.htm
http://www.sprut.de/electronic/pic/int/int.htm
Die Register bleiben die gleichen ob C oder ASM.

: Bearbeitet durch User
von Lukas K. (luckystrike)


Lesenswert?

Max H. schrieb:
> Wir wissen aber nicht welcher Compiler du verwendest und je nach
> Compiler wird das mit den Interrupts ein bisschen anders gemacht.

Ich benutze MPlab mit dem HighTech-Compiler (C).

#

Max H. schrieb:
> Was genau ist dein Problem mit den Interrupts?

Das Problem ist, dass ich noch nie irgendwas mit Interrupts programmiert 
habe. Was unser Ausbilder beigebracht hat in "C" ist bis jetzt nur, wie 
man eine Variable hochzählen lässt, verschiedene Programme durchlaufen 
lassen kann, einfache Grundlagen des Multiplexens.

Ich fühle mich persönlich jetzt wie ein Kind im Meer, was nicht 
schwimmen kann.

von Peter D. (peda)


Lesenswert?

Lukas K. schrieb:
> Wo dran ich scheitere ist, dass mir die Grundlagen fehlen für externe
> Interrupts, zwei Timer zu programmieren, Abtastung von Signalen &
> parallel zum Interrupt das Hauptprogramm weiterlaufen zu lassen

Nicht immer so kompliziert denken.
Du brauchst nur einen Timerinterrupt, z.B. 10ms. Damit kannst Du bequem 
die Puls/Pausendauer abtasten und auch eine Uhr (100 * 10ms = 1s) laufen 
lassen.

von San L. (zwillingsfreunde)


Lesenswert?

Lukas K. schrieb:
> Ich fühle mich persönlich jetzt wie ein Kind im Meer, was nicht
> schwimmen kann.

Nicht den Kopf hängen lassen. Als ich damit angefangen habe, habe ich 
mir auch oft den Kopf zerbrochen.

Im zweiten Link, welchen Max gepostet hat ist ein super Beispiel, damit 
habe ich damals auch meinen allerersten Interrupt Programmiert. Am 
besten nimmst du diesen Code und passt ihn für deinen Controller an, 
viel zu machen gibts da ja nicht. Hast du das erst einmal geschafft, 
kannst du dann auch andere Interrupts ausprobieren, als Grundgerüst 
kannst du ja immer diesen Code verwenden.

Peter Dannegger schrieb:
> Nicht immer so kompliziert denken.

Gutes Stichwort, nur leider nicht immer ganz so einfach, wenn einem die 
Kentnisse fehlen und man oft aus einer Fliege einen Elefanten macht.
Nimm dir das von Peter zu Herzen, den Ablauf den er da beschreibt ist 
eigentlich bereits alles was du brauchst.

von Max H. (hartl192)


Lesenswert?

Da du ASM vermutlich besser kannst als C könntest du versuchen mit 
Spruts Hilfe eine KED per Timer Interrupt blinken zu lassen um Timer und 
Interrupts zu verstehen und das gelernte dann in C anwenden.

von Lukas K. (luckystrike)


Lesenswert?

Max H. schrieb:
> Da du ASM vermutlich besser kannst als C könntest du versuchen mit
> Spruts ...

Also ASM kann ich genauso viel wie in C. Sprich, ich kann in ASM & C 
eine Stromstoßschaltung programmieren ohne Fehler. Da aber mein Lehrer 
jetzt mit C anfängt in der Schule nach der Programmierung der 
Stromstoßschaltung, wird mein Wissen in Richtung ASM nicht weiter 
wachsen.
Deswegen würde ich ja gerne in C das alles lernen.

MFG,
Lukas

von X4U (Gast)


Lesenswert?

Lukas K. schrieb:
> Das Problem ist, dass ich noch nie irgendwas mit Interrupts programmiert
> habe.

Was kein Problem ist da bei einem Interrupt eine Funktion aufgerufen 
wird.  die Interrupt Funktion. Das war's mehr ist da nicht von der C 
Seite aus.

Außer natürlich das erst beim Rücksprung ins Hauptprogramm das Interrupt 
Flag gesetzt werden sollte.


Dann gibt es noch ein wenig Lokalkolorit, je nach Prozessorsorte.

Bei PICs hat sich Mikrochip folgendes überlegt.

1. Wir nehmen nur eine Routine für den Interrupt. Wenn mehrere kommen 
muss der Autor des Programms halt abfragen welche ausgelöst wurden.

2. Wenn alle Interrupts abgefrühstückt sind kann er die Routine 
verlassen.

Wenn er so schlau ist zu prüfen ob am Ende noch einer gekommen ist dann 
ist das schön für ihn, er hat kapiert was wir uns gedacht haben. Das 
Problem des Interrups im Interrupt ist per Design gelöst.

von Lukas K. (luckystrike)


Lesenswert?

Guten Morgen,

mein Ausbilder will mit mir bald anfangen mit mir Interrups 
programmieren & zwar die, wo ein Timer nach einer bestimmten Anzahl von 
Überläufen das Interrup programmunabhängig aufruft.

Ich hatte auch schonmal angefangen sowas zu programmieren, aber entweder 
hat mein Programm gar nicht mehr funktioniert oder man hat über die Leds 
den Interrup nihct gesehen (sprich, es wurde keienr ausgelöst).

von San L. (zwillingsfreunde)


Lesenswert?

Lukas K. schrieb:
> mein Ausbilder will mit mir bald anfangen mit mir Interrups
> programmieren & zwar die, wo ein Timer nach einer bestimmten Anzahl von
> Überläufen das Interrup programmunabhängig aufruft.
>
> Ich hatte auch schonmal angefangen sowas zu programmieren, aber entweder
> hat mein Programm gar nicht mehr funktioniert oder man hat über die Leds
> den Interrup nihct gesehen (sprich, es wurde keienr ausgelöst).

Und was erwartest du nun von uns? Du erzählst uns gerade, was du bereits 
getan hast, was nicht funktioniert hat und fertig. Poste doch am besten 
mal deinen Code, dann können wir ihn anschauen und vielleicht finden wir 
ja den Fehler.

von Lukas K. (luckystrike)


Lesenswert?

Was ich eigentlich gerne wollte ist, dass mir eine Hilfe bzw. eine Seite 
gezeigt wird, wo ich Interrupts & Timer Einstellungen auch in C wieder 
finden kann & dementsprechend auch programmieren kann.
Zusammengefasst nichts andere als eine Hilfestellung für Interrupts & 
Timer.

von Erich (Gast)


Lesenswert?


von Lukas K. (luckystrike)


Lesenswert?

Durchgelesen hatte ich mir das schon aufjedenfall, bloss hab ich die 
Links/Seiten hier nicht gesehen.

Danke schön
 MfG

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.