High-/Low Priority Interrupt PIC18F2450

Begonnen von Ottmar, 24.04.2023, 17:05:12 CEST

Vorheriges Thema - Nächstes Thema

Ottmar

Hallo,
durch einen Beitrag in diesem Forum wurde ich angeregt, mich mit HIGH-/LOW-Priority-Inerrupt zu beschäftigen. Nach einigem Stolpern  habe ich dies per Assembler mit einem PIC18F2450 verwiriklichen können. Nun blinkt es 10x per HP-ISR und geht danach in den SLEEP-Modus und kann nahc Belieben per Tastendruck mittels derLP-ISR wieder zum Blinken erweckt werden.
Meine Frage:
Da mir selbst nichts dazu einfällt, hat jemand eine Idee zu welcher Probemlösung (ausser zum Wecken aus SLEEP) so ein zusätzlicher Low-Priority-Interrupt die ultimate Problemlösung sein könnte?
Gruß Ottmar

PICkel

Hallo,

die HP-ISR kann eine LP-ISR unterbrechen und sich quasi "reindrängeln".
Nach Beenden der HP-ISR wird die LP-ISR zu Ende abgearbeitet.
So kann man bei zeitkritischen Abläufen eine schnelle Reaktion des PIC erreichen ohne auf das Ende einer momentan aktiven LP-ISR zu warten.
Es kann also durchaus sinnvoll sein, untergeordneten Prozessen eine LP-ISR zuzuweisen.

Gruß
PICkel

picass

Hallo Ottmar und willkommen im Forum!
Is ja ein Ding, dass es noch Assembler-Programmierer gibt. :)

Ein praktisches Beispiel könnte ich mit der von mir gerade bearbeiteten Steuerplatine für das elektr. Öffnen und Schließen eines Garagentores beibringen. Da wirken ja diverse Schalter auf den "normal" schlummernden PIC ein. Der Sicherheits-Drehschalter in der G-Tür oder aber das Funkmodul könnten den PIC auch ganz ohne IRQ aus dem Schlummer reißen. Selbst habe ich aber doch die am PORT A vorhandenen INT-Routinen mit ihrem IRQ genutzt, zum Einen rein aus Gründen der Übung, zum Anderen, weil bei dieser IRQ-Nutzung diese Ports dann über einen Schmitt-Trigger im Eingang verfügen. Dafür könnte man also gut einen LP-IRQ nehmen.
Laut Vorschrift soll jedes elektrisch und fernsteuerbar zu bewegenden G-Tor über eine Stopp-Vorrichtung verfügen, die das Tor stoppt und danach ein Stück zurück fahren lässt, wenn ein Hinderniss im Bewegungsbereich droht, eingeklemmt zu werden. Für dieses Ereignis würde sich ein HP-IRQ bestens eignen, weil der Alles andere sofort unterbrechen kann.

Etwas sollte man allerdings sehr im Auge behalten, wenn man zwei verschiedene Power-IRQs gleichzeitig nutzt: es wäre sicher wichtig, diverse Register bei IRQ-Eintritt zu sichern, damit nach dem "sich-einmischenden" IRQ der vorige Zustand wieder her gestellt werden kann.
Grüße, picass

Ottmar

@picass 
Assembler ist fast eine Leidenschaft, macht mir einfach Spass!Wenn's klemmt bringe ich vielleicht in C auch was fertig, aber Assembler ist so
rictig knackig! :)

@Alle
Danke einmal für die Anworten!
Ok,meine HP-ISR hat ein Intervall von 5ms (erzeugt Takt für eine Uhr). Meine LP-ISR hat eine Abarbeitungszeit von z.B. 8ms.

Wenn ich das richtig verstanden habe, wird die LP-ISR z.B. nach 4ms von der HP-ISR unterbrochen, nach 5ms ist die HP-ISR fertig und die LP-ISR arbeitet danach ihre restlichen 4 ms Code ab? Das wäre echt perfekt!
mfG Ottmar

picass

Hallo Ottmar!
Aus meiner persönlichen Sicht verwendest du für das Programmieren in/mit Assembler exakt das passende Wort: Leidenschaft !
Damit meine ich, dass diese Technik viel Leiden hervorruft, sie benötig soviel Zeit und Arbeit an Details - zumindest ist das bei mir so. Allerdings kann und will ich vorläufig nicht darauf verzichten, trotz eines neulich erfolgten ersten Versuches mit einer modernen Variante von Basic auf einem 32-Bitter.

