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







Zitieren

Lesezeichen