@rapeur
Ähm, also eine kleine Erläuterung wäre ganz nett, es ist absolut
unverständlich was das Programm tun soll - und auch in C schreibt man
immer mit Kommentar... ;-)
Also erstmal ist die Routine "interrupt" keine echte Interrupt-Routine,
sondern ein schlecht gewählter name. Geht das überhaupt durch den
Compiler? Braucht der PIC nicht ein bisl mehr initialisierung?
>Wird beim PIC eine Interrupt-Serviceroutine als normale C-Funktion>aufgerufen???>Hallo>Ja>Gruß
Hallo
Jein, siehe Gerhard.
In der main-loop ruft man sie nicht auf.
Gruß
Hallo Kommutator,
ich moechte gern eine funktion mit verzögerung realisiert. nehmen wir
ich duch den Clock das macht PORTBbits.RB1=PORTDbits.RD0; den Port B1
enthalt 2S später den wert von Port D0. ich habe realisiert mit ein For
schleife aber für das Programm pass nicht gut, deshalb wurde ich
empfehlen mit interrupt zu machen. das problem ist ich habe noch nicht
ein interrupt bearbeiten deshalb ist es neu für mich.ich moechte gern
dass , die verzögerung kein einfluss auf das gesamte Programm nur wo ich
will.und das ist das problemm. interrupt ist neu fur mich
Gruß
Also,
in der INT-Routine wird der Timer0 gestartet und versch. INT-Flags
gesetzt (kann die Software gar nicht, geht nur in Hardware).
Die INT-Enable-Bits werden nirgends gesetzt.
In der Int-Routine werden 3 Zähler nacheinander hochgezählt.
Erst Task0_Counter bis er über 100 ist.
Ab dann wird bei jedem Durchlauf Task1_Counter hochgezählt, bis er 200
erreicht, ab dann wird Task2_Counter hochgezählt, bis er 500 erreicht,
weil dann Task0_Counter weitergezählt wird.
Die IF-Bedingung wird eigentlich nie erfüllt.
Was soll das ganze ?
Wozu brauchst Du den Timer0 ?
Was hat das mit 20MHz zu tun ?
Hallo,
ich sollte nur einfach und ich habe ein test Platine wo ich überprüfen
kann. Und bei mein Test platine kann ich nicht die verzögerung merken.
20MHz ist die Frequenz von Quartz. Warum wird die IF bedingungen nicht
erfüllt?
Ich brauche Timer und ein Verzögerung zu realisiert.
Haste bei deiner Entwicklungsumgebung keinen Debugger?
Wenn du das Programm auf einen bestimmten Pic laufen lassen willst
brauchste außerdem einen Simulator.
Lötkünstler
<Mit der Lizenz zum löten>
Hallo
Das MPLAB hat einen Debbuger, aber ich habe noch nicht benutzt. ich habe
immer mit Oscilloscope gemessen. Aber wenn mann ein Verzögerung von 2S
hat, kann man auf Platine merken oder?
Rapeur
Das Programm muß erst mal Fehlerfrei arbeiten,sonst haben Messungen
keinen
Sinn,außerdem kann man mit dem normalen Oszilloskop nur periodische
Signale messen.Debugging/Simulation ist jedenfalls der vernünftigere Weg
Fehler zu finden.Ich würde mich mal angewöhnen das Programm zu
kommentieren weil
es sonst nur schwer nachvollziehbar ist.
>void interrupt(unsigned char PORTBbitsRB1, unsigned char PORTDbitsRD0)
ist die Syntax ohne Trennungspunkte korrekt (PORTBbits.RB1 ?)
Fiel mir nur auf.
Mehr kann ich leider nicht dazu beitragen.
Lötkünstler
<Mit der Lizenz zum löten>
Die Kommentierung soll ein Nachvollziehen des Programms erleichtern.
Wenn man nach einer gewissen Zeit Änderungen durchführen will sind
sinnreiche Kommentare hilfreich und Kollegen sind dann Dankbar wenn die
diese Ausgabe übernehmen müssen.
Bei Nationalem Gebrauch in der Landessprache sonst englisch.
Lötkünstler
<Mit der Lizenz zum löten>
in der main-Funktion von dir rufst du den interrupt auf, als wenn es
eine Funktion wäre....
Das geht so nicht!!!
Ein Interrupt ist immer unter gewissen Bedinungen aufgerufen! z.B. Wenn
ein Flankenwechsel an einem PIN oder ein Timerüberlauf stattgefunden
haben. Dann wird das Programm(egal, welche zeile gerade abgearbeitet
wird) unterbrochen und es wird der code an der stelle des Interrupts
ausgeführt. Danach springt der Ablauf dann wieder an die Stelle im
Programm, wo er geendet(interrupted) hat.
außerdem solltest du dir noch mal die counter angucken, weil das so
nicht läuft!
ich würde das nach folgendem prinzip aufbauen:
unsigned counter bis maximalen wert zählen lassen, bei maximalem wert
nächsten counter inkrementieren. So ist sichergestellt, dass der zweite
counter immer periodisch!!! inkrementiert wird, das ist so bei dir nicht
der fall!
Also,
zunächst kann ich mir nicht verkneifen mich den vorangegangenen
Kommentaren anzuschließen!
Was musst Du machen:
a) Test den Code in MPLAB, indem Du den den Debugger->select Tool->MPLAB
SIM einstellst. Dann kannst Du schritt für schritt dein Programm
ausführen lassen.
b) der neu zu schreiben. Vorschlag für die Implementierung:
Nimm den Timer1 um die Verzögerung zu realisieren per
interrupt-betrieb.
Nimm einen zweiten interrupt der ausgelöst wird, wenn der Pegel sich
am gewünschten Eingang verändert (Dazu musst du evtl. den Port B
nehmen), initialisiere und starte dann den timer.
Läuft der Timer ab, löst er den timer-interrupt aus der den Wert
ausgibt und den timer-interrupt wieder abdreht.
Wenn Du jetzt eine 2S Verzögerung haben willst, wirds zusätzlich
komliziert, denn dann musst du jede Änderung innerhalb der 2S
abspeichern, d.h. einen Zeitstempel wann sich das Signal verändert hat.
Wenn Du nur ein langsam änderndes Signal am Eingang hast, also seltener
als 2S kannst Du dir das sparen. Und dann ist da noch das Problem wenn
das Eingangssignal nicht ganz sauber ist ....