RFM70 schon wieder.

OP #3048357
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
#3048891
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.
#3049146
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.