Hallo Gemeinde, ich muss für ein Projekt 3 Signalgeber auslesen, wenn ich den "taster" drücke liegt am µC eingang ein low-signal an, ich möchte nun, dass das signal gespeichert wird,auch wenn der "taster" wieder losgelassen wird... mit erneutem betätigen möchte ich, dass das signal wieder zurückgesetzt wird. Ich lasse das ganze dauerhaft durchlaufen damit immer alle drei Signalgeber "gleichzeitig" betätigt werden können... Hat da jemand eine Idee? In Richtung FlipFlop in Assembler? Gruß Bernd
bernd schrieb: > Signalgeber "gleichzeitig" betätigt werden können... Hat da jemand eine > Idee? In Richtung FlipFlop in Assembler? Ich wollte dir schon ein komplettes ASM-Listing schicken. Alles fertig incl. Signal und Flipflop. Leider wußte ich nichts über deinen µC, dienen Assembler, nichts über das ominöse Signal und wie es von den Signalgebern geliefert wird. Ich bin jetzt total frustriert, daß ich dir nicht helfen kann :( Leider hab ich gleich keine Zeit mehr und will dir auch keinen Pseudocode zumuten.
bernd schrieb: > Ernst gemeinte Antwort? Selbstverständlich war das ernstgemeint. Nachdem Du das hier gelesen hast: https://www.mikrocontroller.net/articles/Netiquette#Klare_Beschreibung_des_Problems weißt du auch warum.
Ok also ich habe einen pic18 und an ra0 bis ra2 sensoren die wenn diese schalten auf masse gehen... rb0 bis rb2 sind meine ausgänge... wenn sensor 1 schaltet, soll rb0 1-signal ausgeben... solange bis sensor 1 ein zweites mal schaltet. Das gleiche mit sensor 2 und 3 =》rb1 und rb2
Naja im prinzip nichts... ich wollte mein projekt nur näher erläutern... mir geht es darum dass ich keine lösung finde da signal zu speichern, wenn ich den eingang auslese, sprich: Main btfss ra0 bsf rb0 btfss ra1 bsf rb1 btfss ra2 bsf rb2 goto Main -------------------^ somit bleiben die ausgänge immer an und bei erneuter betätigung ändert sich logischerweise nichts... wie kann muss ich also weiter vorgehen um sozusagen ein T-FlipFlop zu simulieren ? Oder hat jemand einen anderen ansatz? Hardwareseitig kann ich keine flipflops mehr ergänzen... auch die Pinbelegung am Pic kann ich nicht mehr ändern...
Pseudocode: Lbl1: in Tasten, Zustandsspeicher ; Tasten einlesen and Zustandsspeicher, 7 ; Untere Drei Bit rausfiltern cpi Zustandspeicher, 7 ; wurde Taste gedrückt? jz Lbl1 ; wenn nicht wiederholen not Zustandsspeicher ; gedrückte Taste = H xor Ausgaberegister, Zustandsspeicher ; xor bewirkt den ToggleSwitch out Ausgaberegister, Ausgang ; Ausgänge setzen jmp Lbl1 ; springe zum Anfang
Die Sache hat nur einen kleinen Haken: solange eine oder mehrere Tasten gedrückt sind, toggelt der Ausgang ständig hin und her... Wenn eine Umschaltung durch einen Tastendruck stattgefunden hat, muss also das weitere gedrückt-halten der Taste ignoriert werden, bis sie mal wieder losgelassen wird. Und: wenn die "Sensoren" tatsächlich richtige Tasten mit mechanischen Kontakten sind, muss auch noch entprellt werden!
Wenn keine Entprellung notwendig ist, könnte es so gehen:
1 | movf PORTA,W ;aktuellen Status einlesen |
2 | xorwf speicher,W ;Änderung gegenüber alten Wert => 1-Bits in W |
3 | movwf maske ;= Bitmaske der geänderten Eingänge |
4 | xorwf speicher,F ;gespeicherten Wert aktualisieren |
5 | comf speicher,W ;gedrückte Taster => 1 |
6 | andwf maske,W ;nur gedrückte Taster, die sich geändert haben |
7 | andlw b'00000111' ;und nur die unteren Bits |
8 | xorwf PORTB,F ;toggeln |
"speicher" und "maske" müssen als Variablen im RAM definiert werden.
Hi Deinen Assembler kenn ich zwar nicht, dennoch sollte es möglich sein, dir zu erklären, wie das funktioniert. Das Zauberwort heißt Flankenbildung. Du hast einen Kontakt, also must du das Eingangssignal erst einmal entprellen. Dazu nimmst du den Eingang und prüfst, ob ein Wechsel stattgefunden hat. Bei jedem Wechsel setzt du einen Zähler, sagen wir mal auf 5, den du im ms Takt runterzählst. Ist er zu 0 geworden, sollte dein Eingang stabil sein und du kannst ihn erst mal ablegen. Nun kommt die Flanke dran. Auch hier wieder Neu mit einer Ablage vergleichen. Exclusiv-Oder. Ist ein Unterschied, hat ein Wechsel stattgefunden. Nun musst du herausbekommen, ob der Wechsel von 1 nach0 oder umgekehrt ist. Also nochmal den altenZustand mit der Änderung verunden. War Alt "1" und die Änderunf "1" ist klar. der Wechsel war von 1 nach 0. Ist aber der neue Zustand "1", bedutet das ebenfalls mit dem Ergebnis aus Exclisiv Oder einen Wechsel von 0 nach 1. Hier mal dazu einen Assemblertext vom Atmega [avraasm] ;********************************************************************* ;* Flankenbits bilden * ;********************************************************************* Set_IO_Event: ; Flankenbits setzen LDS r16, Akt_In ; aktuell gültige Eingänge lesen MOV r6, r16 ; Wert merken LDS r17, old_in ; Ablage gültiger Eingänge EOR r16, r17 BREQ End_Io_Event ; keine Änderung, dann Ende MOV r7, r16 ; Ergebnis merken AND r17, r16 ; alte Bits und Ergebnisbits = Wechsel 1 auf 0 LDS r18, Event_0 ; offene Ereignisse laden OR r17, r18 ; neue Ereignisse zumischen STS Event_0, r17 ; und Ereignis fallende Flanke ablegen MOV r16, r6 ; aktuelle Bits laden MOV r17, r7 ; aktuelle Bits und Ergebnisbits = Wechsel 0 auf 1 AND r17, r16 LDS r18, Event_1 ; offene Ereignisse laden OR r18, r17 ; neue Ereignisse zumischen STS Event_1, r18 ; und Ereignis steigendeFlanke ablegen MOV r16,r6 ; aktuelle Bits laden STS old_in, r16 ; aktuelle Eingänge nach Ablage End_Io_Event: RET ;----------------------------------------------------------------------- - [/avrasm] Ich hoffe, du hast es verstanden und kannst es umsetzen. Gruß oldmax
wie finde ich den meinen "assembler" herraus? Ich bin noch richtig neu auf dem gebiet... es happert also an allen ecken
bernd schrieb: > wie finde ich den meinen "assembler" herraus? Grob: Welchen Microcontroller verwendest du? "BTFSS" hört sich schon mal nach PIC an. Fein: Welches Programm verwendest du um deine Assembler-Programme zu assemblieren?
Pic18F26K80 und mplab8 Ich möchte mich jetzt schonmal bedanken für die bisher zahlreichen Antworten und die Unterstützung ;)
Schüler und nicht aufgepaßt? PIC18 ist schon mal gut. Wie sieht die Programmierumgebung aus? Hardware vorhanden? Von der Schule gestellt? Keine Lust einzuarbeiten? Machen wir alles für dich. Aber nenn doch ein paar Eckdaten.
Pic sitzt auf einer selbstgeätzten platine und ich verwende ein pickit3... pickkit2 habe ich auch... Und ja... schüler... aufpassen war nicht möglich da wir dies noch nicht behandelt haben... :/
Naja. Logische Zustände speichert man in Variablen. Alte logische Zustände kann man dort nachsehen und mit den neuen logischen Zuständen vergleichen. Bei Ungleichheit kann man Aktionen ausführen. Und den neuen Zustand kann man als alten speichern. Schleife drumrum (nicht Schmuckband, sondern programmtechnisch ausgeführt). Fertig.
Das bedeutet ich frage den eingang ab und speichere den zustand in einer variable... wenn ich den eingangszustand ändere, ändere ich nicht direkt den ausgang sondern zuerst die variable ,,,,,,,,,,,,,,,,,,,,,,,, Variable: Sensor1 equ 0x20 Main: btfss ra0 bsf sensor1 . . . goto Main ,,,,,,,,,,,,,,,,,,,,,,,,,,,, Wie kann ich dann beim 2. Durchlauf den alten mit dem neuen Zustand vergleichen
>Wie kann ich dann beim 2. Durchlauf den alten mit dem neuen Zustand >vergleichen Wenn das eine Frage war, dann hier die Antwort: Einfache Logik, so wie im Alltagsleben auch. Befehle dazu in der Beschreibung des µC. Selber machen und selber lernen ist immer gut.
bernd schrieb: > wie finde ich den meinen "assembler" herraus? Datasheet + Familie Reference. Die einzigen Informationequellen die Dir sagen können wie genau Deine MCU funktioniert. Ohne jetzt wieder Grundsatzstreitigkeiten hervorzurufen, aber warum quälst Du Dich so ? Der assemblerbefehlssatz einer jeden MCU ist anders, Du fängst also bei jedem Wechsel wieder von vorn an. Du must Dich in Asssembler um jeden Mist selber kümmern und immer wissen mit welchem Register Du was für Operationen machen kannst und wo Du gerade was gespeichert hast. Das ist eine wahnsinnige Quälerei wenn der Umfang steigt und der Performancegewinn gegenüber C ist in den meisten Fällen völlig bedeutungslos. Microchip bietet kostenlose C Compiler und der Sprachumfang von C ist so klein das Du sehr schnell zu funktionierenden Programmen kommst. Was in C nur ein Befehl ist kann im Assemblerhintergrund xKB an code sein. In C kannst Du auf umfangreiche Standartbilbiotheken zurückgreifen oder ganz nah an der Hardware selber programmieren. Mach Dir das nicht so schwer und fang mit C an. Du kannst immer noch Assembler an den Stellen benutzen wo es um die Wurst geht und jeder Taktzyklus zählt.
Michael Knoelke schrieb: > Du must Dich in Asssembler um jeden Mist selber kümmern und immer wissen > mit welchem Register Du was für Operationen machen kannst und wo Du > gerade was gespeichert hast. Falsch! "c-hater" würde schreiben: In Assembler hast Du endlich die Macht, und nicht irgend ein Compiler. Du bist Herr über jedes Bit, jeden Takt und jede Speicherzelle. Abgesehen von diesem endlosen Disput, hat die Schule dem TO die Aufgabe gestellt, diese in Assembler zu lösen. Nur Mut! Assembler-Programmierer werden gesucht, wenn es um sicherheitskritische Software geht. Da gibt es keine versteckten Compiler-Bugs. Ansonsten müssen die verwendeten Entwicklungsumgebungen zertifiziert oder validiert werden. Bei Assembler alles kein Thema.
>>Assembler-Programmierer werden gesucht, wenn es um >>sicherheitskritische Software geht. Wer hat dir den diesen Mist erzählt! abc
Irgendwie hat es mir keine Ruhe gelassen... dieser Code schien mir noch zu lang: Thomas Elger schrieb: >
1 | > movf PORTA,W ;aktuellen Status einlesen |
2 | > xorwf speicher,W ;Änderung gegenüber alten Wert => 1-Bits in W |
3 | > movwf maske ;= Bitmaske der geänderten Eingänge |
4 | > xorwf speicher,F ;gespeicherten Wert aktualisieren |
5 | > comf speicher,W ;gedrückte Taster => 1 |
6 | > andwf maske,W ;nur gedrückte Taster, die sich geändert haben |
7 | > andlw b'00000111' ;und nur die unteren Bits |
8 | > xorwf PORTB,F ;toggeln |
9 | > |
Eleganter geht es, wenn man die Bits invertiert speichert, dann ist die Variable "maske" nicht mehr notwendig und zwei Befehle fallen weg: Thomas Elger schrieb: >
1 | > comf PORTA,W ;aktuellen Status invertiert einlesen |
2 | > xorwf speicher,W ;Änderung gegenüber alten Wert => 1-Bits in W |
3 | > xorwf speicher,F ;gespeicherten Wert aktualisieren |
4 | > andwf speicher,W ;nur Taster, die sich auf "gedrückt" geändert haben |
5 | > andlw b'00000111' ;und nur die relevanten Bits |
6 | > xorwf PORTB,F ;toggeln |
7 | > |
:
Bearbeitet durch User
Route 66 schrieb: > hat die Schule dem TO die Aufgabe > gestellt, diese in Assembler zu lösen. Ja ? Das muß ich überlesen haben. Wo steht das denn ? > Du bist Herr über jedes Bit, jeden Takt und jede Speicherzelle. Ja ich kenne die Vorteile von Assembler. Kennst Du denn auch die Nachteile ? ASM ist ein steiniger Weg. Die ersten kleinen Sachen gehen recht schnell und wenn es dann größer wird geht schnell garnichts mehr weil man sich hoffnungslos verzettelt und zwei Tage später seinen eigenen Code nicht mehr versteht.
Hi Michael Knoelke schrieb: > Die ersten kleinen Sachen gehen recht schnell und wenn es dann größer > wird geht schnell garnichts mehr weil man sich hoffnungslos verzettelt > und zwei Tage später seinen eigenen Code nicht mehr versteht. Das kann dir mit jeder anderen Programmiersprache aber auch passieren. Liegt halt daran, wie du dir deine Struktur zurechtlegst. Da sind auch größere Programme nicht unbedingt schlecht zu überschauen. Natürlich auch ganz klar, wenn andere Programmierer sich über den Code hermachen (müssen), ist es ungleich schwieriger, wie in einer Hochsprache. Gruß oldmax
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.