Forum: Mikrocontroller und Digitale Elektronik Atmega 8 Funk Eva Board RFM12


von Sonke A. (soeni)


Lesenswert?

Hallo, nachdem ich leider daran gescheitert bin ein RFM12 Modul mit 
meiner Schaltung und einem Atmega128 in Betrieb zu nehmen, hab ich nun 
versucht mit dem Pollin Avr Funk Eval Board das Teil anzusprechen. 
Hierzu hab ich wie im Forum beschrieben einen Widerstand(10k) gegen vcc 
an den Pin nFFS ergänzt. in der Software die Pins eingetragen (Software 
ist von hier: Beitrag "Beispielprogramm für RFM12 433MHz Funk-Module") nun sollte 
doch zumindest der Status auszulesen sein, aber weit gefehlt, es klappt 
immer noch nicht. das ist einfach zum kotzen arrrrrrrgggggg.....

Aber ihr könnt nix dafür, dass ich dazu anscheinen zu doof bin.

Meine letzte Hoffnung: der tackt wird ja am Modul auf 10 Mhz gesetzt. 
der Atmega auf dem board läuft aber mit 12 Mhz, kann es da Probleme 
geben?

Ansonsten kennt ihr oder habt ihr vielleicht ein programm, welches 
einfach den Status des Moduls ausliest und ihn per UART rausschickt?

Oder habt ihr vielleicht eine Lösung?
1
//################ Datei TR-funk.c, Version 1.0, Datum 30.08.08 #################
2
/*
3
4
  Autor: Sönke Paschko
5
6
  Beschreibung:
7
8
       In dieser Datei werden die Hauptfunktionen für die Funkverbindung definiert.
9
10
11
*/
12
//##################################################################################
13
14
15
//###################                 Includes                   ###################
16
 
17
    #include "head.h"      // generelle Headdatei mit Definitionen  
18
19
//###################                 Funktionen                 ###################
20
21
22
23
//###################                 Variablen                  ###################
24
25
26
27
28
29
30
31
unsigned short rf12_trans(unsigned short wert)
32
{  unsigned short werti=0;
33
  unsigned char i;
34
35
  cbi(CS_RF_PORT, CS);
36
  for (i=0; i<16; i++)
37
  {  if (wert&32768)
38
      sbi(RF_PORT, SDI);
39
    else
40
      cbi(RF_PORT, SDI);
41
    werti<<=1;
42
    if (RF_PIN&(1<<SDO))
43
      werti|=1;
44
    sbi(RF_PORT, SCK);
45
    wert<<=1;
46
    _delay_us(0.3);
47
    cbi(RF_PORT, SCK);
48
  }
49
  sbi(CS_RF_PORT, CS);
50
  return werti;
51
}
52
53
void rf12_init(void)
54
{
55
  RF_DDR=(1<<SDI)|(1<<SCK);
56
  CS_RF_DDR=(1<<CS);
57
  CS_RF_PORT=(1<<CS);
58
59
60
    _delay_ms(100);      // wait until POR done
61
  
62
  //Ergänzung zum Debuggen
63
64
  rf12_trans(0x0000);      // Status auslesen
65
  char str[10];
66
  itoa(rf12_trans(0x0000), str, 2); // Binär anzeigen
67
  uart_puts("Status vor init:  0b");      // Ausgabe auf UART
68
  uart_puts(str);
69
  uart_puts("\r\n");
70
  // Ende ergänzung
71
72
  rf12_trans(0xC0E0);      // AVR CLK: 10MHz
73
  rf12_trans(0x80D7);      // Enable FIFO
74
  rf12_trans(0xC2AB);      // Data Filter: internal
75
  rf12_trans(0xCA81);      // Set FIFO mode
76
  rf12_trans(0xE000);      // disable wakeuptimer
77
  rf12_trans(0xC800);      // disable low duty cycle
78
  rf12_trans(0xC4F7);      // AFC settings: autotuning: -10kHz...+7,5kHz
79
  
80
  // Ursprünglich in Int main()
81
  rf12_setfreq(RF12FREQ(433.92));  // Sende/Empfangsfrequenz auf 433,92MHz einstellen
82
  rf12_setbandwidth(4, 1, 4);    // 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm 
83
  rf12_setbaud(19200);      // 19200 baud
84
  rf12_setpower(0, 6);      // 1mW Ausgangangsleistung, 120kHz Frequenzshift
85
  
86
  // Ergänzung zum debuggen
87
  rf12_trans(0x0000);      // Status auslesen
88
  itoa(rf12_trans(0x0000), str, 2); // Binär anzeigen
89
  uart_puts("Status nach init: 0b");      // Ausgabe auf UART
90
  uart_puts(str);
91
  uart_puts("\r\n");
92
  //Ende Ergänzung
93
}
94
95
void rf12_setbandwidth(unsigned char bandwidth, unsigned char gain, unsigned char drssi)
96
{
97
  rf12_trans(0x9400|((bandwidth&7)<<5)|((gain&3)<<3)|(drssi&7));
98
}
99
100
void rf12_setfreq(unsigned short freq)
101
{  if (freq<96)        // 430,2400MHz
102
    freq=96;
103
  else if (freq>3903)      // 439,7575MHz
104
    freq=3903;
105
  rf12_trans(0xA000|freq);
106
}
107
108
void rf12_setbaud(unsigned short baud)
109
{
110
  if (baud<663)
111
    return;
112
  if (baud<5400)          // Baudrate= 344827,58621/(R+1)/(1+CS*7)
113
    rf12_trans(0xC680|((43104/baud)-1));
114
  else
115
    rf12_trans(0xC600|((344828UL/baud)-1));
116
}
117
118
void rf12_setpower(unsigned char power, unsigned char mod)
119
{  
120
  rf12_trans(0x9800|(power&7)|((mod&15)<<4));
121
}
122
123
void rf12_ready(void)
124
{  cbi(CS_RF_PORT, CS);
125
  while (!(RF_PIN&(1<<SDO))); // wait until FIFO ready
126
}
127
128
void rf12_txdata(unsigned char *data, unsigned char number)
129
{  unsigned char i;
130
  rf12_trans(0x8238);      // TX on
131
  rf12_ready();
132
  rf12_trans(0xB8AA);
133
  rf12_ready();
134
  rf12_trans(0xB8AA);
135
  rf12_ready();
136
  rf12_trans(0xB8AA);
137
  rf12_ready();
138
  rf12_trans(0xB82D);
139
  rf12_ready();
140
  rf12_trans(0xB8D4);
141
  for (i=0; i<number; i++)
142
  {    rf12_ready();
143
    rf12_trans(0xB800|(*data++));
144
  }
145
  rf12_ready();
146
  rf12_trans(0x8208);      // TX off
147
}
148
149
void rf12_rxdata(unsigned char *data, unsigned char number)
150
{  unsigned char i;
151
  rf12_trans(0x82C8);      // RX on
152
  rf12_trans(0xCA81);      // set FIFO mode
153
  rf12_trans(0xCA83);      // enable FIFO
154
  for (i=0; i<number; i++)
155
  {  rf12_ready();
156
    *data++=rf12_trans(0xB000);
157
  }
158
  rf12_trans(0x8208);      // RX off
159
}

Die Initfunktion wird aus der Int Main aufgerufen:

[c]
//################## Datei PR-main.c, Version 1.0, Datum 30.08.08 
##################
/*

  Autor: Sönke Paschko

  Beschreibung:

         Diese Datei enthält die Mainfunktion

    Testprogramm für Funkmodul auf Pollinevaluationsboard


*/
//###################################################################### 
############

//###################                 Includes 
###################

   #include "head.h"      // generelle Headdatei mit Definitionen

//###################                 Funktionen 
###################

  int  main();        // Hauptprogramm


