-
Hallo µautonom!
Genau und for allem übersichtlicher und effizienter.
Wenn Du z.B. ein ASM Program vom Sprut mit meinem vergleichst, dann siehst Du, dass ich jedes unbedeutendes Zeichen zu vermeiden versuche, um möglichst kurzes und übersichtliches ASM Programm zu erstellen. Weil ich immer mit PADs arbeite, schreibe ich in meinen Programmen keine Kommentare (nur wenn ich sie veröffentliche).
Mit der Zeit entwickelt sich "von selbst" ein Programmstyle, wie eine Handschrift. Ich habe aber, bevor ich auf PICs umgestiegen bin, andere Prozessoren in ASM programmiert. Ich könnte auch AVRs wählen, finde aber persönlich PICs "sympatischer".
Viel Spass bei der PIC Programmierung, Du bist sicher auf dem richtigen Weg zum Erfolg! :)
MfG
-
Hi PICture,
bei mir war das auch so ähnlich das ich vor nem Jahr unegfähr mit einem 80C535 gearbeitet habe (in der Schule :) ) Alles in Assembler programmiert. Das hat mir den Einstieg in die PIC porgrammierung erleichert. Ich selber finde den PIC auch sympatischer deswegen hab ich mich auch für diesen entscheiden :D:D. PAD ist ne gute Sache, wenn man viele Verzweigungen und Sprünge hat wird man irgendwann die Übersicht verlieren, da ist so ein Ablaufplan sehr hilfreich.
Danke den werd ich haben :D
Noch ne Frage, wie lange arbeitest du schon mit PICs?
Mfg
-
Hi µautonom!
Geschichte war im Gymnasium meine Schwäche, ich kann mir die Daten nicht merken, aber ungefähr 1,5 Jahre. Mit ASM Programmierung habe ich vor ca. 15 Jahren angefangen. :)
MfG
-
Hi,
15Jahre , sind ne ganze Menge :D
Ich hab mal das ganze noch mit Unterprogranmm gemacht
Code:
w_temp EQU 0x70 ; context saving
status_temp EQU 0x71 ; context saving
INTSERV movwf w_temp ; W register retten
movf STATUS,w ; status register nach W register
movwf status_temp ; STATUS register retten
IntEnd movf status_temp,w ; STATUS register
movwf STATUS ; wieder herstellen
swapf w_temp,f
swapf w_temp,w ; W register wieder herstellen
;*****************************************************************
;Programm
;*****************************************************************
movlw 3
movwf 0x20 ; Speicherzelle wird die Zahl3 geladen
anf
btfsc PORTA, 0 ; Taster abfragen - Taster gedrückt -> zur Zählschleife
goto anf
;**************************************************************
call z_schleife ; Unterprogrammm aufrufen
;***************************************************************
t_los
btfss PORTA, 0 ;Taster abfragen - Taster los -> zum Counter
goto t_los
;***************************************************************
call z_schleife
;****************************************************************
decfsz 0x20, 1 ; Counter = 3
goto anf
bsf PORTB, 0
loop
goto loop
;************************Unterprogramm****************************
;20000 Takte
z_schleife
movlw d'100'
movwf 0x21
S2
movlw d'200'
movwf 0x22
S22
decfsz 0x22, 1
goto S22
decfsz 0x21, 1
goto S2
return
;******************************************************************
end
Ich glaube das würde auch ohne den Code am Anfang funktionieren, obwohl ich gar nicht weiss wie das benutzen kann^^ Code funktioniert aber habs getestet.
Kann mir jemand eklräen was man dabei beachten muss, robotcheck hat
was von W-Register retten geschrieben, was hat es damit auf sich ? Bei sprut konnt eich nix dazu finden sowie hier im Wiki, oder bin ich blind=? :D
Mfg
Mfg
-
Hallo,
das Retten des W- und Status Registers wird hauptsächlich in der Interrupt Routine benutzt. Ich habe es aber selbst erlebt und auch bei anderen festgestellt, dass es bei Unterprogrammen, die oft aufgerufen werden, sinnvoll sein kann, diese Register zu retten. Wenn Du Dir die Zeitschleife mal anschaust, dann findest Du dort Befehle, die das W-Register überschreiben. Außerdem wird das Statusregister verändert, wenn das Zählregister auf 0 steht (Zero-Bit).
Beispiel:
Falls Du die Zeitschleife aus dem Hauptprogramm aufrufst, und vor dem CALL-Befehl einen Wert im W-Register stehen hast, den Du nach der Zeitschleife noch weiterverwenden willst, dann wird dieser ohne das Retten überschrieben. Natürlich kann man diesen Wert auch in einem anderen Register zwischenspeichern, aber das wird gerne vergessen. Rettet man diese Register, dann braucht man sich darüber keine Gedanken zu machen, denn die Werte sind nach dem UP genauso, wie davor.
Informationen dazu findest Du im Bereich "Interrupt"
http://sprut.de/electronic/pic/falle...html#interrupt
Fazit: Das Register retten ist bei Unterprogrammen nicht notwendig. Man muss jedoch dann wissen, was nach dem Unterprogramm mit dem W-Register und dem Status-Register passiert. Deshalb hatte ich geschrieben: Es kann notwendig sein, diese Register zu retten.
Falls Du es benutzt, dann müssen die Register am Anfang des Unterprogrammes gerettet und vor dem Verlassen wieder hergestellt werden.
So, ich hoffe das war verständlich. Eventualitäten lassen sich nicht leicht erklären. :-k
-
Das mit dem "Register retten" bezieht sich auf ISR, was Du nicht hast.
Ich denke, das Du nicht das ganze Programm gepostet hast, da fehlt z.B. "__config" usw.
Ich habe aus Deinem Programm, alles was ich unnötig finde, entfernt. Hoffe aber, das es trotzdem funktioniert. :)
MfG
Code:
;*****************************************************************
;Programm
;*****************************************************************
movlw 3
movwf 0x20 ; Speicherzelle wird die Zahl3 geladen
anf
btfsc PORTA, 0 ; Taster abfragen - Taster gedrückt -> zur Zählschleife
goto anf
;**************************************************************
;***************************************************************
t_los
btfss PORTA, 0 ;Taster abfragen - Taster los -> zum Counter
goto t_los
;***************************************************************
call z_schleife
;****************************************************************
decfsz 0x20, 1 ; Counter = 3
goto anf
bsf PORTB, 0
loop
goto loop
;************************Unterprogramm****************************
;20000 Takte
z_schleife
movlw d'100'
movwf 0x21
S2
movlw d'200'
movwf 0x22
S22
decfsz 0x22, 1
goto S22
decfsz 0x21, 1
goto S2
return
;******************************************************************
end
-
@PICture
Der Befehl call z_schleife nach dem goto anf sollte drinbleiben.
Ein Taster kann sowohl beim Drücken, als auch beim Loslassen prellen.
Bei diesem Programm könnte es sich an folgender Stelle bemerkbar machen:
Wenn die Taste zum 3ten mal gedrückt wird, dann geht die LED an, BEVOR die Taste wieder losgelassen wurde.
Ob es so ist, entscheidet jedoch der Praxis-Test.
-
Hallo robotcheck!
Das stimmt nicht, da das Program in der endloser Schleife "t_los" so lange bleibt, bis der Taster losgelassen wird.
MfG
-
Hallo PICture,
das ist ja auch richtig, wenn man davon ausgehen kann, dass der Taster nicht prellt.
Falls er aber doch prellt, dann wird das Programm durch Drücken des Tasters die Schleife anf verlassen und sich (bei 8MHz) innerhalb von 2 µs in der Schleife t_los befinden.
Das Prellen des Tasters ist eine Folge von Spannungsspitzen (High/Low) in einem Zeitraum von bis zu 10 ms.
In der Schleife t_los registriert der PIC also noch das Kontaktprellen aus der Schleife anf und wird diese Schleife direkt wieder verlassen. Deshalb muss die Zeitschleife auch nach anf eingefügt werden.
Es ist von den praktischen Gegebenheiten abhängig.
Vielleicht wird uns µautonom im nächsten Beitrag mitteilen, das sein Programm in Deiner Variante einwandfrei läuft. In diesem Falle prellt sein Taster beim Drücken nicht.
Vielleicht prellt der Taster auch überhaupt nicht und wir sind aufgrund der anderen Fehler im Programm nur dieser Vermutung aufgesessen. Dann kann er die Zeitschleife auch wieder ganz rausnehmen (was ich grundsätzlich nicht machen würde).
Gruß
-
Hi, Leute danke erstma für die Info zu dem Thema W-register retten.
Also beim drücken prellt der Taster auf jeden Fall, wie das ganze beim loslassen asusieht weiss ich nciht werd gleich mal mal die Version von PICture testen, werde ne Rückmeldung machen.
Kam leider gestern nicht zum testen.
EDIT: Beim loslassen prellt der Taster nicht, deshalb funktioniert das Programm auch ohne die Zählschleife bei der Abfrage ob der Taster losgelassen wurde. Wenn man sich nicht sicher ist, ist das ja nicht verkehrt sicherhalbsweiser die Zeitschleife nochmal an dieser Stelle aufzurufen.
Mfg