Forum: Compiler & IDEs Endlosschleife?


von Robert K. (mr_insanity)


Angehängte Dateien:

Lesenswert?

Moin,

ich habe angefangen mit diesen RFM Modulen zu spielen. Wollte es erstmal 
mit einem kleinen Testprogramm mit dem RFM02 versuchen. Allerdings 
funktioniert es nicht und ich habe keinen Plan warum.

Hier erstmal der Code von meinem Testprogramm:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
#include <avr/eeprom.h>
5
#include <stdlib.h>
6
#include <util/delay.h>
7
#include "global.h"
8
#include "rf02.h"
9
10
#define Taster_PORT PORTB
11
#define Taster_DDR   DDRB
12
#define Taster_PIN   PINB
13
#define Taster 1
14
15
#define LED_PORT  PORTD
16
#define LED_DDR   DDRD
17
#define LED_PIN   PIND
18
#define LED 5
19
20
21
unsigned char test[2]="01";
22
23
int main(void)
24
{
25
  Taster_DDR &= ~(1<<Taster);
26
  LED_DDR |= (1<<LED);
27
  
28
  rf02_init();          // ein paar Register setzen (z.B. CLK auf 10MHz)
29
  rf02_setfreq(RF02FREQ(433.92));  // Sende/Empfangsfrequenz auf 433,92MHz einstellen
30
  rf02_setpower(0);        // -0dBm Ausgangangsleistung
31
  rf02_setmodfreq(3);        // 120kHz Frequenzshift
32
  rf02_setbaud(19200);      // 19200 Baud
33
  
34
  
35
  while(1)
36
  {
37
    if (Taster_PIN & (1<<Taster))
38
    {
39
      rf02_txdata(test,2);
40
      LED_PORT |= (1<<LED);      
41
      _delay_ms(1000);
42
      LED_PORT &= ~(1<<LED);
43
    }
44
  }
45
}

Ich konnte das Problem immerhin einigermaßen eingrenzen. Es liegt auf 
jeden Fall an der Funktion rf02_txdata. In dieser bleibt das Programm 
immer hängen. Wenn ich sie auskommentiere läuft das Programm problemlos 
und wenn ich sie nach dem Ausschalten der LED einfüge, kann man die LED 
einmal aufleuchten lassen und danach hängt das Programm wieder.

Hier der Code der rf02_txdata:
1
void rf02_txdata(unsigned char *data, unsigned char number)
2
{  unsigned char i,wert;
3
  wert=0xC6;
4
  cbi(CS_PORT, CS);
5
  for (i=0; i<8; i++)
6
  {  
7
    if (wert&128)
8
    {
9
      sbi(SDI_PORT, SDI);
10
    }
11
    else
12
    {
13
      cbi(SDI_PORT, SDI);
14
      sbi(SCK_PORT, SCK);
15
      wert<<=1;
16
      _delay_us(0.2);
17
      cbi(SCK_PORT, SCK);
18
    }
19
  }
20
    rf02_shiftout(0xAA);
21
    rf02_shiftout(0xAA);
22
    rf02_shiftout(0xAA);
23
    rf02_shiftout(0x2D);
24
    rf02_shiftout(0xD4);
25
  for (i=0; i<number; i++)
26
  {
27
    rf02_shiftout(*data++);
28
  }
29
  sbi(CS_PORT, CS);
30
  while(IRQ_PIN&(1<<IRQ));    // wait until transfer done
31
  rf02_trans(0xC464);      // TX off after 10us
32
}

Den Code der gesammten RF02-Library habe ich mal in den Anhang gepackt.

Vielen Dank schonmal für jede Hilfe!

von Stefan E. (sternst)


Lesenswert?

1
#define CS_PORT    PORTD
2
#define CS_DDR    DDRD
3
#define CS_PIN    PIND
4
5
#define IRQ_PORT  PORTD
6
#define IRQ_DDR    DDRD
7
#define IRQ_PIN    PIND
8
9
#define CS    2  // nSEL, -> RF02
10
#define IRQ    2  // nIRQ, <- RF02

Wenn CS und IRQ auf dem selben Pin des selben Ports liegen, ...

1
CS_DDR |= (1<<CS);

... und dieser Pin als Ausgang konfiguriert wird, ...

1
  sbi(CS_PORT, CS);
2
  while(IRQ_PIN&(1<<IRQ));    // wait until transfer done

... wie soll dann hier die Schleife jemals enden?

von Robert K. (mr_insanity)


Lesenswert?

Ok, das ist natürlich einzusehen. Kann man mal weider sehen, was nur ein 
falscher Buchstabe ausmachen kann. Ich benutze übrigens das Board von 
Pollin für die RFMs, dort ist in der Portliste der NSEL am Mega8 auf 
PD2, im Schaltplan aber auf PB2. Ich denke mal in der Liste wirds falsch 
sein.
Funktionieren tut es aber trotzdem noch nicht.

von Robert K. (mr_insanity)


Lesenswert?

Hat vielleicht noch jemand einen Tip. Ich habe nämlich keinen Plan warum 
das nicht läuft.

von (prx) A. K. (prx)


Lesenswert?

Das kann so nicht funktionieren:
1
for (i=0; i<8; i++)
2
  {  
3
    if (wert&128)
4
    {
5
      sbi(SDI_PORT, SDI);
6
    }
7
    else
8
    {
9
      cbi(SDI_PORT, SDI);
10
      sbi(SCK_PORT, SCK);
11
      wert<<=1;
12
      _delay_us(0.2);
13
      cbi(SCK_PORT, SCK);
14
    }
15
  }
denn der ganze Schleifenschwanz steckt nur im "else"-Zweig. Dürfte eher 
so gemeint sein:
1
for (i=0; i<8; i++)
2
  {  
3
    if (wert&128)
4
    {
5
      sbi(SDI_PORT, SDI);
6
    }
7
    else
8
    {
9
      cbi(SDI_PORT, SDI);
10
    }
11
    sbi(SCK_PORT, SCK);
12
    wert<<=1;
13
    _delay_us(0.2);
14
    cbi(SCK_PORT, SCK);
15
  }

von Jens K. (studone)


Lesenswert?

Ja geb dem letzten Beitrag voll recht, hab es damals auch ändern müssen.

Zusätzlich hab ich in einem anderen Tip, schaut mal in diesen post zu 
diesem Problem. Siehe hier..

Beitrag "Problem mit RFM02"

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.