- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 23

Thema: Abfrage in Assembler

  1. #11
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.10.2004
    Ort
    Nordschwarzwald
    Alter
    42
    Beiträge
    506
    Anzeige

    Praxistest und DIY Projekte
    Also, wenn ich es richtig verstanden habe, brauchst du die Länge der Bits um festzustellen, ob sich das Signal geändert hat oder nicht. Also ob du 111 oder 11 empfangen hast.
    Wenn du das wissen willst, dann musst du zumindest die Gesamtlänge wissen.

    Ich geh mal davon aus, dass du von irgendwo Daten einlesen willst. Dafür hat man typischerweise eine zweite Leitung mit Clock, oder man hat eine definierte Länge der einzelnen Bits.
    Wenn man beides nicht hat, benutzt man ein anderes Verfahren: Schau dir da mal die Manchester-Kodierung an, die arbeitet über steigende und fallende Flanken.

    Mal doch einfach mal ein Bildchen, damit man mal das ganze System überblicken kann...

  2. #12
    Benutzer Stammmitglied
    Registriert seit
    09.08.2004
    Alter
    47
    Beiträge
    77
    also hier ist ein bild
    die 1 ist 2ms lang
    die 2 ist 1ms lang
    die 3 ist 0,5ms lang

    es gibt 4 byte die empfangen werden.
    beim 1. byte ist nur mit bit längen bestückt von 2ms.
    bei den anderen 3 byte sind die 1ms und 0,5ms.

    wenn das dritte byte gewesen ist fängts wieder beim 1ten an, wo wieder 2ms gefunden werden.
    das programm soll dann gestartet werden, wenn ich in der abfrage herausfinde das das 2ms dauert bis flag wechsel eintritt.

    ich hoffe das hilft etwas.

    mit freundlichen grüßen
    d.stolarek
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken bild_194.jpg  
    ---

  3. #13
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.10.2004
    Ort
    Nordschwarzwald
    Alter
    42
    Beiträge
    506
    Wenn du nicht auf den Status prüfst, sondern über nen Interrupt auf ne Flanke gehst, sollte das ganze einfacher sein.

    Programmablauf wäre folgender:
    - steigende Flanke -> Interrupt
    - Interruptserviceroutine startet Timer
    - nächste steigende Flanke -> Interrupt
    - Timer anhalten und Wert auslesen.
    - Wert mit Soll-Wert für 2ms (abzgl. vergleichen usw.)
    - Wenn gleich, dann das eigentliche Programm starten
    - sonst Timer rücksetzen und wieder starten
    - und auf nächste steigende Flanke warten...

  4. #14
    Benutzer Stammmitglied
    Registriert seit
    09.08.2004
    Alter
    47
    Beiträge
    77
    ja so dachte ich das auch aber wie kann ich den sowas umsetzen??

    wie kann ich den nachfragen ob flanke nun oben oder unten ist?
    wie stope ich den timer?
    wie erstelle ich den die abfrage richtig?

    bin totaler noob in dem bereich der programmierung
    bitte hilf mir
    ---

  5. #15
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.10.2004
    Ort
    Nordschwarzwald
    Alter
    42
    Beiträge
    506
    Damit du was bei lernst, musst du das Programm schon selber schreiben...

    aber ich geb dir ein paar Tips:
    - wie kann ich den nachfragen ob flanke nun oben oder unten ist?
    Die Flanke hat kein oben oder unten, sondern nur eine Richtung:
    Flanke nach oben oder Flanke nach unten. Das ist genau der Moment, in dem von Low nach High bzw. von High nach Low umgeschaltet wird.
    Der externe Interrupt-Eingang reagiert auf steigende Flanken (d.h auf Wechsel von Low nach High). Wie du Interrupts verwendest, findest du auf www.sprut.de

    - wie stope ich den timer?
    Es gibt ein Register, in dem die globalen Eigenschaften der Timer stehen. In diesem Register gibt es auch ein "Timer enable". Du musst darauf achten, dass du evtl. einen 16-bit-Timer verwenden musst; das hängt aber von deinem takt ab.

    - wie erstelle ich den die abfrage richtig?
    Wenn ein Interrupt ausgelöst wird, springt das Program an die ISR-Einsprungadresse. Das ist beim PIC nur eine. Du musst also selber unterscheiden, was für ein Interrupt das war. Dazu musst du schaun, ob im Interrupt-Service-Register das für den ext. Interrupt entsprechende Bit gesetzt ist. Die Abfrage geht wie oben schon beschrieben über "Test Bit, skip if clear" bzw. "Test Bit, skip if set" (btfsc bzw. btfss).

  6. #16
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.08.2004
    Ort
    Winterthur
    Beiträge
    312
    Hallo

    - wie stope ich den timer?
    Es gibt ein Register, in dem die globalen Eigenschaften der Timer stehen. In diesem Register gibt es auch ein "Timer enable". Du musst darauf achten, dass du evtl. einen 16-bit-Timer verwenden musst; das hängt aber von deinem takt ab.
    Das wird nicht funktionieren. Er verwendet einen 18F84A. Der hat nur TMR0 und der hat kein Enable.

    Um die Zeiten zwischen zwei Flanken zu messen würde ich, wie jemand oben empfohlen hat, bei einer ersten 0-1 Flanke den TMR0 resetten und bei der zweiten Flanke den TMR0 retten (also kopieren) und dann mit dem kopierten Wert weiterarbeiten.

    um den Timer zu löschen:
    clrf TMR0

    um den Timer ins W-Register zu retten:
    movf TMR0, W


    Gruess
    Felix

  7. #17
    Benutzer Stammmitglied
    Registriert seit
    09.08.2004
    Alter
    47
    Beiträge
    77
    Hi Leute,
    danke nochmals für die Hilfe.
    Nun habe ich eine andere Frage.
    Wie kann ich an einem Eingang einen Flankenwechsel überprüfen?
    Also sowas wie Manchester Code oder so.
    Danke schonmal im Vorraus.

    Interrupts habe ich nich hinbekommen deswegen versuche ich an einem normalen pin dies zu überprüfen.

    Stegr du schriebst mal das:
    Code:
    Programmablauf wäre folgender:
    - steigende Flanke -> Interrupt
    - Interruptserviceroutine startet Timer
    .....
    Nun Ja, wie überprüfe ich den, ob da eine steigende Flanke ist?
    Wie mache ich einen Interrupt richtig, hab das mal ausprobiert hat aber nich funktioniert?
    Am besten wäre wirklich ohne Interrupts.

    Gruß
    damian stolarek
    ---

  8. #18
    Gast
    Port abfragen
    XOR mit Wert von vorher, gibt nur 1, wenn Änderung
    In diesem Fall: Wenn vorher 0 --> steigende
    1 ---> fallende Flanke
    Entprellen z.B: Vergleich nur dann, wenn wenigstens n-mal KEINE änderung war

  9. #19
    Benutzer Stammmitglied
    Registriert seit
    09.08.2004
    Alter
    47
    Beiträge
    77
    @Gast
    Sorry, aber ich verstehe nichts von dem was du da geschrieben hast.
    Welcher Wert von vorher?
    Also ein Pin wird bei mir als Eingang gesetzt und darauf wird dann ein FunkSignal gesendet.

    Eine Rieeeesseenn Frage an die FunkExperten, Wie macht ihr das, das der bei einem PIC empfangt und diese dann überprüft um diese Werte weiter zu bearbeiten und zu nutzen.

    Gruß
    D.Stolarek
    ---

  10. #20
    Gast
    Interrupts...

    wenn man Interrupts verwendet, ist es kein Problem auf steigende oder fallende Flanken zu detektieren (kann man im Datenblatt bzw. im User Guide nachlesen).

    ansonsten hat unser lieber Gast schon gesagt wie es geht:

    Du pollst den Pin (d.h. fragst ihn ständig ab) und speicherst den Status des Pins im RAM. Dann nimmst du den aktuellen Wert am PIN und vergleichst ihn mit dem vorherigen (im RAM abgelegten) Wert. Wenn die gleich sind, gabs keine Änderung, bedeutet: Flanken gibt es nur wenn sich was ändert.
    => Wahrheitstabelle:

    Xalt | Xneu | Resultat (Änderung?)
    0 | 0 | keine Änderung (0)
    0 | 1 | steigende Flanke (1)
    1 | 0 | fallende Flanke (1)
    1 | 1 | keine Änderung (0)

    und diese Wahrheitstabelle entspricht der für XOR (XOR= Exklusiv-Oder).
    D.h. du kannst mittels XOR schnell überprüfen, ob sich was geändert hat.
    Wenn sich nichts geändert hat, dann wieder den Wert auslesen und wieder XOR, wenn sich nichts geändert hat... (usw.)
    Vorteil von der Verwendung von XOR: gegenüber der Methode durch subtrahieren und auf das Zero-Flag schauen: Es geht sehr viel schneller...
    Wenn sich was ändert, dann hast du eine Flanke (entweder fallend oder steigend).
    D.h. du gehst jetzt hin und speicherst den Wert im RAM als Xalt zwischen (denn es kann ja immer der böse Timer-Interrupr kommen und dein pollen unterbrechen). Dann brauchst du nur noch schaun, ob dein Xalt ne 1 ist (dann wars vorher ne 0) oder ne 0 (dann wars vorher ne 1). Daraus kannst du dann ablesen welche Flanke es war.
    Und mittels btfsc kannst du dann das Bit Xalt prüfen und schauen, wohin du springen musst (d.h. welcher Programmabschnitt ausgeführt werden muss).

    So, aber eigentlich will ich dir nicht alle Arbeit abnehmen und du sollst dir selber auch ein paar Gedanken machen...

    Daher les einfach mal das Datenblatt durch (vielleicht nicht das ganze, aber zumindest die dich betreffenden Teile).

    Und du solltest dir überlegen, was du mittels Interrupts machen willst, und was du per Schleife machen willst (also pollen). Überleg dir das mal und schreib es hier hin. Ich sag dir dann schon, wenns falsch ist

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress