www.mikrocontroller.net

Forum: Compiler & IDEs Endlosschleife?


Autor: Robert Knipp (mr_insanity)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <stdlib.h>
#include <util/delay.h>
#include "global.h"
#include "rf02.h"

#define Taster_PORT PORTB
#define Taster_DDR   DDRB
#define Taster_PIN   PINB
#define Taster 1

#define LED_PORT  PORTD
#define LED_DDR   DDRD
#define LED_PIN   PIND
#define LED 5


unsigned char test[2]="01";

int main(void)
{
  Taster_DDR &= ~(1<<Taster);
  LED_DDR |= (1<<LED);
  
  rf02_init();          // ein paar Register setzen (z.B. CLK auf 10MHz)
  rf02_setfreq(RF02FREQ(433.92));  // Sende/Empfangsfrequenz auf 433,92MHz einstellen
  rf02_setpower(0);        // -0dBm Ausgangangsleistung
  rf02_setmodfreq(3);        // 120kHz Frequenzshift
  rf02_setbaud(19200);      // 19200 Baud
  
  
  while(1)
  {
    if (Taster_PIN & (1<<Taster))
    {
      rf02_txdata(test,2);
      LED_PORT |= (1<<LED);      
      _delay_ms(1000);
      LED_PORT &= ~(1<<LED);
    }
  }
}

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:
void rf02_txdata(unsigned char *data, unsigned char number)
{  unsigned char i,wert;
  wert=0xC6;
  cbi(CS_PORT, CS);
  for (i=0; i<8; i++)
  {  
    if (wert&128)
    {
      sbi(SDI_PORT, SDI);
    }
    else
    {
      cbi(SDI_PORT, SDI);
      sbi(SCK_PORT, SCK);
      wert<<=1;
      _delay_us(0.2);
      cbi(SCK_PORT, SCK);
    }
  }
    rf02_shiftout(0xAA);
    rf02_shiftout(0xAA);
    rf02_shiftout(0xAA);
    rf02_shiftout(0x2D);
    rf02_shiftout(0xD4);
  for (i=0; i<number; i++)
  {
    rf02_shiftout(*data++);
  }
  sbi(CS_PORT, CS);
  while(IRQ_PIN&(1<<IRQ));    // wait until transfer done
  rf02_trans(0xC464);      // TX off after 10us
}

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

Vielen Dank schonmal für jede Hilfe!

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define CS_PORT    PORTD
#define CS_DDR    DDRD
#define CS_PIN    PIND

#define IRQ_PORT  PORTD
#define IRQ_DDR    DDRD
#define IRQ_PIN    PIND

#define CS    2  // nSEL, -> RF02
#define IRQ    2  // nIRQ, <- RF02

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

CS_DDR |= (1<<CS);

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

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

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

Autor: Robert Knipp (mr_insanity)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Robert Knipp (mr_insanity)
Datum:

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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das kann so nicht funktionieren:
for (i=0; i<8; i++)
  {  
    if (wert&128)
    {
      sbi(SDI_PORT, SDI);
    }
    else
    {
      cbi(SDI_PORT, SDI);
      sbi(SCK_PORT, SCK);
      wert<<=1;
      _delay_us(0.2);
      cbi(SCK_PORT, SCK);
    }
  }
denn der ganze Schleifenschwanz steckt nur im "else"-Zweig. Dürfte eher 
so gemeint sein:
for (i=0; i<8; i++)
  {  
    if (wert&128)
    {
      sbi(SDI_PORT, SDI);
    }
    else
    {
      cbi(SDI_PORT, SDI);
    }
    sbi(SCK_PORT, SCK);
    wert<<=1;
    _delay_us(0.2);
    cbi(SCK_PORT, SCK);
  }

Autor: Jens Kleemann (studone)
Datum:

Bewertung
0 lesenswert
nicht 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"

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.