Hallo Smokey!
Ich habe Dein Programm angeschaut und korriegiert. Ich hoffe das es jetzt mit der Assemblierung klappt. Die Fehlerhafte Zeilen habe ich mit "<<<...<<<" gezeichnet. Du musst aber vorher noch die Adressen der Speicherstellen Timer1 und Timer2 definieren (z.B. 0x20, 0x21).
MfG
Code:;**************** ******************************************************************** ; * Erster Assembler Versuch * ;*********************************************************************************** list P=16F627 ;Das ist die Bezeichnung des Pics den ich programmieren moechte #include <P16F627.INC> ;Das ist die Include Datei in der die Adressen der Aliasnamen stehen ;Bsp: TRISA EQU H'0085 ; TRIB EQU H'0086' ; STATUS EQU H'0003' TIMER1 EQU 0x20 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< TIMER2 EQU 0x21 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ;======================================================================================== ; Programmanfang ;======================================================================================== ORG 0 ;Das ist die startadresse nach dem Reset hier Startet der pic nach dem Einschalten ; goto RESET ;Hier springt der pic zur Reset routine(Label) ;======================================================================================= ; RESET (BOOT VORGANG) ;======================================================================================= RESET BSF STATUS,RP0 ;Setzt im Status Register RP0 auf "1" und wechselt so auf Specherbank 1 um dort verschiedene ; Optionen einzustellen MOVLW B'11 MOVLW B'11111111' ;Kopiert den wert"255" in das Arbeitsregister(W) um spaeter damit PortA als Eingaenge zu definieren ; MOVWF TRISA ;Jetzt sind RA0 bis RA3 Eingaenge(Die 4 Taster auf dem Vellemann Board) ; CLRW ;In das Arbeitsregister W wird eine "0" geschrieben ; MOVLW B'00000000' ;Kopiere den wert"0" in das Arbeitsregister ; MOVWF TRISB ;RB0 bis RB7 sind als Ausgaenge definiert(RB0-RB5=LED1-LED6) ; CLRF INTCON ;Ausschalten der Interrupt Funktion (Disable Interrupt) BCF STATUS,RP0 ;kehrt wieder zu Bank 1 zurück(Die benötigten Optionen wurden programmiert) ;======================================================================================== ; DELAY ROUTINE (Zeitschleife) ;======================================================================================== DELAY_ROUTINE MOVLW D'255' ;Kopiert die dezimale Zahl 255 in das W Register ; MOVWF TIMER2 ;Kopiert den inhalt des W registers in den Timer2 DEL_LOOP1 MOVLW D'255' ;Kopiert die dezimale Zahl 255 in das W Register ; MOVWF TIMER1 ;Kopiert den inhalt des W registers in den Timer1 DEL_LOOP2 DECFSZ TIMER1,F ;Dieser Befehl verringert den Wert des timer 1 um 1(ist der Wert 0 überspringt er den ;folgenden Befehl GOTO DEL_LOOP2 ;hier geht das programm wieder nach Loop 2 um den wert wieder um 1 zu verringern bis er null ist DEL_LOOP3 DECFSZ TIMER2,F ;wenn der Wert Null ist wird der GOTO Befehl Übersprungen und das programm verringert den TIMER2 um 1 GOTO DEL_LOOP3 ;hier geht das programm wieder nach Loop 3 um den wert wieder um 1 zu verringern bis er null ist RETLW 0 ;Hier ist das Unterprogramm zu ende im W Register steht jetzt eine Null.Das Programm arbeitet ; beim Call befehl weiter ;========================================================================================== ; *Effect(Aktionen)* ;========================================================================================== EFFECT_1 MOVLW B'01010101' ;Hier schreibt das programm den wert D'170' in das W(Work) Register MOVWF PORTB ;Hier wird der Wert aus dem W Register nach Port B geladen und jede 2 Led Leuchtet CALL DELAY_ROUTINE ;Hier geht das Programm in das Unterprogramm Delay_Routine um eine zeitverzögerung hervor zu rufen MOVLW B'10101010' ;das selbe wie oben nur das der wert D'85' beträgt MOVWF PORTB ;S. o. CALL DELAY-ROUTINE ;S. o. <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<soll DELAY_ROUTINE sein GOTO EFFECT_1 ;Das Programm fängt wieder von vorne an (s. o.) END







Zitieren

Lesezeichen