Forum: Mikrocontroller und Digitale Elektronik RFM12 empfängt nur Werte bis 127


von blogger b. (blogger)


Lesenswert?

Hallo

ich verwende die rfm lib von benedikt mit der polling methode und 
software spi.
es funktioniert auch soweit das einzige problem ist dass ich nur werte 
bis 127 senden kann über 127 wird nur noch das erste byte gesendet und 
die anderen werden dann nicht mehr gesendet.
wobei das erste byte von 0-255 funktioniert wie es auch sein soll.

von steffen (Gast)


Lesenswert?

ich kenne die Lib nicht,
aber das schaut doch nach nem signed/unsigned Fehler aus

siehe: http://de.wikipedia.org/wiki/Integer_%28Datentyp%29

von blogger b. (blogger)


Lesenswert?

und wieso funktioniert es mit dem 1sten byte ganz normal

das array der daten ist ein unsigned char array

von steffen (Gast)


Lesenswert?

wie gesagt, ich kenne die Lib nicht, aber 127 ist das Maximum bei signed 
int.
Da du auch kein Quelltext postet kann ich da jetzt auch nicht 
weiterhelfen...

von blogger b. (blogger)


Lesenswert?

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include "global.h"
4
#include "rf12.h"
5
6
#define F_CPU 8000000UL
7
#include <util/delay.h>
8
9
#define RF_PORT  PORTB
10
#define RF_DDR  DDRB
11
#define RF_PIN  PINB
12
13
#define SDI    3
14
#define SCK    5
15
#define CS    2
16
#define SDO    4
17
18
unsigned short rf12_trans(unsigned short wert)
19
{  unsigned char i;
20
21
  cbi(RF_PORT, CS);
22
  for (i=0; i<16; i++)
23
  {  if (wert&32768)
24
      sbi(RF_PORT, SDI);
25
    else
26
      cbi(RF_PORT, SDI);
27
    wert<<=1;
28
    if (RF_PIN&(1<<SDO))
29
      wert|=1;
30
    sbi(RF_PORT, SCK);
31
    asm("nop");
32
    asm("nop");
33
    cbi(RF_PORT, SCK);
34
  }
35
  sbi(RF_PORT, CS);
36
  return wert;
37
}
38
39
void rf12_init(void)
40
{
41
  RF_DDR=(1<<SDI)|(1<<SCK)|(1<<CS);
42
  RF_PORT=(1<<CS);
43
44
  for (unsigned char i=0; i<50; i++)
45
    _delay_ms(10);      // wait until POR done
46
  rf12_trans(0xC0E0);      // AVR CLK: 10MHz
47
  rf12_trans(0x80D7);      // Enable FIFO
48
  rf12_trans(0xC2AB);      // Data Filter: internal
49
  rf12_trans(0xCA81);      // Set FIFO mode
50
  rf12_trans(0xE000);      // disable wakeuptimer
51
  rf12_trans(0xC800);      // disable low duty cycle
52
  rf12_trans(0xC4F7);      // AFC settings: autotuning: -10kHz...+7,5kHz
53
}
54
55
void rf12_setbandwidth(unsigned char bandwidth, unsigned char gain, unsigned char drssi)
56
{
57
  rf12_trans(0x9400|((bandwidth&7)<<5)|((gain&3)<<3)|(drssi&7));
58
}
59
60
void rf12_setfreq(unsigned short freq)
61
{  if (freq<96)        // 430,2400MHz
62
    freq=96;
63
  else if (freq>3903)      // 439,7575MHz
64
    freq=3903;
65
  rf12_trans(0xA000|freq);
66
}
67
68
void rf12_setbaud(unsigned short baud)
69
{
70
  if (baud<664)
71
    baud=664;
72
  if (baud<5400)          // Baudrate= 344827,58621/(R+1)/(1+CS*7)
73
    rf12_trans(0xC680|((43104/baud)-1));  // R=(344828/8)/Baud-1
74
  else
75
    rf12_trans(0xC600|((344828UL/baud)-1));  // R=344828/Baud-1
76
}
77
78
void rf12_setpower(unsigned char power, unsigned char mod)
79
{  
80
  rf12_trans(0x9800|(power&7)|((mod&15)<<4));
81
}
82
83
void rf12_ready(void)
84
{  cbi(RF_PORT, SDI);
85
  cbi(RF_PORT, CS);
86
  asm("nop");
87
  while (!(RF_PIN&(1<<SDO))); // wait until FIFO ready
88
}
89
90
void rf12_txdata(unsigned char *data, unsigned char number)
91
{  unsigned char i;
92
  rf12_trans(0x8238);      // TX on
93
  rf12_ready();
94
  rf12_trans(0xB8AA);
95
  rf12_ready();
96
  rf12_trans(0xB8AA);
97
  rf12_ready();
98
  rf12_trans(0xB8AA);
99
  rf12_ready();
100
  rf12_trans(0xB82D);
101
  rf12_ready();
102
  rf12_trans(0xB8D4);
103
  for (i=0; i<number; i++)
104
  {    rf12_ready();
105
    rf12_trans(0xB800|(*data++));
106
  }
107
  rf12_ready();
108
  rf12_trans(0xB800);      // dummy data
109
  rf12_ready();
110
  rf12_trans(0xB800);      // dummy data
111
  rf12_ready();
112
  rf12_trans(0x8208);      // TX off
113
}
114
115
void rf12_rxdata(unsigned char *data, unsigned char number)
116
{  unsigned char i;
117
  rf12_trans(0x82C8);      // RX on
118
  rf12_trans(0xCA81);      // set FIFO mode
119
  rf12_trans(0xCA83);      // enable FIFO
120
  for (i=0; i<number; i++)
121
  {  rf12_ready();
122
    *data++=rf12_trans(0xB000);
123
  }
124
  rf12_trans(0x8208);      // RX off
125
}

