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
Lesezeichen