Aber nu' gibts einen Dissenz: nach meinem Kenntnisstand hat ein Interrupt - egal, welcher Art - schlicht nichts mit Zeitensteuerung zu tun. Ganz im Gegenteil soll eine Interrupt-Routine die normale Arbeit des µC's so kürzest als möglich nur beanspruchen.
Für Zeitensteuerung sind doch diverse Timer und ggf. Schleifen im Programm zuständig. Klar kann der Ablauf eines Timers einen IRQ auslösen, was ja je nach Prog auch nötig wäre, aber die Dauer einer Zeitensteuerung soll nicht von einem IRQ abhängen, sondern nur von den eigentlichen Zeiten-Routinen.
Grüße, picas

Ottmar

Hallo picas

nette Dikussion! Ja,für mich ist das Programmieren in ASM besonders interessant, indem ich dabei zu allen (Un-) Tefen  des PIC  gelange und dazu noch meinen Grips anstrengeund damit mein bereits etwas angegrautes Hinrnkastl auf Trab halte. Immer wieder nehmeich mir ein anderes Modul vor um darin durchzusteigen.

Z.B. habe ich vor einiger Zeit einen Lader für 1 Zelle LiPo programmiert, der wohl immer ein Versuchsaufbau bleiben wird. Für mich ist es dabei nicht wichtig ein fertiges, vorzeigbares Gerät zu erstellen. Wichtig ist mir die Funktionalität der Elektronik und natürlich aud der ASM-Codes  der die ganze Chose zum Laufen bringt.

Vielleicht haben wir uns mißverstande, war ja im vorigen Beitrag nur ein Beispiel. Fast immer verwende ich den TMR0-Overflow Interrupt mit Intervallen von z.B. 4 oder 5ms. Damit entprelle ich Tasten, steuere Delays und messe auch die Zeit.

Ein kleines ISR-Codebeispiel erklärt da vieleicht mehr wie viele Worte. Diese ISR gehört zu dem erwähnten Lipo-Lader mit einem PIC16F1827 und wird alle 5ms aufgerufen, generiert  Sekunde, Minute, Stunde, notalls (nicht eingefügt 1/10s) und das mit ca 30-40 Arbeitszyklen.,. Bleiben also n immer noch knapp unter 5000 Zyklen (bei fosc=4MHz) um den sonstigen Code zur Ladekontrolle, Stromsteuerung, Spannungs-/Kapazitätsmessung usw arbeiten zu lassen.

mfG Ottmar

pic18

Mal eine Frage, warum zählst Du in Ladezeit immer die einzelnen Stellen hoch? Und nicht erst die Sec. bis 59, dann Min bis 59 dann Stunden...

Ottmar

Hallo pic18

Während des Ladens soll ja fortlaufend die aktuelle Zeit seit Ladebeginn im LCD hochgezählt und unverzüglich angezeigt werden. Bevor ich da vor jeder Ausgabe eine Binär zu BCD-Wandlung durchführen muss, habe ich auf diese Weise die Dezimalstellen sofort und auch mit weniger Rechenaufwand (so hoffe ich) verfügbar:


movf   Esec,w    ;(desgleichen mit Zsec,Emin usw...)
OutLcd_Ascii:' 
addlw  D'48'     ;einstellige Zahl direkt zu Ascii-Dode wandeln
CALL OutLcd_Data ;Asiicode bleibt im WREG für die Ausgabe
bsf    LCD_RS    ;LcdFlags,7=1 RS=1 Zeichen ausgeben
CALL OutLcd      ;Ausgabe an gegebener DDRAM-Adresse
RETURN


mfg Ottmar

Ottmar

Zumeinem Beitrag vom 24.04.2023, 20:04:12 CEST (letzterSatz)

Heute habe ich das problemlose Arbeiten von von HIGH- und LO-Priority-Interupt  neben-/ineinander praktisch ausprobiert.

Es hat einwandfrei funktioniert, alle 5ms die HPI takten zu lassen. und dort zur Kontrolle eine LED anzusteuern.  Auf Tastendruck wird die LPI gestartet und in deren ISR die Initialisierung eines LCD und  eine Textausgabe (ca. 5s Dauer) ausgeführt. Wie nicht anders zu erwarten war, ging das reibungslos vonstatten. Wollte es eben mal praktisch erlebt haben.

mfG Ottmar

picass

Es ist dein persönliches Erfolgserlebnis, Ottmar.
Aber sei sicher, dass auch andere den nicht nur zur Kenntnis nehmen, sondern sich über deinen Bericht freuen.
Grüße, picass

Schnellantwort

Achtung: In diesem Thema wurde seit 120 Tagen nichts mehr geschrieben.
Wenn Sie nicht absolut sicher sind, dass Sie hier antworten möchten, starten Sie ein neues Thema.

Name:
Verifizierung:
Bitte lassen Sie dieses Feld leer:
Geben Sie die Buchstaben aus dem Bild ein
Buchstaben anhören / Neues Bild laden

Geben Sie die Buchstaben aus dem Bild ein:

Tastenkürzel: Alt+S Beitrag schreiben oder Alt+P für Vorschau

Ähnliche Themen (1)