help.asm


1
;************************************************************** 
2
; benötigte Include-Files 
3
;************************************************************** 
4
#include <P16f873a.INC>         ; hiermit greift das MPLAB auf die Datei "P16f873a.INC" im MPLAB-Verzeichnisorder zu! 
5
                                        ; Werden dort Änderungen vorgenommen, gelten diese in ALLEN Projekten! 
6
;************************************************************** 
7
; Konfiguration 
8
;************************************************************** 
9
; (siehe Datenblatt des 16F873 S.119) 
10
; bis 4 MHz: Power on Timer, kein Watchdog, XT-Oscillator 
11
;       __CONFIG        _PWRTE_ON & _WDT_OFF & _XT_OSC 
12
; 
13
; ab 4 MHz: Power on Timer, kein Watchdog, HS-Oscillator 
14
        __CONFIG        _PWRTE_ON & _WDT_OFF & _HS_OSC 
15
16
;************************************************************** 
17
; Variablendeklaration (Reservierung eines Bytes) 
18
;************************************************************** 
19
20
        rxdata  res  1            ; Dynamischer Speicher 
21
        txdata  res  1
22
        
23
;************************************************************** 
24
; Einsprungpunkt beim Start/Reset definieren mit "org" 
25
;************************************************************** 
26
27
        org 0x0000                      ; Einsprungpunkt/Programmstart bei 00h 
28
        goto MAIN                       ; Sprung zum Hauptprogramm (nops NICHT erforderlich) 
29
30
;************************************************************** 
31
; Initalisierung 
32
;************************************************************** 
33
34
INIT                                   ; Labels = Sprungmarken - immer GROß schreiben, zum Unterscheiden!!! 
35
36
; Speicherbank 1 auswählen 
37
38
        bsf     STATUS, RP0             ; umschalten auf Speicherbank 1 (nach Reset ist normalerweise immer Speicherbank 0 aktiv)
39
        movlw   B'00011000'             ; Konstante ins Arbeitsregister laden Alle Pins des PORT C auf Ausgang stellen (für diese Anwendung würde auch schon RC6 ausreichen)
40
        movwf   TRISC                   ; Konfigurationsregister für Port C beschreiben 
41
        movlw   B'11111111'             ; Konfiguration für "Input" laden 
42
        movwf   TRISA                   ; alle Pins des Port A als "Input" schalten 
43
        
44
        bcf     ADCON1, PCFG3   ; Bit3 im ADCON1-Register löschen (= PORTA auf digital I/0 konfigurieren) 
45
        bsf     ADCON1, PCFG2   ; Bit2 im ADCON1-Register setzen  (= PORTA auf digital I/0 konfigurieren) 
46
        bsf     ADCON1, PCFG1   ; Bit1 im ADCON1-Register setzen  (= PORTA auf digital I/0 konfigurieren) 
47
48
; SSPSTAT = 00XX XXXX                   ; bitweise Konfiguration der SPI-Schnittstelle, Achtung: Register liegt in Speicherbank 1
49
50
        bcf     SSPSTAT, SMP    ; im SSPSTAT-Register das Bit SMP (sample bit=Abtastbit) löschen! (muss im Slavemode so sein, siehe Datasheet S.66)
51
        bcf     SSPSTAT, CKE            ; im SSPSTAT-Register das Bit CKE (clock edge select) löschen! 
52
        bcf     STATUS, RP0             ; auf Speicherbank 0 zurückschalten 
53
        
54
; Hinweis: die nachfolgenden 2 Programmzeilen ersetzten die oben gezeigte Speicherbankumschaltung!...allerdings nur für TRISC!
55
56
;       movlw   B'00001000'             ; I/O-Konfiguration für PORT C laden: TRISC<3>=Serial Clock, TRISC<4>=Serial Data Input=automatically controlled, TRISC<5>=Serial Data Output
57
58
;       tris    PORTC                   ; lädt den Wert vom Arbeisregister w in das TRIS-Register des PORT C - schaltet automatisch auf die richtige Speicherbank um!
59
60
; Speicherbank 0 gewählt: 
61
; SSPCON = XX10 0101                    ; bitweise Konfiguration der SPI-Schnittstelle (Register liegt in Speicherbank 0)
62
63
    movwf  b'00100101'
64
    movlw  SSPCON
65
        
66
        return                          ; Rücksprung ins HP "MAIN", momentaner Wert im Arbeitsregister bleibt unverändert
67
68
;********************************************************** 
69
; Hauptprogramm 
70
;********************************************************** 
71
72
MAIN 
73
74
        call INIT                               ; Aufruf des Unterprogramms "INIT" --> Initialisierung durchführen 
75
        clrf  txdata                 ; Zähler löschen 
76
    clrf  rxdata
77
78
                                     ; Endlosschleife: während des Durchlaufs im Debugmodus müssten die jeweiligen Flags gesetzt werden
79
80
; Zähler um die Interrupflags zu zählen, die beim Eintreffen von Bits gesetzt werden: 
81
82
LOOP 
83
    btfss   SSPSTAT, BF   ;irgendwas da?
84
    goto LOOP         ;nein
85
    movf   SSPBUF, w     ;ja -> speichern
86
    movwf  rxdata       ;in rxdata
87
    goto  LOOP      ;und wieder von vorn
88
89
        END