//###################                 Variablen 
###################

  char order[20];

  // Hauptprogramm
  int main(void){


  // USART initialisieren
    uart_init();

  // USART Ausgaben
  uart_puts("\x1B[2J \x1B[0;0f");   /* Bildschirm löschen und Cursor auf 
Position 1x1 um vorige
                       Programmausgaben zulöschen */

    // Ausgabe UART
  uart_puts("\a\r\n\r\n\r\n");
  uart_puts(" 
\x1B[41m*****************************\r\n\x1B[47m"); // \x1B[47m setzt 
den Hintergrund auf grau
  uart_puts("            \x1B[41m*** 
***\r\n\x1B[47m");
  uart_puts("            \x1B[41m***  "       PROG      " 
***\r\n\x1B[47m");
  uart_puts("            \x1B[41m*** 
***\r\n\x1B[47m");
  uart_puts(" 
\x1B[41m*****************************\r\n\r\n\x1B[47m");



  // Startbild abwarten (1 Sec)
  _delay_ms(2000);

    uart_puts("\r\nInitialisierung starten:\r\n");

    rf12_init();  // Funkmodul Initialisieren

    uart_puts("\r\nInitialisierung Funk   OK:\r\n");

    int i = 0;
  char str[1233];
  // Endlosschleife
    while(1){

  getorder(order);

    if(!strcmp(order, "funk")){
       //funk_Test();
       uart_puts("\r\nFunktest wird gestartet");
       _delay_ms(1000);
       uart_puts(".");
       _delay_ms(1000);
       uart_puts(".");
       _delay_ms(1000);
       uart_puts(".");
       _delay_ms(1000);
       uart_puts("Fertig\r\n");
    }

    sprintf(str, "%u\r", i);
    uart_puts(str);
    i++;
    _delay_ms(1000);

  }


  }

[\c]

Die gemeinsame Headerdatei:

[c]
//################## Datei main.h, Version 1.0, Datum 24.08.08 
##################
/*

  Autor: Sönke Paschko

  Beschreibung:

       Diese Datei enthält Deklarationen und dateiübergreifende 
Variablen.


  Anmerkung:

     In dieser Datei sind nur allgemein nutzbare Funtionen deklariert. 
Einzelne
     Treiberfunktionen, welche nicht öffentlich genutzt werden finden 
sich nur
     in den Treiberdateien.

*/
//###################################################################### 
############

//###################                 Includes 
###################

  #include <avr/interrupt.h>
  #include <avr/io.h>
  #include <avr/pgmspace.h>
  #include <stdint.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <util/delay.h>     // Für Delayfunktion



//###############  Definitionen 
##############################################

  // Allgemeine Defines

  #define PROG "Funktest RFM12 V0.1"

    // Defines UART
  #define BAUDRATE 1200





  // Funktionen USART
  void   uart_Transmit( unsigned char data );
  void   uart_init(void);
  uint8_t uart_getc(void);
  void   uart_gets( char* Buffer, uint8_t MaxLen );
  void   uart_puts(char *s);
  uint8_t uart_ask();











  // Funktionen Funk


extern unsigned short rf12_trans(unsigned short wert);          // 
transfer 1 word to/from module
extern void rf12_init(void);                      // initialize module
extern void rf12_setfreq(unsigned short freq);              // set 
center frequency
extern void rf12_setbaud(unsigned short baud);              // set 
baudrate
extern void rf12_setpower(unsigned char power, unsigned char mod);    // 
set transmission settings
extern void rf12_setbandwidth(unsigned char bandwidth, unsigned char 
gain, unsigned char drssi);  // set receiver settings
extern void rf12_txdata(unsigned char *data, unsigned char number); 
// transmit number of bytes from array
extern void rf12_rxdata(unsigned char *data, unsigned char number); 
// receive number of bytes into array
extern void rf12_ready(void);                      // wait until FIFO 
ready (to transmit/read data)

#define RF12FREQ(freq)  ((freq-430.0)/0.0025)              // macro for 
calculating frequency value out of frequency in MHz

#ifndef cbi
#define cbi(sfr, bit)     (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit)     (_SFR_BYTE(sfr) |= _BV(bit))
#endif

#define RF_PORT  PORTB
#define RF_DDR  DDRB
#define RF_PIN  PINB

// Ergänzt, da cs auf seperatem Port liegt.
#define CS_RF_PORT  PORTD
#define CS_RF_DDR  DDRD
#define CS_RF_PIN  PIND

#define SDI    3
#define SCK    5
#define CS    4
#define SDO    4


[\c]


Meine Ergänzungen / Änderungen habe ich durch Kommentare gekennzeichnet.

Danke schonmal für eure Hilfe.

von Andreas (Gast)


Lesenswert?

Der 1. und wichtigste Tip(p)
"Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang"

von Urs (Gast)


Lesenswert?

> Meine letzte Hoffnung: der tackt wird ja am Modul auf 10 Mhz gesetzt.
>der Atmega auf dem board läuft aber mit 12 Mhz, kann es da Probleme
> geben?

Nein, der Takt des AVRs kann schneller oder langsamer als der des RF 
Moduls sein.

Hast Du die nötigen Jumper auch gesetzt? Keine Lötbrücken?

> Ansonsten kennt ihr oder habt ihr vielleicht ein programm, welches
> einfach den Status des Moduls ausliest und ihn per UART rausschickt?

Kann ich am WE posten, falls es bis dahin kein anderer tut.

NB: Wenn ich mich richtig erinnere, gehört ein ATMega128 nicht ins 
Pollin-Board, nur Tiny2313, Mega8, Mega16/32.

von Sonke A. (soeni)


Lesenswert?

Danke erstmal, ja das Pollinboard fasst nur atmega8 usw. kein 128, ich 
nutze auch ein amtmega8, hatte es vorher nur mit einer anderen Platine 
versucht. inzwischen hab ich auch schon die Pinbelegung gecheckt, da 
gabs einen fehler in der Doku des Pollinboardes, CS liegt auf PortB 
nicht auf PortD, das hab ich entsprechend korigiert. Hardwaretechnische 
Sachen kann ich also ausschließen.

Sind solche Module ansich robust oder eher nicht? Ich meine vonwegen 
ESD, eventuellen Leckströmen usw.

von Sonke A. (soeni)


Lesenswert?

lese ich denn mit folgenden Befehlen den Status richtig aus?
1
  rf12_trans(0x0000);      // Status auslesen
2
  char str[10];
3
  itoa(rf12_trans(0x0000), str, 2); // Binär anzeigen
4
  uart_puts("Status vor init:  0b");      // Ausgabe auf UART
5
  uart_puts(str);
6
  uart_puts("\r\n");
7
  // Ende Ergänzung

Irgendwo hab ich gelesen, dass wenn man 0x0000 sendet als erstes der 
Status kommt und dann der Inhalt des FIFOs

von Sonke A. (soeni)


Lesenswert?

kann mir nochmal jemand helfen bitte?

von Jean P. (fubu1000)


Lesenswert?

Sönke Paschko wrote:
> lese ich denn mit folgenden Befehlen den Status richtig aus?
>
>
1
>   rf12_trans(0x0000);      // Status auslesen
2
>   char str[10];
3
>   itoa(rf12_trans(0x0000), str, 2); // Binär anzeigen
4
>   uart_puts("Status vor init:  0b");      // Ausgabe auf UART
5
>   uart_puts(str);
6
>   uart_puts("\r\n");
7
>   // Ende Ergänzung
8
>
>
> Irgendwo hab ich gelesen, dass wenn man 0x0000 sendet als erstes der
> Status kommt und dann der Inhalt des FIFOs


Datenblatt lesen könnte mal nit schaden. Ja mit 0x0000 liest du die 
Statusbits aus (kannst auch 0x0101 senden ist wurscht, Hauptsache Bit 15 
ist NULL). Das Statusbit RGIT sollte gesetzt sein, wenn du als TX in 
FIFO Mode initialisierst und ich glaube Bit FFEM, wenn als RX in FIFO 
Mode.

//Nach deinen Funktionen, soweit ich das beim überfliegen gesehen habe:
1
unsigned int status = rf12_trans(0x0000);
2
unsigned char UartData = (unsigned char) status >> 8;
3
uart_Transmit(UartData);
4
UartData = (unsigned char) status;
5
uart_Transmit(UartData);

Gruß

von Jean P. (fubu1000)


Lesenswert?

Und was soll das ???

int  main();        // Hauptprogramm

von Sonke A. (soeni)


Lesenswert?

Danke ich werde das mal ausprobieren.

Ich schreibe mir der Übersichthalber alle Funktionen einer Datei an den 
Anfang, so kann man schnell sehen, welche Funktionen in welcher Datei 
liegen. (Deswegen das in main())

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.