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)
30.08.2011 16:23
ich kenne die Lib nicht,
aber das schaut doch nach nem signed/unsigned Fehler aus
siehe: http://de.wikipedia.org/wiki/Integer_%28Datentyp%29
und wieso funktioniert es mit dem 1sten byte ganz normal
das array der daten ist ein unsigned char array
von
steffen (Gast)
30.08.2011 17:14
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...
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)
30.08.2011 18:05
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)
30.08.2011 18:07
und wo ist da der Teil von dir der nicht geht?
Ich kann da ehrlich gesagt auf den ersten Blick kein char-Array erkennen
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 }
das ist der code von mir...
usart_write("%s\n",rx);
Was sagt das %s noch mal ?
von
ziegenpeter (Gast)
01.09.2011 14:15
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.
>>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 ?
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
hat jemand für mich einen rat?
von
dunno.. (Gast)
03.09.2011 19:51
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)
08.11.2011 21:44
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)
08.11.2011 23:31
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.