Forum: Mikrocontroller und Digitale Elektronik RFM70 schon wieder.


von Christoph B. (nuke)


Lesenswert?

Hallo,

das Thema RFM70 ist ja hier schon öfter diskutiert worden, jetzt habe 
ich mich auch mal daran versucht, die Teile mittels AVR zum laufen zu 
bekommen.
Leider kommt auf der Gegenseite nur Mist an.

Ich habe auf einem Steckbrett mal einen Testaufbau gemacht, mit 2 
ATMega48 und einem PTX und einem PRX RFM70. Da ich die RFM70-Bibliothek 
von http://projects.weber-itam.de/?p=90 verwende, dachte ich eigentlich, 
es sollte keine Probleme geben. Die Kommunikation beider Module mit dem 
zugehörigen AVR funktioniert, ich habe mal testweise die Channels 
ausgelesen und über UART ausgegeben, klappt alles wunderbar.
Die RX-Seite reagiert auf ein ankommendes Paket und sendet das Ergebnis 
per UART ab, es kommen aber nur Linefeeds und Punkte (dez.: 10 und 46) 
an...

Hier mein Code:
1
//#define SEND
2
3
#include <inttypes.h>
4
#include <avr/io.h>
5
#include <avr/interrupt.h>
6
#include <util/delay.h>
7
#include <stdlib.h>
8
9
#include "uart.h"
10
#include "rfm70.h"
11
 
12
#define UART_BAUD_RATE 9600
13
14
#ifndef SEND
15
// ###################### RECEIVE CODE ######################
16
17
int main()
18
{
19
  uint8_t buffer[32];
20
  uint8_t val;
21
22
  sei();
23
24
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
25
  uart_puts("System Ready\n");
26
27
  Begin();
28
  setMode(1);
29
  setChannel(25);
30
31
  while (1)
32
  {
33
    val = receivePayload(buffer);
34
35
    if (val) {
36
37
      uart_puts((char*) buffer);
38
      uart_puts("\n");
39
    }
40
  }
41
  
42
  return 0;
43
}
44
45
#else
46
// ###################### SEND CODE ######################
47
48
int main()
49
{
50
  uint8_t value1 = 0;
51
52
  sei();
53
54
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
55
  uart_puts("System Ready\n");
56
57
  Begin();
58
  setMode(0);
59
  setChannel(25);
60
61
  while (1) {
62
63
    value1 = (uint8_t)uart_getc();
64
65
    if(value1) {
66
67
      PORTB |= (1<<PB0);
68
69
      sendPayload(value1,1,0);
70
      uart_putc(value1);
71
72
      PORTB &= ~(1<<PB0);
73
    }
74
75
  }
76
  
77
  return 0;
78
}
79
80
#endif

Ich hoffe, ihr könnt mir helfen!

Viele Grüße,
Christoph

von Fabian O. (xfr)


Lesenswert?

Christoph Brennig schrieb:
> Ich hoffe, ihr könnt mir helfen!

Den Fehler kannst Du sehr einfach selber finden, indem Du die Warnung 
des Compilers beachtest. Diese Warnungen gibt es nicht umsonst. Sie 
bedeuten in aller Regel, dass das Programm nicht macht, was es soll.

Falls noch nicht geschehen, füge in den Projektoptionen -Wall ein, dann 
warnt der Compiler in noch mehr Situationen vor Fehlerquellen.

von Christoph B. (nuke)


Lesenswert?

Hmm, die hatte ich übersehen...
Für alle anderen: Die Lösung war das fehlende &:
1
sendPayload(&value1,1,0);

Danke!

von Fabian O. (xfr)


Lesenswert?

Du hast auch noch einen anderen, subtileren Fehler im Code. Die Funktion 
uart_puts() erwartet nämlich einen Null-terminierten String. 
receivePayload() liefert dagegen nur die Bytes, die Du per Funk 
übertragen hast, ohne abschließendes Null-Byte.

Der Code funktioniert nur zufällig, weil Dein Paket kürzer als 32 Byte 
ist und das Array buffer anscheinend zu Beginn des Programms mit Null 
gefüllt ist. Letzteres ist aber nicht selbstverändlich, da Du es nicht 
explizit initialisiert hast!

Du musst also entweder das Null-Byte mit übertragen oder die 
Ausgabefunktion im Empfänger ändern, damit es sauber funktioniert.

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.