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
|