Forum: Mikrocontroller und Digitale Elektronik PIC16F1827 RFM01 über SPI an MSSP Modul 2


von nummernschalter (Gast)


Lesenswert?

Hallo,

habe vor ein paar Wochen hier beim Stöbern eine Diskkusiion zu 
pinkompatiblen Nachfolgenr des PIC16F628 gefunden und wurde dadurch auf 
den PIC16F1827 aufmerksam. Besonders interessiert mich das MSSP Modul, 
was 2mal vorhanden ist. Das Folgende Projekt soll beide Module nutzen. 
Nr.1 als I2C zur Ansteuerung eines LCD, was auch gut funktioniert und 
Nr.2 soll Daten von einem RFM01-Modul via SPI empfangen. Hier fangen die 
Propleme an. Ich habe exakt den gleichen Code auf einem AVR unter BASCOM 
erfolgreich laufen. Auf dem PIC bleibt er beim Testen von nIRQ hängen. 
Da ich am PIC noch nie mit SPI gearbeitet habe, vermute ich den Fehler 
in meiner Konfiguration. Vielleicht kann der eine oder andere Fuchs 
einen hilfreichen Hinweise geben.

Habe die Quelle auf das Wesentliche gekürzt.
1
;*  RFM01:  RB0 = nIRQ (PIC als Ein)
2
;*    RB2 = SDI  (PIC als Aus)    
3
;*    RB3 = nSEL (PIC als Aus)
4
;*    RB5 = SCK  (PIC als Aus)
5
;*    RA0 = SDO  (PIC als Ein)
6
;* FSK liegt über 10k an +UB
7
8
; Includedatei einbinden
9
    list p=16F1827
10
    include <P16F1827.INC>
11
12
; Makros
13
14
SPI_Kommando  Macro   Wert1, Wert2
15
      movlw   Wert1
16
      movwf  spi_tmp1
17
      movlw   Wert2
18
      movwf  spi_tmp2
19
      call  SPI_Senden
20
    endm
21
22
; Konfiguration festlegen
23
24
 __CONFIG _CONFIG1, _BOREN_ON & _CP_OFF & _CPD_OFF & _PWRTE_ON & _WDTE_OFF & _MCLRE_ON & _FOSC_INTOSC
25
 __CONFIG _CONFIG2, _LVP_OFF
26
27
; Variablen festlegen
28
29
zaehler  equ  0x2f
30
31
var_warte1  EQU  0x71
32
var_warte2  EQU  0x72
33
spi_tmp1      equ  0x7b
34
spi_tmp2      equ  0x7c
35
36
; Konstanten festlegen
37
38
39
nSEL  equ  3    ; RFM01 Auswahl
40
nIRQ  equ  0    ; RFM01 IRQ
41
42
    org 0
43
    goto    Prog_Start
44
    org 4
45
    retfie
46
47
48
49
50
Prog_Start
51
        BANKSEL OSCCON
52
        movlw   b'01101000'     ;4 MHz intern
53
        ;movlw   b'01011000'     ;1 MHz intern
54
        movwf   OSCCON
55
56
        BANKSEL PORTB
57
        CLRF    PORTB
58
        CLRF    PORTA
59
        BANKSEL LATB
60
        CLRF    LATB
61
        CLRF    LATA
62
        BANKSEL ANSELB
63
        CLRF    ANSELB
64
        CLRF    ANSELA
65
        BANKSEL TRISB
66
        movlw   B'00000001'
67
        movwf   TRISB    ; SPI RB0 Eingang
68
        movlw   B'00000001'     ;
69
        movwf   TRISA    ; SPI RA0 Eingang
70
    
71
        BANKSEL INTCON
72
        bcf     INTCON,GIE
73
74
75
; Einstellen SPI
76
77
        BANKSEL SSP2ADD
78
        movlw   h'09'               ; clock = 20/(4*(12+1)) = 385kHz
79
        movwf   SSP2ADD              ; für I2C
80
        BANKSEL SSP2CON1   ; BANK 4
81
        movlw b'01000000'     ; Mode 1,1 SPI, middle of output
82
        movwf SSP2STAT     ; time sampling
83
        movlw b'00110001'     ; Mode 1,1 SPI Master Mode, 1/16 Tosc bit time
84
        movwf SSP2CON1     ; SSP is on
85
86
87
; RFM01 initialisieren
88
89
  BANKSEL PORTB     ; BANK 0
90
  movlw  d'32'
91
  movwf   zaehler
92
  movlw   h'20'
93
  movwf   FSR0L
94
95
96
  BANKSEL PORTB
97
  bcf  PORTB,nSEL
98
99
  movlw  D'100'    
100
  movwf  var_warte
101
  call  Warte
102
103
104
  SPI_Kommando H'00',H'00'
105
  SPI_Kommando H'95',H'7b'                                         ;Configuration: 868MHzband, 12pf, 134kHz bandwidth
106
  SPI_Kommando H'a6',H'86'                                         ;Frequency: MHz
107
  SPI_Kommando H'c8',H'47'                                         ;Datarate: 4,8 kbit
108
  SPI_Kommando H'c6',H'83'                                         ;AFC
109
  SPI_Kommando H'c4',H'ac'                                         ;data filter
110
  SPI_Kommando H'c2',H'e0'                                         ;low batt./ clock divider
111
  SPI_Kommando H'c0',H'42'                                         ;receiver setting:
112
  SPI_Kommando H'e0',H'00'                                         ;wake-up timer:
113
  SPI_Kommando H'cc',H'00'                                         ;low duty cycle:
114
  SPI_Kommando H'ce',H'88'                                         ;fifo config
115
  SPI_Kommando H'ce',H'8b'                                         ;fifo enable
