-         
+ Antworten
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 23

Thema: Abfrage in Assembler

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    09.08.2004
    Alter
    38
    Beiträge
    77

    Abfrage in Assembler

    Hi Ihr lieben,

    ich wollte mal fragen, wie ich in Assembler in einem Byte die länge eines Bit herausfinden kann, also die Zeit die er braucht zum High-Low wechsel und Low-High?!

    Das was ich bisher gemacht habe funktioniert.
    Die Schleife die ich probiert hab zu machen geht leider nicht,
    da sich der Statuswert und der Wert in W sich kurz vor der abfrage ändert und dadurch gehts nicht.

    Das Problem was ich noch habe ist, das mein Timer nicht immer bei 125 anfängt.
    Ich brauche aber 125 da ich einen 1/16 Vorteiler habe der dann die Zeit auf ca. 2ms bringt. Beim Anfang des Programms gehts, das der mit 125 starten, aber beim Überlauf springt er auf 0, obwohl ich in einer Abfrage eingestellt habe, das er dann wieder zu dem teil springen soll wo der timer auf 125 gesetzt wird, aber das funktioniert nicht.

    Falls Ihr euch den Code anschauen wollt setz ich ihn hier mit rein.
    Ich weiss das die Schleife falsch ist, aber ich weiss nicht wie ich das richtig machen soll.


    Code:
    	list      p=16F84A           	  ; list directive to define processor
    	#include <p16F84A.inc>        	  ; processor specific variable definitions
    
    	__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC
    
    ;***** VARIABLE DEFINITIONS *****
    w_temp        Equ     0x0C        	  ; variable used for context saving 
    status_temp   Equ     0x0D       	  ; variable used for context saving
    
    w_copy  Equ     0x20            	  ; Backup für Akkuregister 
    s_copy  Equ     0x21            	  ; Backup für Statusregister
    
    T0SC	Equ		OPTION_REG
    
    		ORG     0x000           	  ; processor reset vector
      		goto    main            	  ; go to beginning of program
    
    ;		Interrupt routine falls diese mal benötigt wird
    		ORG     0x004           	  ; interrupt vector location
    		movwf   w_temp          	  ; save off current W register contents
    		movf	STATUS,w       		  ; move status register into W register
    		movwf	status_temp    		  ; save off contents of STATUS register
    		
    		movf    status_temp,w   	  ; retrieve copy of STATUS register
    		movwf	STATUS          	  ; restore pre-isr STATUS register contents
    		swapf   w_temp,f
    		swapf   w_temp,w        	  ; restore pre-isr W register contents
    		retfie                   	  ; return from interrupt
    
    main	
    ;       PortA wird hier initialisiert  
    		BCF STATUS, RP0				  ; RP0=0
    		CLRF PORTA					  ; Initialisierung von PortA
    									  ; durch löschen des Data latches
    		BSF STATUS, RP0				  ; Markiere Bank 1
    		MOVLW 0x0F					  ; nutzen für den DatenVerzeichniss
    		
    		MOVWF TRISA&0x7f			  ; SET RA<3:0> als Input
    									  ; SET RA4 als Output
    ;   	PortB wird hier initialisiert  
    		BCF STATUS, RP0				  ; RP0=0
    		CLRF PORTB					  ; Initialisierung von PortA
    									  ; durch löschen des Data latches
    		BSF STATUS, RP0				  ; Markiere Bank 1
    		MOVLW 0xCF					  ; nutzen für den DatenVerzeichniss
    		  
    		MOVWF TRISB&0x7f			  ; SET RA<3:0> als Input
    									  ; SET RB<5:4> als Output
    									  ; SET RB<7:6> als Output
    TIMER									  
    		movwf   w_copy       		  ; w retten 
            swapf   STATUS, w      		  ; STATUS retten 
            movwf   s_copy      		  ;
    		MOVLW 1
    NOCHMAL 
    		BCF STATUS, RP0				  ; auf Bank 0 wechseln
    		MOVLW   0x7D			  	  ; 0x83 = 131 ; 0x7D = 125
    		MOVWF   TMR0				  ; 131 oder 125 müsste hier drin stehen
       
    		BSF STATUS, RP0				  ; auf Bank 1 wechseln
    ;		BCF OPTION_REG&0x7f, T0SE	  ; bin mir nich sicher ob ichs brauche beim Vorteiler
    
    ;		Flanke
    		BSF OPTION_REG&0x7f, T0SE	  ; hier wird für RA4 die Low Flanke gewählt
    		MOVF T0SE, F			  	  ; hier wird es unter der Speicherzelle gesichert
    		
    ;		movf TMR0, F			 	  ; das ist das Timer-Register
    
    ;		Vorverteiler Aktivieren
    		BCF OPTION_REG&0x7f, PSA	  ; hier mit wird der Vorverteiler auf 0 gesetzt und aktiviert
    		BCF OPTION_REG&0x7f, PS2	  ; damit man den vorverteiler auf 16/1 einstellt
    		BSF OPTION_REG&0x7f, PS1	  ; hier wird PS1 auf 1 gesetzt
    		BSF OPTION_REG&0x7f, PS0	  ; hier wird PS0 auf 1 gesetzt	
    		
    ;		Timer
    ;		BSF OPTION_REG&0x7f, T0CS	  ; T0SC wird auf 1 gesetzt damit der Vorverteiler mit benutzt werden kann
    		BCF OPTION_REG&0x7f, T0CS     ; hier wird in der Speicherzelle T0SC die 0 gesetzt
    		MOVF T0CS, F			      ; nun wird es unter der Speicherzelle gesichert
    		
    		NOP
    		
    		ADDWF TMR0,W  ; +1 ergibt 0x00 in w, wenn TMR0=0xFF 
    		MOVLW 1
    		BTFSS STATUS,Z  ; Sprung, wenn Z-Flag gesetzt 
    		GOTO TIMER 
    		GOTO NOCHMAL		
    	END

    Ich hoffe Ihr könnt mir helfen.
    Ich bin total verzweifelt und bin für jede Hilfe von Euch DANKBAR.

    Danke für Eure Hilfe schonmal.

    Mit freundlichen Grüßen
    Damian Stolarek

    PS.:
    Bitte Helft mir
    ---

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    09.08.2004
    Alter
    38
    Beiträge
    77
    Wie kann ich meinen Timer so machen, das er nur zählt, von einem bis zum anderen Flag?

    Wie sieht eine Abfrage aus, die beim Timerwert 125 anfängt, damit ich eine Zeit von ca 2ms zählen kann?
    ---

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    14.07.2004
    Beiträge
    34
    www.sprut.de
    da gibt es Beispiel zu Timern

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    09.08.2004
    Alter
    38
    Beiträge
    77
    hi jooker

    der timer funktioniert nur die abfrage für den timer geht nicht
    danke aber trotzdem

    ich brauche halt die abfrage damit der erste punkt den ich schrieb geht.

    mit freundlichen grüßen
    damian stolarek
    ---

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.10.2004
    Ort
    Nordschwarzwald
    Alter
    33
    Beiträge
    506
    Was für einen PIC nimmst du denn?
    evtl. könntest du das mit Capture&Compare machen...
    Das mit dem Timer wird etwas problematisch, da du ja dann nur den 0-1-Wechsel mitbekommst und nicht den 1-0-Wechsel...

    Prinzipiell hast du zwei Möglichkeiten: du fragst in einer Endlosschleife immer den Status ab und startest dann, wenn ein 0-1-Wechsel stattgefunden hat, den Timer und hälst ihn später wieder an (beim 1-0-Wechsel), liest ihn aus, setzt ihn auf null. Natürlich kannst du das ganze auch noch etwas ressourcenschonender machen, indem du nen zweiten Timer nimmst und damit nur alle x µs den Status abfragst. Kommt immer drauf an, wie dein Eingangssignal aussieht.
    Alternative: Du hängst an dein Eingangssignal nen RC-Glied und misst am PIC einfach per AD-Wandler den Wert. Daraus kannst du dir dann ausrechnen, wie das Tastverhältnis ist. Wenn du dann noch auf nen Interrupt-Pin dein Eingangssignal drauf legst, kannst du auch messen, wie groß die Frequenz ist. Dadurch kannst du dann wieder deine einzelnen Zeiten berechnen. Die Frage ist dabei halt, ob du die absoluten Zeiten brauchst, oder ob dir das Verhältnis (nennt sich Duty-Cycle) reicht.

  6. #6
    Gast
    Hallo,

    leider steige ich durch Deinen Assembler-Quelltext nicht vollständig durch, aber was den Timer betrifft würde ich nach möglichkeit einen Auto-Reload-Modus wählen.
    Das Highbyte des Timers beinhaltet den Nachladewert (125 in Deinem Fall) und das Lobbyte ist der eigentliche Timer. Nach Überlauf läd der sich dann selbst mit dem Wert aus dem Highbyte.

    Ciao
    Patrick

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    15.10.2004
    Ort
    Pfalz
    Beiträge
    83
    Falls Fragen zum letzten Beitrag sind, - der war von mir.
    Ich werde permanent ausgelogged - vielleicht kann mir da mal jemand helfen *g*

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    09.08.2004
    Alter
    38
    Beiträge
    77
    hi leute,
    ich verwende den pic 16f84a.
    also ich weiss das ich den status den status abfragen müsste.
    ich weiss nur nich wie ich das richtig anstelle.
    wie mache ich den das, das er das automatisch macht?
    ich bin voll noob in assembler, obwohl ich mir sprut durchgelesen habe steige ich immernoch nich durch.
    mit kleineren projekten kann ich nich anfangen denn mir fehlt die zeit dafür. deswegen hoffe ich, das ich mit der hilfe von foren weiter komme und wenigstens ein teil fertig bekomme bis mein praktikum vorrüber ist.

    mit freundlichen grüßen
    damian stolarek
    ---

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.10.2004
    Ort
    Nordschwarzwald
    Alter
    33
    Beiträge
    506
    1.) Tutorials sind wirklich sinnvoll und es ist besser, wenn du mal zwei Stunden in nen Tutorial steckst, anstelle zwei Tage auf ne Antwort zu warten.

    2.) Ich weiss nicht, ob ich genau verstanden habe, was du machen willst.
    Auslesen von Portpins ist ja kein Problem. Da muss man nur daran denken, dass man Direktionsregister setzt (TRISA, TRISB, ...).
    Angenommen du wölltest den Pin RB1 als Eingang nehmen, dann muss das TRISB auf b'11111101' setzen.
    Code:
            movlw   B'1111101'     ; RB1 
            movwf   TRISB
    Beachten musst du dabei, dass sich die TRIS-Register in Bank 1 befinden und nicht in Bank 0, d.h. du musst vorher noch die Bank umschalten.)

    Nächster Schritt ist das clearen der Pins, die als Eingang genutzt werden sollen. z.B. mit
    Code:
    clrf    PORTB
    Und dann kannst du z.B. mittels
    Code:
            movfw   RB1 
            btfsc   STATUS, Z ; Test ob Zero-Flag gesetzt. Wenn nicht gesetzt, überspringe nächsten Befehl.
            goto nicht_gesetzt
            goto gesetzt
    den Status des Pins abfragen.

    Ich weiss nicht, ob es das ist, was du wissen wolltest... wenn nicht, dann solltest du bitte nochmal genauer sagen, was du machen willst.

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    09.08.2004
    Alter
    38
    Beiträge
    77
    hi,
    das kann ich schonmal nutzen, um zu sagen, wann überhaupt was gestartet werden soll.

    mir stellt sich aber die frage, wie ich nun in dem byte der gesendet wurde die länge der bits herausfinden kann. nirgends hab ich was davon gelesen.

    wenn mir dabei einer helfen könnte wäre ich demjenigen überausdankbar.

    ich habe mir sprut.de schon sehr oft durchgelesen und ich verstehe halt wie er es meint aber wie ich das in meine aufgabe einbringen soll das ist die frage aller fragen die ich mir stelle.

    also bitte helft mir weiter. es muss doch hier leute geben für die sowas ein klacks ist.

    mit freundlichen grüßen
    damian stolarek
    ---

+ Antworten
Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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