1 | /********************************************************************
|
2 | Beispiel für RFM12-Funkmodul (Senden)
|
3 | IAR Embedded Workbench IDE, C
|
4 | Prozessor: ATMEGA8
|
5 | Frequenz: 434MHz
|
6 | Datenrate: 4.8kbps
|
7 |
|
8 | Diese Programm stellt eine kurze Testroutine für den ATMEGA8 in
|
9 | Verbindung mit einem externen 8MHz Quarz, einem RFM12-Funkmodul, und
|
10 | dem Pollin Electronic Funk-AVR-Evaluations-Board dar.
|
11 | Es handelt sich ausdrücklich um eine Testroutine und ein Anwendungs-
|
12 | beispiel. Elementare Elemente wie Fehlerbehandlungen usw. sind nicht
|
13 | vorhanden.
|
14 |
|
15 | Ablauf:
|
16 | Sendet Preamble, Frame-Recognition, 16 Datenbyte und ChkSumme der
|
17 | 16 Datenbyte. Anschließend erfolgt eine Signalisierung mit LED1.
|
18 | Dies geschieht in einer Endlosschleife.
|
19 |
|
20 | Pinbelegung
|
21 | -----------------------
|
22 | ATMEGA8 RFM12
|
23 | -----------------------
|
24 | SCK SCK
|
25 | MISO SDO
|
26 | MOSI SDI
|
27 | SS nSEL
|
28 | INT0 nIRQ
|
29 | PD6 LED1
|
30 | PD5 LED2
|
31 | PD4 Module-Power
|
32 |
|
33 | PD7 FSK
|
34 | PD3 DCLK,FFIT
|
35 | PB0 NINT, VDI
|
36 | **********************************************************************/
|
37 | #define F_CPU 16000000UL
|
38 |
|
39 | #include <avr/io.h>
|
40 | #define DDR_IN 0
|
41 | #define DDR_OUT 1
|
42 | #define PORT_SEL PORTB
|
43 | #define PIN_SEL PINB
|
44 | #define DDR_SEL DDRB
|
45 | #define PORT_SDI PORTB
|
46 | #define PIN_SDI PINB
|
47 | #define DDR_SDI DDRB
|
48 | #define PORT_SCK PORTB
|
49 | #define PIN_SCK PINB
|
50 | #define DDR_SCK DDRB
|
51 | #define PORT_SDO PORTB
|
52 | #define PIN_SDO PINB
|
53 | #define DDR_SDO DDRB
|
54 | #define PORT_DATA PORTD
|
55 | #define PIN_DATA PIND
|
56 | #define DDR_DATA DDRD
|
57 | #define PB7 7
|
58 | #define PB6 6// |
|
59 | #define RFXX_SCK 5// |
|
60 | #define RFXX_SDO 4// |RF_PORT
|
61 | #define RFXX_SDI 3// |
|
62 | #define RFXX_SEL 2// |
|
63 | #define NC 1// |
|
64 | #define PB0 0//--/
|
65 | #define SEL_OUTPUT() DDR_SEL |= (1<<RFXX_SEL)
|
66 | #define HI_SEL() PORT_SEL|= (1<<RFXX_SEL)
|
67 | #define LOW_SEL() PORT_SEL&=~(1<<RFXX_SEL)
|
68 | #define SDI_OUTPUT() DDR_SDI |= (1<<RFXX_SDI)
|
69 | #define HI_SDI() PORT_SDI|= (1<<RFXX_SDI)
|
70 | #define LOW_SDI() PORT_SDI&=~(1<<RFXX_SDI)
|
71 | #define SDO_INPUT() DDR_SDO&= ~(1<<RFXX_SDO)
|
72 | #define SDO_HI() PIN_SDO&(1<<RFXX_SDO)
|
73 | #define SCK_OUTPUT() DDR_SCK |= (1<<RFXX_SCK)
|
74 | #define HI_SCK() PORT_SCK|= (1<<RFXX_SCK)
|
75 | #define LOW_SCK() PORT_SCK&=~(1<<RFXX_SCK)
|
76 | #define RF12_DATA 7//PD7
|
77 | #define DATA_OUT DDR_DATA|=1<<RF12_DATA
|
78 | #define HI_DATA PORT_DATA|=1<<RF12_DATA
|
79 | #define LED1_OUTPUT() DDRD|=((1<<6)|(1<<4)) //+Module-Power
|
80 | #define LED1_OFF() PORTD&=~(1<<6)
|
81 | #define LED1_ON() PORTD|=(1<<6)
|
82 | #define MODULE_OFF() PORTD&=~(1<<4)
|
83 | #define MODULE_ON() PORTD|=(1<<4)
|
84 |
|
85 | void RFXX_PORT_INIT(void){
|
86 | HI_SEL();
|
87 | HI_SDI();
|
88 | LOW_SCK();
|
89 | SEL_OUTPUT();
|
90 | SDI_OUTPUT();
|
91 | SDO_INPUT();
|
92 | SCK_OUTPUT();
|
93 | }
|
94 |
|
95 | unsigned int RFXX_WRT_CMD(unsigned int aCmd){
|
96 | unsigned char i;
|
97 | unsigned int temp;
|
98 | LOW_SCK();
|
99 | LOW_SEL();
|
100 | for(i=0;i<16;i++){
|
101 | temp<<=1;
|
102 | if(SDO_HI()){
|
103 | temp|=0x0001;
|
104 | }
|
105 | LOW_SCK();
|
106 | if(aCmd&0x8000){
|
107 | HI_SDI();
|
108 | }else{
|
109 | LOW_SDI();
|
110 | }
|
111 | HI_SCK();
|
112 | aCmd<<=1;
|
113 | };
|
114 | LOW_SCK();
|
115 | HI_SEL();
|
116 | return(temp);
|
117 | }
|
118 |
|
119 | void RF12_INIT(void){
|
120 |
|
121 |
|
122 | RFXX_WRT_CMD(0x80D7);//EL,EF,12.0pF
|
123 | RFXX_WRT_CMD(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
|
124 | RFXX_WRT_CMD(0xA67C);
|
125 | RFXX_WRT_CMD(0xC647);//4.8kbps
|
126 | RFXX_WRT_CMD(0x94A0);//VDI,FAST,134kHz,0dBm,-103dBm
|
127 | RFXX_WRT_CMD(0xC2AC);//AL,!ml,DIG,DQD4
|
128 | RFXX_WRT_CMD(0xCA81);//FIFO8,SYNC,!ff,DR
|
129 | RFXX_WRT_CMD(0xC483);//@PWR,NO RSTRIC,!st,!fi,OE,EN
|
130 | RFXX_WRT_CMD(0x9850);//!mp,9810=30kHz,MAX OUT
|
131 | RFXX_WRT_CMD(0xE000);//NOT USE
|
132 | RFXX_WRT_CMD(0xC800);//NOT USE
|
133 | RFXX_WRT_CMD(0xC400);//1.66MHz,2.2V
|
134 |
|
135 |
|
136 | }
|
137 |
|
138 | void RF12_SEND(unsigned char aByte){
|
139 | while(PIND&(1<<2));//wait for previously TX over
|
140 | RFXX_WRT_CMD(0xB800+aByte);
|
141 | }
|
142 |
|
143 | void Delay_ms(unsigned char amS){
|
144 | unsigned char i;
|
145 | unsigned int j;
|
146 | for(i=0;i<amS;i++)for(j=0;j<914;j++);
|
147 | }
|
148 |
|
149 | void main(void)
|
150 | {
|
151 | unsigned int i,j;
|
152 | unsigned char ChkSum;
|
153 | asm("cli");
|
154 | DDRB=0x00;//PB INPUT;
|
155 | DDRD=0x00;//PD INPUT;
|
156 | //POWER ON indication: LED blink 3 times
|
157 | LED1_OUTPUT();
|
158 | LED1_OFF();
|
159 | MODULE_OFF(); //for reset
|
160 | for(i=0;i<3;i++){
|
161 | Delay_ms(200);
|
162 | LED1_ON();
|
163 | Delay_ms(200);
|
164 | LED1_OFF();
|
165 | }
|
166 | LED1_OFF();
|
167 | MODULE_ON();
|
168 | Delay_ms(200);
|
169 |
|
170 | RFXX_PORT_INIT();
|
171 | RF12_INIT();
|
172 | DDRD|=(1<<RF12_DATA);
|
173 | PORTD|=(1<<RF12_DATA);// SET nFFS pin HI when using TX register
|
174 | DDRD&=~(1<<2); //PD2(INT0)
|
175 | while(1){
|
176 | LED1_ON();
|
177 | RFXX_WRT_CMD(0x0000);//read status register
|
178 | RFXX_WRT_CMD(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
|
179 | ChkSum=0;
|
180 | RF12_SEND(0xAA);//PREAMBLE
|
181 | RF12_SEND(0xAA);//PREAMBLE
|
182 | RF12_SEND(0xAA);//PREAMBLE
|
183 | RF12_SEND(0x2D);//SYNC HI BYTE
|
184 | RF12_SEND(0xD4);//SYNC LOW BYTE
|
185 | RF12_SEND(0x30);//DATA BYTE 0
|
186 | ChkSum+=0x30;
|
187 | RF12_SEND(0x31);//DATA BYTE 1
|
188 | ChkSum+=0x31;
|
189 | RF12_SEND(0x32);
|
190 | ChkSum+=0x32;
|
191 | RF12_SEND(0x33);
|
192 | ChkSum+=0x33;
|
193 | RF12_SEND(0x34);
|
194 | ChkSum+=0x34;
|
195 | RF12_SEND(0x35);
|
196 | ChkSum+=0x35;
|
197 | RF12_SEND(0x36);
|
198 | ChkSum+=0x36;
|
199 | RF12_SEND(0x37);
|
200 | ChkSum+=0x37;
|
201 | RF12_SEND(0x38);
|
202 | ChkSum+=0x38;
|
203 | RF12_SEND(0x39);
|
204 | ChkSum+=0x39;
|
205 | RF12_SEND(0x3A);
|
206 | ChkSum+=0x3A;
|
207 | RF12_SEND(0x3B);
|
208 | ChkSum+=0x3B;
|
209 | RF12_SEND(0x3C);
|
210 | ChkSum+=0x3C;
|
211 | RF12_SEND(0x3D);
|
212 | ChkSum+=0x3D;
|
213 | RF12_SEND(0x3E);
|
214 | ChkSum+=0x3E;
|
215 | RF12_SEND(0x3F); //DATA BYTE 15
|
216 | ChkSum+=0x3F;
|
217 | RF12_SEND(ChkSum); //send chk sum
|
218 | RF12_SEND(0xAA);//DUMMY BYTE
|
219 | RF12_SEND(0xAA);//DUMMY BYTE
|
220 | RF12_SEND(0xAA);//DUMMY BYTE
|
221 | RFXX_WRT_CMD(0x8201);
|
222 | LED1_OFF();
|
223 | for(i=0;i<10000;i++)for(j=0;j<123;j++);//sleep
|
224 | };
|
225 | }
|