Hi Leute,
ich bastel gerade an meinem Robi rum.
Ich habe zwei rfm12 funkmodule und auch erfolgreich, dankt dem programm
von Benedikt, Eckert und Ulrich Radig, damit versendet.
ich habe so eine art echo kommunikation aufgebaut. Dabei sende ich über
UART vom PC an das erste Board. Dieses versendet die Nachricht dann per
Funk.
Das zweite Board ist mein Roboter. Er lauscht immer und sendet, wenn er
etwas empfangen hat, an den PC zurück(LED1 blinkt).
Nun soll mei roboter aber auch noch etwas anderes machen als nur
lauschen.
Dafür habe ich einen Timer eingebaut, der alle 100ms (LED2 blinkt) etwas
machen soll.
Leider Funktioniert beides zusammen nicht. Ich kann über funkt nichts
empfangen.
Wenn ich jedoch in der Funktion receive() die globalen Interrupts
deaktiviere, dann kann ich funken. Das führt aber dazu, dass mein Timer
nicht mehr geht (LED2 blinkt nicht).
Ich weiß leider nicht so recht was ich da jetzt machen soll und woran
das liegen kann.
ich hab mal ganz viel unnützen kram auskommentiert und das komplette
Programm als Zipp angehängt.
1 | for(;;)
|
2 | {
|
3 |
|
4 | receive(); // über das Funkmodul empfangen
|
5 |
|
6 | if(Gettime() >= (zeit + 100)) // alle 100ms
|
7 | {
|
8 | zeit = Gettime(); // ruft die aktuelle systemzeit ab
|
9 | /****** Eingänge Lesen *********/
|
10 |
|
11 | //batteryVoltage = ReadChannel(PA3); // Liest die BatterieSpannung
|
12 |
|
13 | // ************* Motorregelung ***************
|
14 | //regelung(LEFT); // linken Motor regeln
|
15 | //regelung(RIGHT); // rechten Motor regeln
|
16 |
|
17 | // ************* Serielle Kommunikation ******
|
18 | if(rfm12_getc(&buf) == 1)
|
19 | { // pcc_rx(buf); // PC Kommunikation
|
20 | }
|
21 | //pcc(); // Befehlsinterpreter
|
22 |
|
23 | LED2_TOG;
|
24 |
|
25 | } // end every 100ms
|
26 |
|
27 | } // end endlesloop
|
28 |
|
29 | // Über funk empfangen
|
30 | void receive(void)
|
31 | {
|
32 | uint8_t tmp_sreg;
|
33 | tmp_sreg = SREG;
|
34 | //cli();
|
35 |
|
36 | // Empfangen
|
37 | if(rf12_rxdata(test))
|
38 | {
|
39 |
|
40 | LED1_TOG;
|
41 |
|
42 | // über Uart ausgeben
|
43 | uart_puts((char*)test);
|
44 |
|
45 | // Pause
|
46 | for(long a = 0;a<10000;a++){asm("nop");}
|
47 |
|
48 | // zurücksenden
|
49 | rf12_txdata(test,100);
|
50 |
|
51 | fifo_put(&infifo, test[0]);
|
52 |
|
53 | LED1_TOG;
|
54 | }
|
55 |
|
56 | //SREG = tmp_sreg;
|
57 |
|
58 | }
|
59 |
|
60 | // empfangene daten ausgeben
|
61 | uint8_t rfm12_getc(uint8_t *date)
|
62 | {
|
63 | uint8_t data = 0;
|
64 |
|
65 | if (fifo_get(&infifo, &data)==0){
|
66 | *date = data;
|
67 | return 1;
|
68 | } else {
|
69 | return 0;
|
70 | }
|
71 | }
|
72 | // Aus der nbot_lib\Timer.c
|
73 | /****************************************************************************/
|
74 | /*!
|
75 | \brief
|
76 | Gibt die aktuelle Zeit in ms zurueck.
|
77 |
|
78 | Die vergangene Zeit seit dem Einschalten\n
|
79 | Genauer: nachdem der Interrupt Timer2 aktiviert wurde.\n
|
80 |
|
81 | \param
|
82 | keine
|
83 |
|
84 | \return
|
85 | Einschaltzeit in Millisekunden (Bereich: unsigned long 0..286331153)\n
|
86 | Das sind ca. 79.5 Stunden. Diese Zeitangabe reicht bis der Accu leer ist.
|
87 |
|
88 | \par Beispiel:
|
89 | (Nur zur Demonstration der Parameter/Returnwerte)
|
90 | \code
|
91 | // Alle 500 ms die Front-LED umschalten.
|
92 | unsigned long zeit;
|
93 | unsigned char on_off = TRUE;
|
94 |
|
95 | zeit = Gettime ();
|
96 | while (1)
|
97 | {
|
98 | if (Gettime () > zeit + 500)
|
99 | {
|
100 | zeit = Gettime ();
|
101 | FrontLED (on_off);
|
102 | on_off ^= 1;
|
103 | }
|
104 | }
|
105 | \endcode
|
106 | *****************************************************************************/
|
107 | unsigned long Gettime (void)
|
108 | {
|
109 | return ((timebase * 256) + count36kHz) / 36;
|
110 | }
|