von ziegenpeter (Gast)


Lesenswert?

Wenn das der Code ist, den du benutzt, dann würd ich sagen, liegt es 
nicht daran, sondern an deinem Code, den du hier nicht gepostet hast.

von steffen (Gast)


Lesenswert?

und wo ist da der Teil von dir der nicht geht?
Ich kann da ehrlich gesagt auf den ersten Blick kein char-Array erkennen

von blogger b. (blogger)


Lesenswert?

Sender
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
#include "usart.h"
5
#include "rf12.h"
6
7
8
int main(void) 
9
{
10
  usart_init(19200); // Serielle Schnittstelle initialisieren
11
  usart_write("Sender\r\n"); 
12
13
//RFM
14
  rf12_init();          // ein paar Register setzen (z.B. CLK auf 10MHz)
15
  rf12_setfreq(RF12FREQ(433.92));  // Sende/Empfangsfrequenz auf 433,92MHz einstellen
16
  rf12_setbandwidth(4, 1, 4);    // 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm 
17
  rf12_setbaud(19200);      // 19200 baud
18
  rf12_setpower(0, 6);      // 1mW Ausgangangsleistung, 120kHz Frequenzshift
19
  
20
  usart_write("Settings done!\r\n");
21
  
22
  while(1)
23
  {    
24
    unsigned char tx[6];
25
26
    tx[0]=0; 
27
    tx[1]=50;
28
    tx[2]=100;
29
    tx[3]=150;  
30
    tx[4]=200;
31
    tx[5]=255;
32
33
    rf12_txdata(tx,6);
34
    _delay_ms(10);
35
  }
36
}

