Dat register is 5 bytes lang.
Dus je moet het register schijven: (0x20 | 0x10)
En dan 5 keer de adress bytes naar buiten shiften.
Dus je moet het register schijven: (0x20 | 0x10)
En dan 5 keer de adress bytes naar buiten shiften.
Maar ik heb in register 13 een address width van 3 bytes ingesteld... Moet ik dan niet 3x address bytes shiften?Infant schreef op zaterdag 28 maart 2015 @ 12:59:
Dat register is 5 bytes lang.
Dus je moet het register schijven: (0x20 | 0x10)
En dan 5 keer de adress bytes naar buiten shiften.
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
Dat ben ik ook. Ik had wat info gevonden en heb mijn init zo goed als af. Ik zit eigenlijk alleen met dat address in mijn maag, de rest zou moeten werken (dat roep ik echter vaker.RobV schreef op zaterdag 28 maart 2015 @ 18:34:
@Pizza_Boom, het klinkt alsof je je eigen driver aan het schrijven bent? Kun je niet beginnen met het gebruiken van de bestaande libraries? Of zijn die niet beschikbaar op PIC? Arduino C is niet zo moeilijk te begrijpen, je zou stiekem kunnen spieken hoe anderen het gedaan hebben.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
| void nrf_config() // NRF initialisation code TX mode { CE = laag; // chip standby, does not monitor the airdata __delay_ms(10); // delay CSN = hoog; // must be high when idle __delay_ms(100); // delay CSN = laag; // indicate data transmitting to NRF spiNRF_write(0x20); // write register(=001) 0 0000 spiNRF_write(0x0A); // (0000 1010) CRC enabled, interrupts on IRQ enabled, PTX (=transceiver), power up CSN = hoog; // end data transmitting __delay_us(1); // delay CSN = laag; spiNRF_write(0x21); // write register(=001) 0 0001 spiNRF_write(0x00); // turn off auto ACK CSN = hoog; __delay_us(1); // register 0x22 is used only in RX mode CSN = laag; spiNRF_write(0x23); // write register(=001) 0 0003 spiNRF_write(0x01); // address width 3 bytes CSN = hoog; __delay_us(1); CSN = laag; spiNRF_write(0x24); // write register(=001) 0 0004 spiNRF_write(0x03); // retry transmitting when failed after 250 uS, try 3 times CSN = hoog; __delay_us(1); CSN = laag; spiNRF_write(0x25); // write register(=001) 0 0005 spiNRF_write(0x05); // operating frequency set to 0000 0101 CSN = hoog; __delay_us(1); CSN = laag; spiNRF_write(0x26); // write register(=001) 0 0006 spiNRF_write(0x04); // 1MB/s data rate, -6 dBm output power CSN = hoog; __delay_us(1); // register 0x27 is status register // register 0x28 is transmitter observer // register 0x29 is received power detector // triggered by power levels above -64dBm in slected channel // register 0x2A - 2F = data pipe addresses // register 0x30 is transmit address int i; CSN = laag; spiNRF_write(0x30); // write register (=001) 1 0000 = transmit address for (i=0; i<3; i++) // write addressbyte E7 3x for complete TX_ADDR (= E7E7E7) { spiNRF_write(0xE7); } CSN = hoog; __delay_us(1); CSN = laag; spiNRF_write(0x31); // write register (=001) 1 0001 spiNRF_write(0x04); // 4 byte payload in data pipe 0 CSN = hoog; __delay_us(1); } |
[ Voor 4% gewijzigd door Pizza_Boom op 28-03-2015 18:52 ]
Dus ik moet wel 5 bytes erin trappen, maar hij gebruikt alleen de laatste 3 bytes die ik verstuur als address.RX/TX Address field width
'00' - Illegal
'01' - 3 bytes
'10' - 4 bytes
'11' – 5 bytes
LSByte is used if address width is below 5 byte
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
| /* ________ _______ VDD | \/ | VSS RA5 | PIC16F1459 | RA0 RA4 | | RA1 RA3 | | Vusb3v3 LED Red RC5 | | RC0 LED Gr RC4 | | RC1 SDI CSN RC3 | | RC2 SDI CE RC6 | | RB4 SPI Serial Data in SPI SDO RC7 | | RB5 SDI IRQ RB7 |_________________| RB6 SPI SCL (white) */ #include <xc.h> #include <stdbool.h> #define _XTAL_FREQ 16000000 #define byte unsigned char #define laag 0 #define hoog 1 #define CE RC6 // Chip Enable output #define IRQ RB7 // Interrupt input #define CSN RC3 // Chip Select Not output #define SDO RC7 // Serial Data Out output #define SDI RB4 // Serial Data In input #define CLK RB6 // Clock output // Config Register: CONFIG1 // Oscillator Selection: FOSC_ECH,FOSC_ECH,FOSC_ECL,FOSC_INTOSC,FOSC_EXTRC,FOSC_HS,FOSC_XT,FOSC_LP // Watchdog Timer Enable: WDTE_ON,WDTE_NSLEEP,WDTE_SWDTEN,WDTE_OFF // WDT enabled // Power-up Timer PWRTE_OFF,PWRTE_ON // MCLR Pin Function Select MCLRE_ON,MCLRE_OFF // Flash Program Memory Code Protection CP_OFF,CP_ON // Brown-out Reset Enable BOREN_ON,BOREN_NSLEEP,BOREN_SBODEN,BOREN_OFF // Clock Out Enable CLKOUTEN_OFF,CLKOUTEN_ON // // Internal/External Switchover IESO_ON,IESO_OFF // Fail-Safe Clock Monitor Enable FCMEN_ON,FCMEN_OFF // Config Register:CONFIG2 // Flash Memory Self-Write Protection WRT_OFF,WRT_BOOT,WRT_HALF,WRT_ALL // PLL PLLEN_ENABLE,PLLEN_DISABLE // Stack Overflow/Underflow Reset Enable STVREN_ON,STVREN_OFF // Brown-out Reset Voltage Selection BORV_LO,BORV_HI // Low-Voltage Programming Enable LVP_ON,LVP_OFF #pragma config FOSC=INTOSC, WDTE=OFF, PWRTE=OFF, MCLRE=ON, CP=OFF, BOREN=OFF, CLKOUTEN=OFF, IESO=OFF, FCMEN=OFF, WRT=OFF, PLLEN=DISABLED, STVREN=OFF, BORV=HI, LVP=OFF, int knop1, knop2; bool ack; unsigned char dataR; unsigned char dummydata; unsigned char spi_send(unsigned char dataS) { SSP1IF = 0; // clear interrupt flag SSP1BUF = dataS; // send dataS(end) while (!SSP1IF); // wait till SSP interrupt flag is set dataR = SSP1BUF; // read SSPBUF to dataR(ead) return dataR; } void nrf_config() // NRF initialisation code TX mode { CE = laag; // chip standby, does not monitor the airdata __delay_ms(10); // delay CSN = hoog; // must be high when idle __delay_ms(100); // delay CSN = laag; // indicate data transmitting to NRF spi_send(0x20); // write register(=001) 0 0000 spi_send(0x0A); // (0000 1010) CRC enabled, interrupts on IRQ enabled, PTX (=transceiver), power up CSN = hoog; // end data transmitting __delay_us(1); // delay CSN = laag; spi_send(0x21); // write register(=001) 0 0001 spi_send(0x00); // turn off auto ACK CSN = hoog; __delay_us(1); // register 0x22 is used only in RX mode CSN = laag; spi_send(0x23); // write register(=001) 0 0003 spi_send(0x01); // address width 3 bytes CSN = hoog; __delay_us(1); CSN = laag; spi_send(0x24); // write register(=001) 0 0004 spi_send(0x03); // retry transmitting when failed after 250 uS, try 3 times CSN = hoog; __delay_us(1); CSN = laag; spi_send(0x25); // write register(=001) 0 0005 spi_send(0x05); // operating frequency set to 0000 0101 CSN = hoog; __delay_us(1); CSN = laag; spi_send(0x26); // write register(=001) 0 0006 spi_send(0x04); // 1MB/s data rate, -6 dBm output power CSN = hoog; __delay_us(1); // register 0x27 is status register // register 0x28 is transmitter observer // register 0x29 is received power detector // triggered by power levels above -64dBm in slected channel // register 0x2A - 2F = data pipe addresses // register 0x30 is transmit address int i; CSN = laag; spi_send(0x30); // write register (=001) 1 0000 = transmit address for (i=0; i<5; i++) // write addressbyte E7 3x for complete TX_ADDR (= E7E7E7) { spi_send(0xE7); } CSN = hoog; __delay_us(1); CSN = laag; spi_send(0x31); // write register (=001) 1 0001 spi_send(0x04); // 4 byte payload in data pipe 0 CSN = hoog; __delay_us(1); } // send to NRF unit, 4 byte payload // after sending data to NRF, empty FIFO by transmitting this data unsigned char nrf_send(unsigned char data1, unsigned char data2, unsigned char data3, unsigned char data4) { CSN = laag; spi_send(0xA0); // command to write TX FIFO spi_send(data1); // send data1 to TX FIFO spi_send(data2); // send data2 to TX FIFO spi_send(data3); // send data3 to TX FIFO spi_send(data4); // send data4 to TX FIFO CSN = hoog; __delay_us(1); CE = hoog; // make CE high to initiate data transmitting __delay_us(100); // keep CE high for at least 10 uS to transmit data CE = laag; // make CE low again to stop transmitting __delay_us(1); return 0; } void main(void) // main program { ANSELA = 0x00; ANSELB = 0x00; ANSELC = 0x00; TRISA = 0x00; TRISB = 0b10010000; TRISC = 0b00000000; OSCCON = 0b00111100; //internal clock 16 MHz no PLL PORTB = 0x00; PORTC = 0x00; // [SPI mastermode] INTCON = 0xD1; PIE1 = 0b00001000; PIE2 = 0x00; PIR1 = 0x00; PIR2 = 0x00; SSP1ADD = 0x27; // 100 kHz, SSPAD 39. instellen Fosc zo langzaam mogelijk !!! SSP1STAT = 0b11000000; // input sampled at end of output time, sending at clock from active to idle SSP1CON1 = 0b00111010; // SSP high clock, baudrate calculated with SSPADD SSP1CON3 = 0b00010000; // SSP overwrite data when buffer is not read in slave mode, no use in mastermode // [/SPI mastermode] nrf_config(); //mastercode start while (1) { LATC5 = 1; __delay_ms(500); nrf_send(0x12, 0x12, 0x12, 0x12); LATC4 = 1; __delay_ms(500); LATC4 = LATC5 = 0; __delay_ms(500); } } //master stop |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
| /* ________ _______ VDD | \/ | VSS RA5 | PIC16F1459 | RA0 RA4 | | RA1 RA3 | | Vusb3v3 LED Red RC5 | | RC0 LED Gr RC4 | | RC1 SDI CSN RC3 | | RC2 SDI CE RC6 | | RB4 SPI Serial Data in SPI SDO RC7 | | RB5 SDI IRQ RB7 |_________________| RB6 SPI SCL (white) */ #include <xc.h> #include <stdbool.h> #define _XTAL_FREQ 16000000 #define byte unsigned char #define laag 0 #define hoog 1 #define CE RC6 // Chip Enable output #define IRQ RB7 // Interrupt input #define CSN RC3 // Chip Select Not output #define SDO RC7 // Serial Data Out output #define SDI RB4 // Serial Data In input #define CLK RB6 // Clock output // Config Register: CONFIG1 // Oscillator Selection: FOSC_ECH,FOSC_ECH,FOSC_ECL,FOSC_INTOSC,FOSC_EXTRC,FOSC_HS,FOSC_XT,FOSC_LP // Watchdog Timer Enable: WDTE_ON,WDTE_NSLEEP,WDTE_SWDTEN,WDTE_OFF // WDT enabled // Power-up Timer PWRTE_OFF,PWRTE_ON // MCLR Pin Function Select MCLRE_ON,MCLRE_OFF // Flash Program Memory Code Protection CP_OFF,CP_ON // Brown-out Reset Enable BOREN_ON,BOREN_NSLEEP,BOREN_SBODEN,BOREN_OFF // Clock Out Enable CLKOUTEN_OFF,CLKOUTEN_ON // // Internal/External Switchover IESO_ON,IESO_OFF // Fail-Safe Clock Monitor Enable FCMEN_ON,FCMEN_OFF // Config Register:CONFIG2 // Flash Memory Self-Write Protection WRT_OFF,WRT_BOOT,WRT_HALF,WRT_ALL // PLL PLLEN_ENABLE,PLLEN_DISABLE // Stack Overflow/Underflow Reset Enable STVREN_ON,STVREN_OFF // Brown-out Reset Voltage Selection BORV_LO,BORV_HI // Low-Voltage Programming Enable LVP_ON,LVP_OFF #pragma config FOSC=INTOSC, WDTE=OFF, PWRTE=OFF, MCLRE=ON, CP=OFF, BOREN=OFF, CLKOUTEN=OFF, IESO=OFF, FCMEN=OFF, WRT=OFF, PLLEN=DISABLED, STVREN=OFF, BORV=HI, LVP=OFF, int knop1, knop2, j; bool ack; unsigned char dataR; unsigned char dummydata; unsigned char data1, data2, data3, data4; unsigned char spi_send(unsigned char dataS) { SSP1IF = 0; // clear interrupt flag SSP1BUF = dataS; // send dataS(end) while (!SSP1IF); // wait till SSP interrupt flag is set dataR = SSP1BUF; // read SSPBUF to dataR(ead) return dataR; } void nrf_config() // NRF initialisation code RX mode { CE = laag; // chip standby, does not monitor the airdata __delay_ms(10); // delay CSN = hoog; // must be high when idle __delay_ms(100); // delay CSN = laag; // indicate data transmitting to NRF spi_send(0x20); // write register(=001) 0 0000 spi_send(0x09); // (0000 1010) CRC enabled, interrupts on IRQ enabled, PRX (=transceiver), power up CSN = hoog; // end data transmitting __delay_us(1); // delay CSN = laag; spi_send(0x21); // write register(=001) 0 0001 spi_send(0x00); // turn off auto ACK CSN = hoog; __delay_us(1); /* // register 0x22 is used only in RX mode CSN = laag; spi_send(0x22); // write register(=001) 0 0010 spi_send(0x03); // receive trough data pipe 0 & 1 CSN = hoog; __delay_us(1); */ CSN = laag; spi_send(0x23); // write register(=001) 0 0003 spi_send(0x01); // address width 3 bytes CSN = hoog; __delay_us(1); /* CSN = laag; // enable in TX mode spi_send(0x24); // write register(=001) 0 0004 spi_send(0x03); // retry transmitting when failed after 250 uS, try 3 times CSN = hoog; __delay_us(1); */ CSN = laag; spi_send(0x25); // write register(=001) 0 0005 spi_send(0x05); // operating frequency set to 0000 0101 CSN = hoog; __delay_us(1); CSN = laag; spi_send(0x26); // write register(=001) 0 0006 spi_send(0x04); // 1MB/s data rate, -6 dBm output power CSN = hoog; __delay_us(1); // register 0x27 is status register // register 0x28 is transmitter observer // register 0x29 is received power detector // triggered by power levels above -64dBm in slected channel // register 0x2A - 2F = data pipe addresses // register 0x30 is transmit address int i; CSN = laag; spi_send(0x2A); // write register (=001) 1 0000 = transmit address for (i=0; i<5; i++) // write addressbyte E7 3x for complete TX_ADDR (= E7E7E7) { spi_send(0xE7); } CSN = hoog; __delay_us(1); CSN = laag; spi_send(0x31); // write register (=001) 1 0001 spi_send(0x04); // 4 byte payload in data pipe 0 CSN = hoog; __delay_us(1); CSN = laag; // indicate data transmitting to NRF spi_send(0x20); // write register(=001) 0 0000 spi_send(0x0B); // (0000 1010) CRC enabled, interrupts on IRQ enabled, PRX (=transceiver), power up CSN = hoog; // end data transmitting __delay_us(1); // delay CE = hoog; // CE high means receiver is listening to the air data } // send to NRF unit, 4 byte payload // after sending data to NRF, empty FIFO by transmitting this data unsigned char nrf_send(unsigned char data1, unsigned char data2, unsigned char data3, unsigned char data4) { CSN = laag; spi_send(0xA0); // command to write TX FIFO spi_send(data1); // send data1 to TX FIFO spi_send(data2); // send data2 to TX FIFO spi_send(data3); // send data3 to TX FIFO spi_send(data4); // send data4 to TX FIFO CSN = hoog; __delay_us(1); CE = hoog; // make CE high to initiate data transmitting __delay_us(100); // keep CE high for at least 10 uS to transmit data CE = laag; // make CE low again to stop transmitting __delay_us(1); return 0; } // read from NRF unit, 4 byte payload // empty RX FIFO after transmission void nrf_read() { CSN = laag; spi_send(0x61); // command to read RX FIFO spi_send(0x01); // read data, send 0x01 data1 = dataR; // read SSP1BUF to data1 spi_send(0x01); // read data, send 0x01 data2 = dataR; // read SSP1BUF to data2 spi_send(0x01); // read data, send 0x01 data3 = dataR; // read SSP1BUF to data3 spi_send(0x01); // read data, send 0x01 data4 = dataR; // read SSP1BUF to data4 CSN = hoog; __delay_us(1); CSN = laag; spi_send(0xE2); // flush RX FIFO data, data not needed anymore CSN = hoog; __delay_us(1); CSN = laag; spi_send(0x27); // call status register spi_send(0x4E); // clear interrupt, RX FIFO empty CSN = hoog; __delay_us(1); } void main(void) // main program { ANSELA = 0x00; ANSELB = 0x00; ANSELC = 0x00; TRISA = 0x00; TRISB = 0b10010000; TRISB7 = 1; TRISB4 = 1; TRISC = 0b00000000; OSCCON = 0b00111100; //internal clock 16 MHz no PLL PORTB = 0x00; PORTC = 0x00; // [SPI mastermode] INTCON = 0xD1; PIE1 = 0b00001000; PIE2 = 0x00; PIR1 = 0b00; PIR2 = 0x00; SSP1ADD = 0x27; // 100 kHz, SSPAD 39. instellen Fosc zo langzaam mogelijk !!! SSP1STAT = 0b11000000; // input sampled at end of output time, sending at clock from active to idle SSP1CON1 = 0b00111010; // SSP high clock, baudrate calculated with SSPADD SSP1CON3 = 0b00010000; // SSP overwrite data when buffer is not read in slave mode, no use in mastermode // [/SPI mastermode] nrf_config(); //mastercode start while (1) { if (IRQ == 0) { LATC4 = 1; } else if (IRQ == 1) { LATC5 = 1; } __delay_ms(300); LATC4 = LATC5 = 0; __delay_ms(300); /* LATC5 = 1; __delay_ms(500); nrf_read(); if (data1 == 0x12) { LATC4 = 1; } else { LATC5 = 0; __delay_ms(100); LATC5 = 1; } __delay_ms(500); LATC5 = LATC4 = 0; __delay_ms(500); */ } } //master stop |
[ Voor 0% gewijzigd door Pizza_Boom op 31-03-2015 18:22 . Reden: code=c gemaakt ]
[ Voor 4% gewijzigd door RobV op 31-03-2015 13:52 ]
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
Verbouwblog van mijn Schrootjespaleis uit 1925.
My anime addiction.
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
Lijkt er op dat je pin geconfigureerd is als output en de nrf hem niet omlaag kan trekken.Pizza_Boom schreef op dinsdag 31 maart 2015 @ 13:08:
Probleem is dat ik geen low krijg op mijn IRQ aan de ontvangende (RX) zijde en dus ook geen data uit kan lezen, want er is niets. Als ik de IRQ pin loskoppel gaat ie wel omlaag.
Dus ja...For years radios had been operated by means of pressing buttons and turning dials; then as the technology became more sophisticated the controls were made touch-sensitive - you merely had to brush the panels with your fingers; now all you had to do was wave your hand in the general direction of the components and hope. It saved a lot of muscular expenditure of course, but meant that you had to sit infuriatingly still if you wanted to keep listening to the same programme.
[ Voor 38% gewijzigd door Infant op 31-03-2015 17:46 ]
Dit is dan ook het software draadjeInfant schreef op dinsdag 31 maart 2015 @ 17:40:
70% van deze kroeg pagina is nu code...
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
Misschien een idee om voor grote lappen code pastebin oid te gebruiken en alleen een linkje in de reactie te plaatsen.Infant schreef op dinsdag 31 maart 2015 @ 17:40:
70% van deze kroeg pagina is nu code...
1
2
3
4
5
6
7
8
| unsigned char spi_send(unsigned char dataS) { SSP1IF = 0; // clear interrupt flag SSP1BUF = dataS; // send dataS(end) while (!SSP1IF); // wait till SSP interrupt flag is set dataR = SSP1BUF; // read SSPBUF to dataR(ead) return dataR; } |
[ Voor 40% gewijzigd door Ploink op 31-03-2015 18:06 ]
Imho zou het forum gewoon moeten auto-collapsen bij 20+ regels, zodat je het wel kan uitklappen als je dat wilt maar dat het standaard wat beperkter is kwa grootte.Ploink schreef op dinsdag 31 maart 2015 @ 18:01:
[...]
Misschien een idee om voor grote lappen code pastebin oid te gebruiken en alleen een linkje in de reactie te plaatsen.
oh en "[code=c]" ipv "[code]" maakt het leesbaarder met kleurtjes
C:
1 2 3 4 5 6 7 8 unsigned char spi_send(unsigned char dataS) { SSP1IF = 0; // clear interrupt flag SSP1BUF = dataS; // send dataS(end) while (!SSP1IF); // wait till SSP interrupt flag is set dataR = SSP1BUF; // read SSPBUF to dataR(ead) return dataR; }
Volgens de data sheet pagina 72 valt de nrf in standby-II als de FIFO leeg is en CE hoog. Zodra CE laag is, wordt het standby-I.RobV schreef op dinsdag 31 maart 2015 @ 13:52:
Misschien nrf-send rond regel 155, CE toggle. Moet de chip niet enabled zijn TIJDENS de data transfer ipv erna?
Thanks. Maakt het voor jezelf ook zoveel makkelijker.Bonuspunten voor de documentatie bovenaan met de pinout.
Ik heb ook 0 ervaring met uart en 4/5 maanden terug wist ik niets van communicatie tussen chips, inmiddels draait I2C en nu wil ik draadloos met spi. Echte libs gebruik ik niet echt, enkel 2 headers, waarvan xc8 voor de compilers is. Maar ook met pulldown erbij verandert er niets. Trek ik echter de nrf lijn eruit, dan valt ie wel naar 0 (en zonder pulldown zweeft ie soms richting 1 en weer terug).Ploink schreef op dinsdag 31 maart 2015 @ 14:59:
Lijkt er op dat je pin geconfigureerd is als output en de nrf hem niet omlaag kan trekken.
Pin RB7 zet je wel als input, maar er is een leuke valkuil. RB7 doet ook dienst als TX voor de serial port en als die aan staat (bitje SPEN in RCSTA), dan kun je de pin nog zo hard op input zetten, het blijft een output
Je gebruikt de uart blijkbaar niet, maar misschien zet een van je libs hem aan?
Ik heb ook pcb antenne, maar momenteel staan ze nog geen 10 cm uit elkaar. Ik heb op 3 bytes address geprobeerd, op 5 bytes, geen verschil. Ik las dat je ze op dezelfde payload moet hebben, ze staan samen hetzelfde ingesteld en ik stuur hetzelfde.Infant schreef op dinsdag 31 maart 2015 @ 17:40:
70% van deze kroeg pagina is nu code...
Ik heb die nRFjes altijd op 5 bytes adres gehad, ik kreeg ook niet elke pakket lengte werkend. Een te klein pakketje kan ik me herinneren werkt niet, en een te groot pakket ook niet.
Zo moeten "under the hood" ook op lijp veel rf-ellende synchroniseren, daar schijnt bij die van mij een sweet spot in te zitten.
Nou had ik van die brakke met een PCB antenne, dat als je ze 1 milimeter verschuift het berijk meteen weg is.
Op zich wil je dit, want volgens D. Adams is dat nou eenmaal de toekomst:
[...]
Dus ja...
Dat kon ik nog net wel aanpassen op mijn telefoon. Ik had eigenlijk verwacht dat het codevak een lengtelimiet had en scrollbaar zou worden.Ploink schreef op dinsdag 31 maart 2015 @ 18:01:
[...]
Misschien een idee om voor grote lappen code pastebin oid te gebruiken en alleen een linkje in de reactie te plaatsen.
oh en "[code=c]" ipv "[code]" maakt het leesbaarder met kleurtjes
Zou mooi zijn, nu is gewoon de verwachte levensduur van mijn scrollwiel met 1 promille gereduceerd.Pizza_Boom schreef op dinsdag 31 maart 2015 @ 20:51:
Ik had eigenlijk verwacht dat het codevak een lengtelimiet had en scrollbaar zou worden.
Ik meen me te herinneren dat ik ooit de demo code van itead studio gejat heb:Zou jij niet jouw code kunnen opsnorren en e.e.a. eens kunnen vergelijken?
1
2
| //regel 81 spi_send(0x09); // (0000 1010) CRC enabled, interrupts on IRQ enabled, PRX (=transceiver), power up |
Sorry, het spijt me zeer.Infant schreef op woensdag 01 april 2015 @ 00:50:
Zou mooi zijn, nu is gewoon de verwachte levensduur van mijn scrollwiel met 1 promille gereduceerd.
Als die interwebz weer gefixed is, ga ik die maar eens bekijken. Thanks.Ik meen me te herinneren dat ik ooit de demo code van itead studio gejat heb:
*snor snor*
Dit. http://store.iteadstudio....39qbg1j0uf3738hl7701n5ch7
De link naar dat rar file doet echter niks meer, er staat me bij dat basically alleen de defines werkte en de rest volledig verbouwd moest worden.
Statusregister zit op 0x27, maar ik vis zo 1, 2, 3 de mogelijkheid om het status register te pollen. Maar eens googlen of in de datasheet opzoeken, FF snel zoeken leert al dat de eerste dataout na een CSN toggle altijd status op MISO is.Het verhaal gaat over de IRQ pin toch? Ik lees die nergens uit. Ik heb ze in 5 naar 1 modus gebruikt, en poll elke keer het STATUS register helemaal dood.
In regel 146 komt ie nog een keer, maar dan met 0x0B, 2 hoger dus. Waarom? Had ergens gelezen dat dit bij RX op deze manier moest.Het eerste verschil wat ik zie in die lap code is dat je in je TX device wel POWER_UP naar de config schrijft, maar in je RX device niet...
C:
1 2 //regel 81 spi_send(0x09); // (0000 1010) CRC enabled, interrupts on IRQ enabled, PRX (=transceiver), power up
Je comment suggereert al dat er nog 2 bij moet.
*edit: Een nieuwe pagina!
(0000 1010) = 10 (dec) = 0x0a (hex), dus niet 0x09, 1 er bij dus.Infant schreef op woensdag 01 april 2015 @ 00:50:
Het eerste verschil wat ik zie in die lap code is dat je in je TX device wel POWER_UP naar de config schrijft, maar in je RX device niet...
C:
1 2 //regel 81 spi_send(0x09); // (0000 1010) CRC enabled, interrupts on IRQ enabled, PRX (=transceiver), power up
Je comment suggereert al dat er nog 2 bij moet.
*edit: Een nieuwe pagina!
Als ik dat goed begrijp van je omschrijving dan is het dus correct, de mcu pin is input en de nrf pin output. Je hebt dus niet twee outputs die armpje drukken tegen elkaar of twee inputs.Pizza_Boom schreef op dinsdag 31 maart 2015 @ 20:51:
[...]
Ik heb ook 0 ervaring met uart en 4/5 maanden terug wist ik niets van communicatie tussen chips, inmiddels draait I2C en nu wil ik draadloos met spi. Echte libs gebruik ik niet echt, enkel 2 headers, waarvan xc8 voor de compilers is. Maar ook met pulldown erbij verandert er niets. Trek ik echter de nrf lijn eruit, dan valt ie wel naar 0 (en zonder pulldown zweeft ie soms richting 1 en weer terug).
[...]
Misschien is 10cm zo dichtbij dat ze doof worden van de herrie (preamp is overstuurd). Zet ze verder uit elkaar of reduceer het zendvermogen.Ik heb ook pcb antenne, maar momenteel staan ze nog geen 10 cm uit elkaar. Ik heb op 3 bytes address geprobeerd, op 5 bytes, geen verschil. Ik las dat je ze op dezelfde payload moet hebben, ze staan samen hetzelfde ingesteld en ik stuur hetzelfde.
[ Voor 13% gewijzigd door RobV op 01-04-2015 11:43 ]
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
1uF werkt meestal ook prima =PRobV schreef op woensdag 01 april 2015 @ 11:42:
Tip: Om lekker snel µ te typen op OS X, typ je option+M. De M van 'm'. Ik zat elke keer in de 'Special Characters' map te zoeken. 'U'-toets ingedrukt houden werkte ook niet. Nu ik het weet lijkt het zooooo logisch...
Edit: ook handig als je wilt opschrijven dat je capacitor 0.1µF is.
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
Ik verwacht dat dit eerder een slordigheidje met kopiëren ofzo is geweest, want in regel 146 zet ik hem naar 0x0B.Ploink schreef op woensdag 01 april 2015 @ 08:43:
(0000 1010) = 10 (dec) = 0x0a (hex), dus niet 0x09, 1 er bij dus.
Om dit soort foutjes te voorkomen kun je denk ik beter direct "spi_send(0b00001010)" schrijven.
Ik kan me ook niet voorstellen dat ik 2 outputs tegen elkaar op laat drukken, maargoed. Foutje is zo gemaakt.Als ik dat goed begrijp van je omschrijving dan is het dus correct, de mcu pin is input en de nrf pin output. Je hebt dus niet twee outputs die armpje drukken tegen elkaar of twee inputs.
Ik heb het zendvermogen op 0dBm of -6dBm staan. Maar inmiddels extra draadjes ertussen gezet en nu staan ze een cm of 25-30 uit elkaarMisschien is 10cm zo dichtbij dat ze doof worden van de herrie (preamp is overstuurd). Zet ze verder uit elkaar of reduceer het zendvermogen.
[ Voor 7% gewijzigd door Pizza_Boom op 01-04-2015 16:27 ]
[ Voor 5% gewijzigd door Pizza_Boom op 14-04-2015 16:29 ]
[ Voor 3% gewijzigd door Pizza_Boom op 14-04-2015 18:01 ]
Zet het daar maar neer! -- It's time to party like it's 1984 -- Soundcloud
Ik durf het niet te zeggen. Ik maak gebruik van de hardwarematige MSSP die in de PIC16F1459 zit en het stukje waar daadwerkelijk verzonden wordt is als volgt:Stoney3K schreef op dinsdag 14 april 2015 @ 22:27:
Vanwaar die onderbrekingen in je kloksignaal? Op het moment dat je je CS laag gooit hoort je klok gewoon te lopen totdat je CS weer hoog maakt.
Als je dus een transactie wil doen van bijvoorbeeld 32 bits zul je die in één keer achter elkaar moeten doen.
1
2
3
4
5
6
7
8
| unsigned char spi_send(unsigned char dataS) { SSP1IF = 0; // clear interrupt flag SSP1BUF = dataS; // send dataS(end) while (!SSP1IF); // wait till SSP interrupt flag is set dataR = SSP1BUF; // read SSPBUF to dataR(ead) return dataR; } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| unsigned char nrf_send(unsigned char data1, unsigned char data2, unsigned char data3, unsigned char data4) { CSN = laag; spi_send(0xA0); // command to write TX FIFO spi_send(data1); // send data1 to TX FIFO spi_send(data2); // send data2 to TX FIFO spi_send(data3); // send data3 to TX FIFO spi_send(data4); // send data4 to TX FIFO CSN = hoog; __delay_us(1); CE = hoog; // make CE high to initiate data transmitting __delay_us(100); // keep CE high for at least 10 uS to transmit data CE = laag; // make CE low again to stop transmitting __delay_us(1); return 0; } |
Zet het daar maar neer! -- It's time to party like it's 1984 -- Soundcloud
1
2
3
4
5
6
7
8
9
10
| void spi_send(unsigned char * data_tx, int length) { int i; for(i=0; i < length; i++) { SSP1IF = 0; // clear interrupt flag SSP1BUF = data_tx[i]; // send data while (!SSP1IF); // wait till SSP interrupt flag is set and register is ready to accept new data } } |
[ Voor 4% gewijzigd door Stoney3K op 14-04-2015 22:57 . Reden: indent ]
Zet het daar maar neer! -- It's time to party like it's 1984 -- Soundcloud
[ Voor 21% gewijzigd door Pizza_Boom op 14-04-2015 23:19 ]
www.teamgenie.nl
You raise the blade, you make the change
You re-arrange me till I'm sane
You lock the door, and throw away the key
There's someone in my head but it's not me
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
www.teamgenie.nl
You raise the blade, you make the change
You re-arrange me till I'm sane
You lock the door, and throw away the key
There's someone in my head but it's not me
Maakt niet uit. Het hele idee van die klok is juist dat je als master kan bepalen wanneer je bits verstuurt.Stoney3K schreef op dinsdag 14 april 2015 @ 22:27:
Vanwaar die onderbrekingen in je kloksignaal? Op het moment dat je je CS laag gooit hoort je klok gewoon te lopen totdat je CS weer hoog maakt.
Als je dus een transactie wil doen van bijvoorbeeld 32 bits zul je die in één keer achter elkaar moeten doen.
Dan kun je het beste beginnen met te leren hoe arrays en pointers precies werken in C.Pizza_Boom schreef op woensdag 15 april 2015 @ 16:00:
Heb je daar een codevoorbeeldje van, hoe je dat precies bedoelt? Ik heb bij de I2C slave code wel gewerkt met een soort 1D array, maar ik heb geen idee hoe ik wat hier staat, moet gaan implementeren.
1
2
3
4
5
6
7
8
9
| char data[5]; /* Geeft aan dat er 5 bytes in deze array passen */ data[0] = 0xA0; data[1] = data1; data[2] = data2; data[3] = data3; data[4] = data4; spi_send(data, 5); |
Het kan heel goed zijn dat sommige slave-devices kieskeurig zijn over het wel of niet hebben van een nette klok. Ik heb hier bijvoorbeeld een paar DAC's van Microchip en die houden het op een gegeven moment voor gezien als je klok te veel afwijkt tussen de bitjes.Radiant schreef op woensdag 15 april 2015 @ 16:27:
[...]
Maakt niet uit. Het hele idee van die klok is juist dat je als master kan bepalen wanneer je bits verstuurt.
Sneller is altijd leuker maar die vertraging zal niet het probleem zijn.
Als je code gaat schrijven met interrupts in je master zal je helemaal zien dat je klok nooit helemaal mooi is.
Zet het daar maar neer! -- It's time to party like it's 1984 -- Soundcloud
Ik zal het even voor je googlen. Understanding pointersPizza_Boom schreef op woensdag 15 april 2015 @ 15:41:
Hmmm, okee. En hoe maak ik die pointer naar mijn data dan?
1
2
3
4
5
6
7
8
9
10
11
12
13
| //the unsigned char *data_to_transmit = { 0xAA, 0xBB, 0xCC, 0xDD }; //je kunt het ook zo opschrijven (verschil is voor puristen) unsigned char data_to_transmit[] = { 0xAA, 0xBB, 0xCC, 0xDD }; //functie aanroepen met array en de lengte spi_send(data_to_transmit, 4); //heb je geen buffer en hoef je echt maar 1 byte versturen: unsigned char byte_to_transmit = 0xAA; spi_send(&byte_to_transmit, 1); //ofwel zonder tijdelijke variabele. spi_send(&0xAA, 1); |
1
2
3
4
| void spi_send(unsigned char * data_tx, int length) { ... } |
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
Doe het dan ook gelijk op de kortst mogelijke manierRobV schreef op woensdag 15 april 2015 @ 16:35:
[...]
Ik zal het even voor je googlen. Understanding pointers
1
| spi_send( {0xAA, data1, data2, data3, data4}, 5); |
Zet het daar maar neer! -- It's time to party like it's 1984 -- Soundcloud
Als ik het op deze manier doe, dan krijg ik errors. Maak ik van de accolades aanhalingstekens(" "), dan blijven er alleen warnings over voor dat deel.Stoney3K schreef op woensdag 15 april 2015 @ 16:37:
[...]
Doe het dan ook gelijk op de kortst mogelijke manier
C:
1 spi_send( {0xAA, data1, data2, data3, data4}, 5);
Op zo'n soort manier, maar dan precies tegengesteld, heb ik het ook al eens gebruikt bij het binnenhalen van informatie in een slave op een I2C bus. Zodat dus iedere binnenkomende byte op een apart adresje werd weggeschreven.Stoney3K schreef op woensdag 15 april 2015 @ 16:34:
[...]
Dan kun je het beste beginnen met te leren hoe arrays en pointers precies werken in C.
Die data_tx is een 'char *', dat betekent dat het geen byte (char) aan data is, maar het geheugenadres van die byte(s) aan data. En als je meer bytes wil sturen, dan zijn de geheugenadressen daarvan opeenvolgend.
Staat er bijvoorbeeld ergens een byte met gegevens '0xAA' op adres 252, dan werkt dat dus zo:
Waarde op adres 252 = data_tx\[0] = 0xAA
De eerstvolgende waarde in zo'n 1-dimensionale array, data_tx\[1], staat dan op adres 253, enzovoorts.
Dat maakt C heel krachtig maar (soms) ook heel smerig, omdat je met dat soort trucs gewoon buiten de grenzen van een array kan lezen schrijven waar zinnige data in zit. Dat is precies wat er bij de bekende Heartbleed-bug aan de hand was.
Die gaan we nog eens proberen. Maar bij de configs moet ik dat dus bij iedere configuratie die ik doorstuur doen, lijkt mij?Wil je dus het stukje aan bytes sturen wat je in je originele programma gebruikt, dan kun je dat zo doen:
code:
1 2 3 4 5 6 7 8 9 char data[5]; /* Geeft aan dat er 5 bytes in deze array passen */ data[0] = 0xA0; data[1] = data1; data[2] = data2; data[3] = data3; data[4] = data4; spi_send(data, 5);
Om 5 bytes aan data in één keer te versturen.
Zou dat met NRF24L01's ook zo zijn?Het kan heel goed zijn dat sommige slave-devices kieskeurig zijn over het wel of niet hebben van een nette klok. Ik heb hier bijvoorbeeld een paar DAC's van Microchip en die houden het op een gegeven moment voor gezien als je klok te veel afwijkt tussen de bitjes.
[ Voor 8% gewijzigd door Pizza_Boom op 15-04-2015 17:39 ]
Als je er '//' voor zet, zijn ook de warning wegPizza_Boom schreef op woensdag 15 april 2015 @ 17:37:
[...]
Als ik het op deze manier doe, dan krijg ik errors. Maak ik van de accolades aanhalingstekens(" "), dan blijven er alleen warnings over voor dat deel.
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
"0xAA, data1, data2, data3, data4" is trouwens iets heel anders dan de array die bestaat uit 0xAA (hexadecimaal) en de inhoud van data 1 t/m 4.RobV schreef op woensdag 15 april 2015 @ 18:10:
[...]
Als je er '//' voor zet, zijn ook de warning weg... Zodra je begrijpt hoe het werkt, mag je van mij de bocht afsnijden. Tot die tijd gewoon eventjes een buffertje gebruiken kijkt me handiger nu. En zoals gezegd: lees even een basic C tutorial over arrays en pointers. Het is al zo vaak uitgelegd...
Zet het daar maar neer! -- It's time to party like it's 1984 -- Soundcloud
Ik ben even de weg kwijt waarom je je eigen code quote als reactie op mijn bericht.. Laten we het niet ingewikkelder maken dan dat het is en verder gaan. We wachten af waar Pizza_Boom mee terugkomt als hij zich even ingelezen heeft in de materie.Stoney3K schreef op woensdag 15 april 2015 @ 18:43:
[...]
"0xAA, data1, data2, data3, data4" is trouwens iets heel anders dan de array die bestaat uit 0xAA (hexadecimaal) en de inhoud van data 1 t/m 4.
Wat je er dan wel in stopt laat ik aan jou als huiswerk.
[ Voor 4% gewijzigd door RobV op 15-04-2015 18:53 ]
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
RobV schreef op woensdag 15 april 2015 @ 18:51:
[...]
Ik ben even de weg kwijt waarom je je eigen code quote als reactie op mijn bericht.. Laten we het niet ingewikkelder maken dan dat het is en verder gaan. We wachten af waar Pizza_Boom mee terugkomt als hij zich even ingelezen heeft in de materie.
Opdracht aan Pizza_Boom dan: Leg eens uit waaromPizza_Boom schreef op woensdag 15 april 2015 @ 17:37:
[...]
Als ik het op deze manier doe, dan krijg ik errors. Maak ik van de accolades aanhalingstekens(" "), dan blijven er alleen warnings over voor dat deel.
1
| char * data_send = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE } |
1
| char * data_send = "0xAA, 0xBB, 0xCC, 0xDD, 0xEE" |
Zet het daar maar neer! -- It's time to party like it's 1984 -- Soundcloud
[ Voor 37% gewijzigd door RobV op 15-04-2015 21:39 ]
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
sst, straks heeft ie het nog te snel door...Ploink schreef op woensdag 15 april 2015 @ 20:54:
Ik denk dat die syntax highlighting op zich al een duidelijke hint is, of verklap ik nou teveel?
Zet het daar maar neer! -- It's time to party like it's 1984 -- Soundcloud
ik vroeg me af, of je inmiddels het verschil weet tussen char, char *, char [], en het verschil tussen 'x' en "x".Pizza_Boom schreef op woensdag 15 april 2015 @ 17:37:
[...]
Als ik het op deze manier doe, dan krijg ik errors. Maak ik van de accolades aanhalingstekens(" "), dan blijven er alleen warnings over voor dat deel.
[...]
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
Ja dat heb/had ik ook, vanaf Studio 5 is dat ontstaan toen ze er MS studio bij hebben gehaald, zeer traag met opstarten, had 4GB en ahtlon M320 (2.1GHz athlon II zeg maar). Heb vorige maand nieuwe pc gekocht met broadwell i5-5200 en is stukje minder geworden. Maar zag verder nooit dat cpu, HDD of ram zwaar werd belast in de opstarttijd. Studio 4 was reten snel, de starten snel op, sneller reactie van alle onderdelen.Anthor schreef op dinsdag 05 mei 2015 @ 16:41:
Ik ben atm weer bezig met wat programmeren in AtmelStudio 6 (sp2),
en ik zit me weer onwijs te ergeren aan de vertraging/lag die ik soms in de editor heb.
Hebben jullie dat ook, of is er gewoon iets mis met mijn pc?
(proc uit 2009 en 12 GB ram moet genoeg zijn toch)
Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of DDRxn. Note that the
SBI instruction can be used to toggle one single bit in a port.
1
2
3
4
5
6
7
8
9
| PINB = 0x20; //ldi r24, 0x20 //out 0x03, r24 //-------------------------------- PORTB ^= 0x20; //in r24, 0x05 //ld r25, 0x20 //eor r24, 25 //out 0x05, r24 |
Dat is idd een handig truukje.joelluijmes schreef op zondag 31 mei 2015 @ 00:20:
Weet iemand nog meer van dit soort kleine dingetjes voor de avr?
1
2
3
4
| Int32 OutputLong = 0; Uint8 InputChar1 = 0xAA; Uint8 InputChar2 = 0xBB; OutputLong |= ((InputChar1<<8)|(inputChar2)); |
1
2
3
4
| Int32 OutputLong = 0; Uint8 InputChar1 = 0xAA; Uint8 InputChar2 = 0xBB; OutputLong |= ((InputChar1<<8)|(inputChar2)) & 0x0000FFFF; |
If you do not change direction, you may end up where you are heading
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
[ Voor 9% gewijzigd door Hans1990 op 31-05-2016 20:50 ]
Ja, daar ben ik het mee eens.Hans1990 schreef op dinsdag 31 mei 2016 @ 20:33:
Die F's daar niet horen te staan. Let wel (InputChar1 << 8 ) een warning hoort te generen omdat je in principe alle 8-bits van de byte eerst afschuift, en daarna opslaat in 32-bit int. De compiler promoot stiekem dus InputChar1 al naar 32-bit.
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
[ Voor 18% gewijzigd door mux op 31-05-2016 21:03 ]
Ja mijn vermoeden is dat het ook iets met signed/unsigned te maken heeft. Ik heb ook even de code gereduceerd tot waar de 'fout' zat. Code zit in een device driver die 24 bits signed getallen uitspuugt. Om het mijzelf wat makkelijker te maken stop ik die maar in Int32's zodat ik de compiler alle berekeningen kan laten afhandelen. Grappig genoeg lost het casten van de UInt8's naar Int32's niets op en vreemd genoeg ook geen warning over de shift m.b.t. het promoten van het type.Hans1990 schreef op dinsdag 31 mei 2016 @ 20:33:
Als ik jouw code in GCC 4.8.4 (x86 ubuntu 14.04) stop met stdint.h types krijg ik 0x0000AABB.
Architectuur afhankelijk? Compiler bug? XAP5 platform zegt me weinig, wikipedia zegt dat aangepaste GCC veel gebruikt wordt.
Die F's daar niet horen te staan. Let wel (InputChar1 << 8 ) een warning hoort te generen omdat je in principe alle 8-bits van de byte eerst afschuift, en daarna opslaat in 32-bit int. De compiler promoot stiekem dus InputChar1 al naar 32-bit. Maar ik weet niet of dat het probleem is.
Misschien idd unsigned/signed probleem, maar dat blijft vreemd voor een OR operatie.
edit:
OT: Mag wel eens wat doen aan zinopbouw als ik moe ben![]()
If you do not change direction, you may end up where you are heading
[ Voor 23% gewijzigd door RobV op 03-06-2016 19:28 ]
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
Zelfs als de knop kort wordt ingedrukt zal dat toch wel een tiende van een seconde zijn?Anthor schreef op vrijdag 03 juni 2016 @ 19:24:
Ik kan misschien iets in de eeprom zetten, uitlezen en gewijzigd terugschrijven als de uC spanning krijgt, maar dan kan de spanning ook wegvallen tijdens een write. Wat gebeurt er met het eeprom geheugen wat dan beschreven wordt? Is de data dan gewoon weg of kan het geheugen op een of andere manier beschadigen zodat daarna altijd dezelfde byte terug komt?
Of is er een andere makkelijke manier om een random waarde ergens uit te halen?
[ Voor 21% gewijzigd door Hans1990 op 03-06-2016 21:01 ]
www.teamgenie.nl
You raise the blade, you make the change
You re-arrange me till I'm sane
You lock the door, and throw away the key
There's someone in my head but it's not me
Zoals Springuin al zei, het is een breakout bord ook in de RN4020 PICtail Plus Daughter Board Quick Start Guide staat dat:Digital-DNA schreef op vrijdag 03 juni 2016 @ 23:35:
Ik weet niet of ik hier aan het juiste adres ben, maar ik wil graag eens gaan experimenteren met het aansturen van een RN4020 Bluetooth chip. Hiervoor is een ontwikkelbordje beschikbaar die ik overweeg te kopen (met PIC18F25K50 microcontroller):
http://www.microchip.com/...px?PartNO=RN-4020-PICTAIL
Nu ben ik bekend met zo'n 6 programmeertalen en flans ik dagelijks fancy apps in elkaar. Met deze tak van sport ben ik echter iets minder bekend. Misschien dat ik hier wat help kan krijgen om op gang te komen.
Mijn eerste vraag is eigenlijk heel simpel: is het bordje uit bovenstaande link genoeg om mee te ontwikkelen, of is er nog een ander bordje nodig waar deze weer in past? Uit de documentatie en de voorbeelden wordt mij dit niet helemaal duidelijk namelijk.
The RN4020 PICtail Plus Daughter Board has PICtail Plus and PICtail connectors to interface with a PIC® microcontroller (MCU) on the development boards that
support PICtail Plus or PICtail interface with the required pin mapping.
Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag
Anoniem: 187449
[ Voor 9% gewijzigd door Anoniem: 187449 op 04-06-2016 11:02 ]
Je kan direct met de module praten met de standaard firmware. Als je echter die PIC18 wilt herprogrammeren/debuggen heb je een PICKIT3 of ICD3 nodig. Van de pickit3 zijn ook chinese kloons beschikbaar die het prima doen.Digital-DNA schreef op zaterdag 04 juni 2016 @ 09:05:
Dat ding heeft twee opties geloof ik. Ik lees ook dat er een usb-kabel meegeleverd wordt en je 'm direct aan je pc kan hangen en 'ie als com-poort wordt herkend als je de USB-to-UART bridge mode gebruikt. Begrijp ik hieruit dat je 'm dan wel los kan gebruiken of hoe moet ik dit zien?
Anoniem: 187449
klopt, ik heb zelf deze chinees1337aldi schreef op zaterdag 04 juni 2016 @ 13:50:
[...]
Van de pickit3 zijn ook chinese kloons beschikbaar die het prima doen.
Ben er nu ook mee bezig. Heb de rn4020 als smd moddule in gebruik in MLDP modus.Digital-DNA schreef op vrijdag 03 juni 2016 @ 23:35:
Ik weet niet of ik hier aan het juiste adres ben, maar ik wil graag eens gaan experimenteren met het aansturen van een RN4020 Bluetooth chip. Hiervoor is een ontwikkelbordje beschikbaar die ik overweeg te kopen (met PIC18F25K50 microcontroller):
http://www.microchip.com/...px?PartNO=RN-4020-PICTAIL
Nu ben ik bekend met zo'n 6 programmeertalen en flans ik dagelijks fancy apps in elkaar. Met deze tak van sport ben ik echter iets minder bekend. Misschien dat ik hier wat help kan krijgen om op gang te komen.
Mijn eerste vraag is eigenlijk heel simpel: is het bordje uit bovenstaande link genoeg om mee te ontwikkelen, of is er nog een ander bordje nodig waar deze weer in past? Uit de documentatie en de voorbeelden wordt mij dit niet helemaal duidelijk namelijk.
Ben niet slim, maar wel dom
De NRF51822 is een goede optie zoals hij het beschrijft wat hij nodig heeft, maar hem rap noemen gaat me wel een beetje verRadiant schreef op zaterdag 04 juni 2016 @ 11:05:
Al eens naar de Nordic nRF-serie gekeken? Zijn leuke bordjes voor beschikbaar, is een rappe Cortex M0-processor die een softstack draait voor de BLE. Verder allerlei peripherals beschikbaar.
Goeie ervaringen mee
[ Voor 3% gewijzigd door Sissors op 09-06-2016 22:17 ]
De nRF52832 heeft een M4 core op 64MHz.Sissors schreef op donderdag 09 juni 2016 @ 22:17:
[...]
De NRF51822 is een goede optie zoals hij het beschrijft wat hij nodig heeft, maar hem rap noemen gaat me wel een beetje ver. Hij is veruit de traagste ARM MCU die ik ken met zijn M0 op 16MHz, eerstvolgende is 30MHz (die ik dus ken uit mijn hoofd).
Er is ook geloof ik een M4 versie van beschikbaar, al is die iig een stuk minder beschikbaar op allerlei dev bordjes.
Edit: Oh al weer wat dagen geleden, ach ja.
www.teamgenie.nl
You raise the blade, you make the change
You re-arrange me till I'm sane
You lock the door, and throw away the key
There's someone in my head but it's not me
Ik wil eigenlijk een custom GATT profiel gaan draaien en mijn app daar gebruik van laten maken. Eigenlijk een soort aangepaste hartslagmeter maar dan net anders. MLDP is voor mijn toepassing niet geschikt denk ik.itcouldbeanyone schreef op donderdag 09 juni 2016 @ 19:32:
[...]
Ben er nu ook mee bezig. Heb de rn4020 als smd moddule in gebruik in MLDP modus.
Heb zeer goede commenucatie doormiddel van mldp browser app. Ben nu nog bezig om dit in mijn eigen app te implementeren
Anoniem: 187449
kwam vandaag een nieuwe Arduino (primo) tegen waar die chip op zitDuDePrOdUcTiOnS schreef op vrijdag 10 juni 2016 @ 09:25:
[...]
De nRF52832 heeft een M4 core op 64MHz.
Ik ben het ook nog allemaal aan het uitzoeken.Digital-DNA schreef op zondag 12 juni 2016 @ 22:54:
[...]
Ik wil eigenlijk een custom GATT profiel gaan draaien en mijn app daar gebruik van laten maken. Eigenlijk een soort aangepaste hartslagmeter maar dan net anders. MLDP is voor mijn toepassing niet geschikt denk ik.
Ik zie dat je via een soort command line commando's kan sturen. Ik vraag me meer af hoe je echt een programmaatje kunt maken die je bijvoorbeeld direct laat zien als een apparaat verbinding maakt bijvoorbeeld, en via waar je het sturen van notificaties kunt regelen enzo. Ik lees iets over MLAP Code Configurator, is dat een tool die je hiervoor kunt gebruiken?
Ik heb nog niet echt ervaring met dit soort dingen.
Ben niet slim, maar wel dom
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
| /* ________ _______ VDD | \/ | VSS RA5 | 16F690 | RA0 POT-meter RA4 | | RA1 POT-meter (ext) Button RA3 | | RA2 POT-meter (ext) LED5e RC5 | | RC0 LED0 LED4e RC4 | | RC1 LED1 LED3 RC3 | | RC2 LED2 RC6 | | RB4 RC7 | | RB5 RB7 |_________________| RB6 */ #include <htc.h> __CONFIG(FCMEN_OFF & IESO_OFF & BOREN_OFF & CP_OFF & PWRTE_OFF & WDTE_OFF & MCLRE_OFF & FOSC_INTRCIO); #define FOSC 8000000L int potmeter, led; int signaal = 125; int stand = 10; int i; void delay(long i) // declareert de delay functie { while (i--); } void interrupt isr() { if(T0IF == 1) { i++; if(i == 21) { RC2 = 1; // i = 0; } else if (i >= 28) { RC2 = 0; i = 0; } T0IF = 0; } } /* void PWM(void){ // declareert de PWM functie // signal(); servo(); delay(5000); GO_nDONE = 1; while (GO_nDONE == 1); CCPR1L = signaal; // bepaalt PWM hoogte aan de hand van potmeter } */ void main(void) // hoofdprogramma { PORTC = 0; TRISC = 0; PORTB = 0; TRISB = 0; PORTA = 1; TRISA = 1; ANSEL = 0x01; // RA0 // ANSEL = 0x02; // RA1 // ANSEL = 0x04; // RA2 // EECON1 = 0b01; ANSELH = 0; ADCON0 = 0x01; // RA0 left justified // ADCON0 = 0x85; // RA1 left justified: 0x05, RJ: 0x85 // ADCON0 = 0x09; // RA2 left justified OSCCON = 0b01110101; // kloksnelheid 8 mhz ADCON1 = 0b00110000; // A/D clock = FRC (8 MHz) // ADCON1 = 0b00000000; OPTION_REG = 0b10000000; // Prescaler 1:2 TMR0 = 24; // interrupt supposed to be 0,1 ms T0IE = 1; // enable timer0 interrupt flag GIE = 1; // general interrupt enabled PEIE = 1; // pherriperal interrupt enable // CCP1CON = 0x0C; // 00001100 // T2CON = 0x06; // 00000101 // INTCON = 0b10 while(1) { } } |
629110
Apple iPhone 16e LG OLED evo G5 Google Pixel 10 Samsung Galaxy S25 Star Wars: Outlaws Nintendo Switch 2 Apple AirPods Pro (2e generatie) Sony PlayStation 5 Pro
Tweakers is onderdeel van
DPG Media B.V.
Alle rechten voorbehouden - Auteursrecht © 1998 - 2025
•
Hosting door TrueFullstaq