main_empfaenger.c


1
/*
2
 * Ampel_code_empfaenger.c
3
 *
4
 * Created: 20.05.2016 16:46:31
5
 * Author : Marvin
6
 */ 
7
8
9
10
/* Dies ist der Code zur Ampelsteuerung des FC Pfeil Broistedt.
11
   Geschrieben von Marvin Wenzel im Frühjahr 2016.
12
   
13
   Dieser Codeteil ist für die AMPELN, d.h. die Empfänger.
14
   
15
   Verwendet wird ein Atmega328PU sowie ein NRF24L01+ Funkmodul.
16
   Betrieben wird beides mit 3,3V. Getaktet wird mit den internen 8 MHz.
17
   
18
   Im folgenden sind die Pinbelegungen aufgeführt:
19
   
20
   PB0: CE
21
   PB1: CSN
22
   PB2: SSnot
23
   PB3: MOSI
24
   PB4: MISO
25
   PB5: SCK
26
   PB6: IRQ (PCint6)
27
   PB7:
28
   
29
   PC0: 
30
   PC1: 
31
   PC2: 
32
   PC3: 
33
   PC4: 
34
   PC5:
35
   RESETnot: 3,3V
36
   
37
   PD0:
38
   PD1:
39
   PD2:
40
   PD3:
41
   PD4:
42
   PD5:
43
   PD6: 
44
   PD7:
45
*/
46
47
#ifndef F_CPU        //Define F_CPU if not done
48
#define F_CPU 8000000UL
49
#endif
50
51
#define BAUD 9600UL      // Baudrate
52
53
// Berechnungen
54
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
55
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
56
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
57
58
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
59
#error Systematischer Fehler der Baudrate groesser 1% und damit zu hoch!
60
#endif
61
62
63
64
65
#include <avr/io.h>
66
#include <avr/interrupt.h>
67
#include <util/delay.h>
68
#include "wl_module.h"
69
#include "nRF24L01.h"
70
#include "spi.h"
71
72
73
74
void atmega_init();
75
void uart_init(void);
76
int uart_putuint8_1(uint8_t c);
77
void uart_putuint8_s(uint8_t *s);
78
int uart_putc(char c);
79
void uart_puts (char *s);
80
81
uint8_t empfangsdaten[wl_module_PAYLOAD] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3";
82
uint8_t status_funkmodul = 0;
83
uint8_t counter = 0;
84
volatile uint8_t PTX;
85
86
int main(void)
87
{
88
  uart_init();
89
  uart_puts("Beginne Initialisierung...\n");
90
  
91
  atmega_init();    // Atmega initialisieren
92
  wl_module_init();
93
  _delay_ms(50);
94
  sei();
95
  wl_module_rx_config();
96
  wl_module_config_register(EN_AA,ENAA_P0);  //Auto Acknowledgment bei P0
97
  
98
  
99
  uint8_t status_funk = 0;
100
  uart_puts("RX_payload: ");
101
  status_funk = wl_module_get_rx_pw(0);
102
  uart_putuint8_1(status_funk + '0');
103
  uart_puts(" \n");
104
    
105
  
106
107
  PORTD = 0x00;
108
  // ACHTUNG: Playload steht momentan auf 32
109
    while (1) 
110
    {
111
      uart_puts("Warte_auf Empfang...\n");
112
    
113
      while(!wl_module_data_ready());              // Auf neue Daten warten
114
      status_funkmodul = wl_module_get_data(empfangsdaten);  // neue daten Abfragen
115
      
116
        switch (empfangsdaten[wl_module_PAYLOAD-1]-'0')
117
        {
118
          case 0: PORTD = 0x01; break;
119
          case 1: PORTD = 0x02; break;
120
          case 2: PORTD = 0x04; break;
121
          case 3: PORTD = 0x08; break;
122
          case 4: PORTD = 0x10; break;
123
          default: PORTD = 0xFF; break;
124
        }
125
        
126
      uart_puts("Empfangen:\n");
127
      uart_putuint8_s(empfangsdaten);
128
      uart_puts("\n");
129
    }
130
}
131
132
133
void atmega_init()
134
{
135
  // Auf 8 MHz intern umstellen
136
  CLKPR = 0x80;            // Aenderungen erlauben
137
  CLKPR = 0x00;            // internen CLK nicht teilen = 8 MHz
138
    
139
    
140
  // Zum testen
141
  DDRD = 0xFF;
142
  PORTD = 0x00;
143
}
144
145
void uart_init(void)
146
{
147
  UBRR0H = UBRR_VAL >> 8;
148
  UBRR0L = UBRR_VAL & 0xFF;
149
  
150
  UCSR0B |= (1<<TXEN0);  // UART TX einschalten
151
  UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);  // Asynchron 8N1
152
}
153
154
int uart_putuint8_1(uint8_t c)
155
{
156
  while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich */
157
  {
158
  }
159
  
160
  UDR0 = c;                      /* sende Zeichen */
161
  return 0;
162
}
163
164
void uart_putuint8_s(uint8_t *s)
165
{
166
  while (*s)
167
  {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
168
    uart_putc(*s);
169
    s++;
170
  }
171
}
172
173
int uart_putc(char c)
174
{
175
  while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich */
176
  {
177
  }
178
  
179
  UDR0 = c;                      /* sende Zeichen */
180
  return 0;
181
}
182
183
void uart_puts(char *s)
184
{
185
  while (*s)
186
  {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
187
    uart_putc(*s);
188
    s++;
189
  }
190
}