Forum: Mikrocontroller und Digitale Elektronik Attiny84a-PU "void Setup" läuft als Schleife durch


von Wingthor (Gast)


Lesenswert?

Hallo
ich habe folgendes Problem:
Ich will einen Funksensor mittels einem RaspberryPi auslesen.
Das Programm, welches ich auf den Empfänger aufspiele, Funktioniert 
nicht richtig. der Programmteil "void Setup" läuft als Schleife durch, 
normalerweise sollte dieser Teil doch nur einmal durlaufen werden, oder?
Wenn ich den Programminhalt aus "void Loop" auskommentiere und durch 
eine einfache, zyklische UART-Ausgabe (mySerial.println("TEST");) 
ersetze, wird das Setup nur einmal durchlaufen und die Loop arbeitet, 
wie sie soll.
Sobald das Hauptprogramm wieder aktiviert wird, läuft das Setup wieder 
als Schleife. Habe zum Testen eine UART-Ausgabe ins Setup eingebaut.
Hier mein Programm:




#include <RFM12B.h>
#include <avr/sleep.h>
#include <SoftwareSerial.h>

#define NODEID            22  //network ID used for this unit
#define NETWORKID        210  //the network ID we are on
#define ACK_TIME        2000  // # of ms to wait for an ack
#define SERIAL_BAUD     9600

#define rxPin 7
#define txPin 3
#define LEDpin 8

/*
                     +-\/-+
               VCC  1|    |14  GND
          (D0) PB0  2|    |13  AREF (D10)
          (D1) PB1  3|    |12  PA1 (D9)
             RESET  4|    |11  PA2 (D8)
INT0  PWM (D2) PB2  5|    |10  PA3 (D7)
      PWM (D3) PA7  6|    |9   PA4 (D6)
      PWM (D4) PA6  7|    |8   PA5 (D5) PWM
                     +----+
*/

// Initialise UART
SoftwareSerial mySerial(rxPin, txPin);

// Need an instance of the Radio Module
RFM12B radio;


static void activityLED (byte mode) {
  pinMode(LEDpin, OUTPUT);
  digitalWrite(LEDpin, mode);
}



// blink led
static void blink (byte pin, byte n = 3) {
  pinMode(pin, OUTPUT);
  for (byte i = 0; i < 2 * n; ++i) {
    delay(100);
    digitalWrite(pin, !digitalRead(pin));
  }
}



// init Setup
void setup() {

  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  mySerial.begin(SERIAL_BAUD);
  mySerial.println("SETUP");        //Ausgabe auf UART beim Starten
  radio.Initialize(NODEID, RF12_868MHZ, NETWORKID);
  #ifdef KEY
    radio.Encrypt((byte*)KEY);      //comment this out to disable 
encryption
  #endif
  if (LEDpin) {
    activityLED(1); // LED on
    delay(1000);
    activityLED(0); // LED off
  }
}



// Loop
void loop() {
  if (radio.ReceiveComplete()) {
    if (radio.CRCPass()) {
      //node ID of TX, extracted from RF datapacket. Not transmitted as 
part of structure
      mySerial.print(radio.GetSender(), DEC);
      mySerial.print(" ");
      int i;
      for (byte i = 0; i < *radio.DataLen; i++) //can also use 
radio.GetDataLen() if you don't like pointers
        mySerial.print((char) radio.Data[i]);

      if (LEDpin) {
        blink(LEDpin, 2);
      }
      if (radio.ACKRequested()) {
        radio.SendACK();
     }
    } else {
      mySerial.print("BAD-CRC");
      if (LEDpin) {
        activityLED(1); // LED on
        delay(1000);
        activityLED(0); // LED off
      }
    }
    mySerial.println();
}

mySerial.println("TEST");    //UART-Ausgabe zum Prüfen der Loop

}


Danke schonmal
Viele Grüße, Daniel

von Bastian W. (jackfrost)


Lesenswert?