Empfänger
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include "usart.h"
4
#include "rf12.h"
5
6
7
int main(void) 
8
{
9
10
  usart_init(19200); // Serielle Schnittstelle initialisieren
11
12
//RFM
13
  rf12_init();          // ein paar Register setzen (z.B. CLK auf 10MHz)
14
  rf12_setfreq(RF12FREQ(433.92));  // Sende/Empfangsfrequenz auf 433,92MHz einstellen
15
  rf12_setbandwidth(4, 1, 4);    // 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm 
16
  rf12_setbaud(19200);      // 19200 baud
17
  rf12_setpower(0, 6);      // 1mW Ausgangangsleistung, 120kHz Frequenzshift
18
  
19
  sei();                              // Interrupts global an
20
  
21
  while(1)
22
  {
23
    unsigned char rx[10];  
24
25
    uint8_t k= rf12_rxdata(rx,6);
26
    usart_write("%s\n",rx);
27
28
  }
29
}

von blogger b. (blogger)


Lesenswert?

das ist der code von mir...

von Andreas H. (andreas_h16)


Lesenswert?

usart_write("%s\n",rx);

Was sagt das %s noch mal ?

von blogger b. (blogger)


Lesenswert?

dass rx ein string ist

von ziegenpeter (Gast)


Lesenswert?

Das ist ja wie bei Super Mario hier:

Thank You Mario, But Our Princess Is In Another Castle!


Der Fehler ist in der usart_write() funktion.

von Andreas H. (andreas_h16)


Lesenswert?

>>usart_write("%s\n",rx);
>>Was sagt das %s noch mal ?
>dass rx ein string ist

So, ich kenn jetzt zwar Deine usart_write funktion nicht, aber daß die 
printf Format-Bezeichner kann, ist schon mal einen Blick wert.

Wenn die dann auch wirklich noch ein %s verträgt, dann sollte man den 
rx-string auch noch ne Null am Ende spendieren.


BTW, rf12_rxdata gibt void zurück:
void rf12_rxdata(unsigned char *data, unsigned char number);

uint8_t k= rf12_rxdata(rx,6);

Was ist dann nochmal k?

Einfach mal mit einem sprintf testen:
sprintf(buf, "%x,%x,%x,%x,%x,%x", rx[0], ..., rx[5]);
usart_write(buf);

Was gibt das ?

von blogger b. (blogger)


Lesenswert?

das k ist noch übergeblieben von einer anderen lib...

jz hab ich so gemacht
1
    for(uint8_t i=0 ; i<5;i++)
2
    {
3
      usart_write_char(rx[i]);
4
    }
5
    usart_write_str("\n");

und senden wie vorher

wenn ich jetzt
1
    tx[0]=254;
2
    tx[1]=5;
3
    tx[2]=5;
4
    tx[3]=5;  
5
    tx[4]=5;
6
    tx[5]=5;
sende empfange ich per uart(in dezimal)
254 005 005 254 005 005

mit
1
    tx[0]=30;
2
    tx[1]=5;
3
    tx[2]=5;
4
    tx[3]=5;  
5
    tx[4]=5;
6
    tx[5]=5;
empfange ich 030 005 005 030 005 005

also irgendwie wird da alles doppelt gesendet

von blogger b. (blogger)


Lesenswert?

hat jemand für mich einen rat?

von dunno.. (Gast)


Lesenswert?

hi..

also ich habe zum testen meiner module meist keine fixen zahlen, sondern 
immer veränderliche werte gesendet.. also einen index, den du ständig 
hochzählst..

damit kannst du sichergehen, ob nicht vielleicht die letzten 3 zeichen 
einfach schon der beginn einer neuen übertragung o.ä. sind..

mfg

von Bastler (Gast)


Lesenswert?

Das ganz oben genante Problem habe ich auch mit Zwei 433 Mhz Pollin 
Module seit ein paar Tagen. Aber davor gingen die Dinger einwandfrei. 
Ich glaube das es an den Modulen liegt. Habe alerdings nur zwei Module.

von dunno.. (Gast)


Lesenswert?

nimm doch den treiber von j.eckert, der ist sowieso sinnvoller weil 
interrupt-gesteuert..

mfg

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.