116
  SPI_Kommando H'c0',H'43'                                         ;enable receiver
117
118
Haupt
119
120
  ;Warte auf Daten
121
  BANKSEL PORTB     ; BANK 0
122
  btfsc   PORTB,nIRQ
123
  goto  Haupt
124
  BANKSEL SSP2BUF   ; BANK 4
125
  movf   SSP2BUF,W   ; Hole Daten aus SSPBUF
126
  BANKSEL PORTB     ; BANK 0
127
        movwf   INDF0    
128
  incf  FSR0L,F
129
  decfsz  zaehler
130
  goto  Haupt
131
132
  SPI_Kommando H'00',h'00'  ;read status
133
  SPI_Kommando H'ce',h'88'
134
  SPI_Kommando H'ce',h'8b'  ;fifo enable
135
136
  ;... irgendwas mit den Daten anstellen
137
138
  BANKSEL PORTB     ; BANK 0
139
  movlw  d'32'
140
  movwf   zaehler
141
        movlw   h'20'
142
  movwf   FSR0L
143
144
  goto   Haupt
145
146
147
148
Warte
149
   movlw   .110           
150
         movwf   var_warte2
151
Warte_w1 nop                    
152
         nop
153
         nop
154
         nop
155
         nop
156
         nop
157
         decfsz  var_warte2, F
158
         goto    Warte_w1
159
         decfsz  var_warte1, F
160
         goto    Warte        
161
         return
162
163
SPI_Senden
164
  BANKSEL SSP2BUF   ; BANK 4
165
  movfw  spi_tmp1
166
  movwf   SSP2BUF    ; Schreibe in SSPBUF
167
SPI_Senden_w1
168
   btfss   SSP2STAT,BF  ; Datentransfer komplett? (Puffer voll?)
169
  goto   SPI_Senden_w1   ; wenn nicht, erneut prüfen
170
  movf   SSP2BUF,w   ; Hole Daten aus SSPBUF
171
  movfw  spi_tmp2
172
  movwf   SSP2BUF    ; Schreibe in SSPBUF
173
SPI_Senden_w2
174
   btfss   SSP2STAT,BF  ; Datentransfer komplett? (Puffer voll?)
175
  goto   SPI_Senden_w2   ; wenn nicht, erneut prüfen
176
  movf   SSP2BUF,w   ; Hole Daten aus SSPBUF
177
  return
178
179
180
181
  end

von nummernschalter (Gast)


Lesenswert?

Die PIC-Gurus sind wohl alle im Urlaub ...? ;-)

Gut, formuliere ich es einmal allgemeiner.

Gibt es jemanden, der bereits ein RFM01/RFM12 erfolgreich unter zu 
Hilfenahme des MSSP-Moduls (Hard-SPI) als Empfänger an einem PIC zu 
laufen hat?

von nummernschalter (Gast)


Lesenswert?

So Freunde,

nachdem ich einen Verdrahtungs- und kleinere Programmfehler behoben 
habe, kann ich das RFM01 dazu bewegen, eine LED im Rhytmus des 
nIRQ-Signals blinken zu lassen.

Nach genauer Untersuchung aller Quellen hinsichtlich des Empfangs, habe 
ich herausgefunden, daß das RFM01 nach Anlegen des nIRQ zunächst 2 Leer- 
bzw. Dummybytes sendet und dann erst das eigentlich empfangene Zeichen. 
Mein Problem ist nun, daß ich mit
1
Haupt
2
  BANKSEL PORTB     ; BANK 0 
3
  btfsc   PORTB,nIRQ
4
  goto  Haupt
5
  BANKSEL SSP2BUF   ; BANK 4
6
  movfw   SSP2BUF   ; Hole Daten aus SSPBUF
7
  ...

nur das erste Byte auslesen kann, welches 0x00 ist. Wie bewege ich den 
PIC dazu, nochmal 2 Bytes zu holen bevor das nächste nIRQ-Signal 
aufläuft?

von nummernschalter (Gast)


Lesenswert?

Habe das Thema zu einem Abschluß gebracht und erfolgreich auf "Soft"-SPI 
umgestellt. Grundlage war das Programmbeispiel von HOPERF zum RFM01. 
Trotz Umstellung der C-Quelle auf Assembler hat alles in allem keinen 
halben Tag gedauert.

Falls irgend jemand in Zukunft eine Lösung für das RFM01/RFM12 mit dem 
eingebautem MSSP-Modul (egal welcher PIC) findet, möge er sich hier zu 
Wort melden.

von Oli G. (og_9191)


Lesenswert?

Hallo, bin durch suchen auf deinen Eintrag gestoßen.
Ist zwar schon lange her, aber ich hoffe trotzdem das du mir die Lösung 
für den RFM12 schicken könntest.

MfG

Oli

von HAL9000 (Gast)


Lesenswert?

Hallo,
Ich hätte auch großes Interesse an diesem Thema, und durchforste 
fleissig Threads aus 2007 usw. und freu mich, dass ich aktuell nicht der 
einzige bin.
Das was ich letzendlich erreichen will, bzw. meine Projektschritte sind:
1) PIC16F88 (oder ähnliche) erstmal sauber mit SPI kommunizieren lassen.
2) RFM01, RFM02 und RFM12 Module ansteuern.
3) Saubere Datenübertragung zwischen den Modulen hinbekommen.
4) Implementierung eines Addressierungs- und Fehlerkorrekturprotokolls 
zur Kommunikation mit mehreren Modulen.

Momentan sitz ich bei Punkt 1). Ich hoffe auf rege Diskussionen oder 
Tips und Tricks zu dem Thema :-)

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
Noch kein Account? Hier anmelden.