Bau an verschiedene Stellen serielle Ausgaben ein die alle anders sind. 
Ggf gibt es an einer Stelle einen reset.

Gruß JackFrost

von Brummbär (Gast)


Lesenswert?

Wenn Setup scheinbar in einer Schleife immer wieder aufgerufen wird, 
erfolgt kurz davor immer ein Reset. Entweder Watchdog oder in die Irre 
geleiteter Interrupt.

von Wingthor (Gast)


Lesenswert?

Bastian W. schrieb:
> Bau an verschiedene Stellen serielle Ausgaben ein die alle anders
> sind.
> Ggf gibt es an einer Stelle einen reset.
>
> Gruß JackFrost

Danke für die schnellen Antworten,
hab den Fehler eingegränzt: sobald der erste Befehl der Loop, also

if (radio.ReceiveComplete()) {
}

aufgerufen wird, scheint der Controller zu Resetten. Ich habe den Inhalt 
der IF-Anweisung auskommentiert, es steht also nur noch dieser Befehl 
und eine serielle Ausgabe am Ende des Programms in der Loop. Letztere 
wird erwatrungsgemäß nicht ausgegeben.
Kann das an einer defekten Bibliothek für den RFM12b Funksender liegen? 
Ich habe diese zwar schon erfolglos neu aufgespielt, aber dann suche ich 
mir die Bibliothek aus anderen Quellen.

Gruß Daniel

von Peter D. (peda)


Lesenswert?

Wingthor schrieb:
> Kann das an einer defekten Bibliothek für den RFM12b Funksender liegen?

Schau einfach mal in die Doku zu der Lib. Vielleicht muß man sie noch an 
den ATtiny84 anpasssen.
Das Arduino-Zeugs ist doch oft für den ATmega328 geschrieben.

von Wingthor (Gast)


Lesenswert?

Peter D. schrieb:
> Wingthor schrieb:
>> Kann das an einer defekten Bibliothek für den RFM12b Funksender liegen?
>
> Schau einfach mal in die Doku zu der Lib. Vielleicht muß man sie noch an
> den ATtiny84 anpasssen.
> Das Arduino-Zeugs ist doch oft für den ATmega328 geschrieben.

Hab ich schon überprüft, das ist schon eine angepasste Bibliothek. Ich 
hab nochmal nachgeschaut, bei anderen Leuten, die mit der Bibliothek 
gearbeitet haben, gab es diese Probleme scheinbar nicht.

von Chris D. (m8nix)


Lesenswert?

hm..... klingt als würde in loop() irgend eine Funktion einen 
Kurzschluss verursachen, der den Prozessor resettet ???

von Stephan (Gast)


Lesenswert?

die läuft eigentlich einwandfrei.Es gibt aber mehrere Quellen davon.
Ist ja eigentlich alles von Nathan. Kann Dir meines gern mal schicken.

von Stephan (Gast)


Lesenswert?

Wingthor schrieb:
> obald das Hauptprogramm wieder aktiviert wird, läuft das Setup wieder
> als Schleife. Habe zum Testen eine UART-Ausgabe ins Setup eingebaut.

> Hier mein Programm:

Du solltest nicht Dein nennen, was nicht DEIN ist !

https://raspberry.tips/wp-content/uploads/2014/11/Receiver_PI.ino

von Wingthor (Gast)


Lesenswert?

Das wäre super, Stephan!

von Wingthor (Gast)


Lesenswert?

P.S.
Weißt du noch, wo du die Bibliotheken für das oben verlinkte Projekt her 
hast? Genau mit diesem Quellcode entsteht bei mir der Fehler...

von Wingthor (Gast)


Lesenswert?

So, läuft jetzt alles, wie es soll.
Der Fehler lag scheinbar im Boardmanager für Die ATtiny-Controller.
Ich habe diesen Manager:
http://drazzy.com/package_drazzy.com_index.json
installiert, jetzt funktionieren Sender und Empfänger!

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.