Forum: Mikrocontroller und Digitale Elektronik signalspeicherung in assembler


von bernd (Gast)


Lesenswert?

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

von schade (Gast)


Lesenswert?

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.

von bernd (Gast)


Lesenswert?

Ernst gemeinte Antwort?

von Micha H. (mlh) Benutzerseite


Lesenswert?

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.

von bernd (Gast)


Lesenswert?

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

von Kurt (Gast)


Lesenswert?

Achso!

Und was hat das mit Sensoren zu tun?

von bernd (Gast)


Lesenswert?

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...

von Heinz V. (heinz_v)


Lesenswert?

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

von Thomas E. (picalic)


Lesenswert?

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!

von Thomas E. (picalic)


Lesenswert?

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.

von oldmax (Gast)


Lesenswert?

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

von bernd (Gast)


Lesenswert?

wie finde ich den meinen "assembler" herraus? Ich bin noch richtig neu 
auf dem gebiet... es happert also an allen ecken

von Andreas K. (andreasmc)


Lesenswert?

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?

von bernd (Gast)


Lesenswert?

Pic18F26K80 und mplab8

Ich möchte mich jetzt schonmal bedanken für die bisher zahlreichen 
Antworten und die Unterstützung ;)

von spontan (Gast)


Lesenswert?

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.

von bernd (Gast)


Lesenswert?

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... :/

von spontan (Gast)


Lesenswert?

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.

von bernd (Gast)


Lesenswert?

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

von spontan (Gast)


Lesenswert?

>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.

von Michael K. (Gast)


Lesenswert?

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.

von sprut (Gast)


Lesenswert?

Für PIC ASM würde ich mal hier vorbeischauen:
http://www.sprut.de/

von Route_66 H. (route_66)


Lesenswert?

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.

von abc (Gast)


Lesenswert?

>>Assembler-Programmierer werden gesucht, wenn es um
>>sicherheitskritische Software geht.

Wer hat dir den diesen Mist erzählt!

abc

von Route_66 H. (route_66)


Lesenswert?

abc schrieb:
> Wer hat dir den diesen Mist erzählt!

Denn schreibt man mit zwei "n"!

von Thomas E. (picalic)


Lesenswert?

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
von Michael K. (Gast)


Lesenswert?

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.

von oldmax (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.