Ich bin noch ein frischling was das Programmieren bei Assembler angeht. ich habe mir mit mühe und not ein Programm geschrieben (es versucht. Es soll eigentlich ein Lauflicht werden der durch den timer gesteuert werden...sprich ca 0,5 sekunden bevor die LED weiter spricht. Leider klappt es bei mir Null.... ich danke schon einmal im voraus: list p=16f877 ;der Prozessortyp wird festgelegt include "p16f877.inc" ; __CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC & _LVP_OFF udata countint EQU 0x23 ; ----------------------------------------------------------------- ; Interruptvektortabelle ; ----------------------------------------------------------------- org 0x000 ; RESET-Vektor goto start org 0x0004 ; Interruptvektor goto ISR ; Sprung zu Interruptserviceroutine ; ; org b'00000000' start: movlw b'00000000' ;alle Bits Port C Ausgänge bsf STATUS, RP0 ; umschalten auf Bank 1 bcf STATUS, RP1 ; umschalten auf Bank 1 movwf TRISC bcf OPTION_REG,5 ; interner Clock fuer Timer0 bcf OPTION_REG,0 ; Vorteiler fuer Timer0 ein bcf OPTION_REG,1 ; Vorteilerbit0 = 0 bcf OPTION_REG,0 ; Vorteilerbit1 = 0 bsf OPTION_REG,1 ; Vorteilerbit2 = 1 ; -> 1MHz : 32 : 125 = 250Hz -> 4ms bcf STATUS, RP0 ;umschalten auf Bank0 movlw D'198' ; Vorladen des Zaelregisters Timer0 movwf TMR0 movlw D'187' ; Vorladen des Interruptzaehlers movwf countint bsf INTCON,2 ; Timer0 Overflow ein bsf INTCON,5 ; alle Interrupts ein movlw b'00000001' movwf PORTC bcf STATUS,C ; loesche Carry-Flag im STATUS ; Register (noetig fuer rrf) main: rlf PORTC,1 ; Rotiere links ueber Carry call ISR goto main ; Ruecksprung zu main ;----------------------------------------------------------------------- - ISR: movlw D'198' ; Reloadwert fuer Zaelregister Timer0 nach w movwf TMR0 ; w nach TMR0 decfsz countint,0 ; Interruptereignisse zaehlen goto isr1 ; solange Interruptzaehler != 0 ; sonst -> movf PORTC, ; Status PORTB einlesen movwf PORTC ; Ausgabe auf PORTB movlw D'187' ; Vorladen des Interruptzaehlers movwf countint isr1: bcf INTCON,1 ;Iterruptflag zurücksetzen retfie ; Return from Interrupt end ;das Ende des Programms
Also als erstes fällt auf, dass du in der Main die ISR aufrufst, das darf nicht sein. Die wird ja durch den IRQ selbst aufgerufen. Das Bitschieben kannst du in dem Fall auch in die ISR auslagern, sonst schiebt er ja in der Main ständig durch. Das wäre auch besser gelöst über eine Variable im RAM, die du schiebst und dann komplett auf den Ausgang schreibst. Beachte auch, dass du das Carry durchschiebst, dessen Zustand musst du explizit setzen/löschen. In deiner Main bleibt also zunächst nichts übrig.
1. die Config-Bits sind auskommentiert 2. als Anfänger würde ich das erst mal ohne Interrupt machen: loop Bit setzen, warten Bit schieben zurück zu loop
so ich hab das mitlerweile auch hinbekommen....ich habe es zwar allgemein jetzt etwas anderes aufgebaut aber es funktionier auch dank eurer hilfe
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.