INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Stromsparender Microkontroller für Akkubetrieb
25.11.2020, 19:04
Beitrag #41
RE: Stromsparender Microkontroller für Akkubetrieb
(20.11.2020 20:10)GuaAck schrieb:  
Zitat:Erstmal danke für die Antwort, allerdings kann ich noch nicht viel mit Registern usw. anfangen habe mich dazu noch zu wenig damit auseinandergesetzt, deswegen meine Frage bevor ich weiter versuche den Grund des resetts zu finden.
Würde so ein Resett auf Dauer den elektronischen Kompinenten schaden?

Eine Schädigung oder vorzeitige Alterung kann ich mir nicht vorstellen.

Aber wenn so etwas unkontrolliert passiert, dann kann ja auch was anderes in Deiner Schaltung unkontrolliert passieren. Ich würde den Fehler lieber jetzt suchen, wo die ja klare Bedingungen für das Fehlverhalten hast. Nimm doch mal möglichst viel Peripherie weg und siehe, was passiert.

Gruß
GuaAck
werden ich noch ausprobieren, Gerade hänge ich doch noch an einem Problem...wo ich schon dachte fertig zu sein.

Ich habe beim Master einen Interrupt für den Sleep Modus, damit ich ihn doch mit Akku betreiben kann, das Problem ist, dass dieser sich immer wieder von selbst in den sleepmodus versetzt.
Genauer gesagt erst wenn einer der Taster gedrückt wurde
Code:
#include "nRF24L01.h" //NRF24L01 library created by TMRh20 https://github.com/TMRh20/RF24
#include "RF24.h"
#include "SPI.h"
#include <avr/sleep.h>
#include <avr/power.h>

int SentMessage[1] = {0}; // Used to store value before being sent through the NRF24L01

RF24 radio(8, 9); // NRF24L01 used SPI pins + Pin 9 and 10 on the NANO

const uint64_t pipe = 0xE6E6E6E6E6E6; // Needs to be the same for communicating between 2 NRF24L01

const int but_1 = 7;
const int but_2 = 6;
const int but_3 = 5;                                      //Knöpfe Pins
const int but_4 = 4;
const int but_5 = 3;
const int wakePin = 2;

const int buzzer = A0;
const int led_red = A1;
const int led_blue = A2;
const int led_green = A3;

int pressed;
int allpressed[4];                                 //Warteschlange für während der Sendezeit gedrückt wurden
int start_time;

const int sendingtime = 140;                       //anzahl der Wiederholung der Sendeschleife (Überbrückung der sleep phasen
const int on_time = 10000;                          // des Recivers

void setup(void) {
  Serial.begin(115200);
  Serial.println("start");

  pinMode(but_1, INPUT_PULLUP);
  digitalWrite(but_1, HIGH);
  pinMode(but_2, INPUT_PULLUP);
  digitalWrite(but_2, HIGH);
  pinMode(but_3, INPUT_PULLUP);
  digitalWrite(but_3, HIGH);
  pinMode(but_4, INPUT_PULLUP);
  digitalWrite(but_4, HIGH);
  pinMode(but_5, INPUT_PULLUP);
  digitalWrite(but_5, HIGH);

  pinMode(wakePin, INPUT_PULLUP);
// digitalWrite(wakePin, HIGH);
  
  pinMode(led_green, OUTPUT);
  pinMode(led_blue, OUTPUT);
  pinMode(led_red, OUTPUT);
  pinMode(buzzer, OUTPUT);


  radio.begin(); // Start the NRF24L01
  radio.openWritingPipe(pipe); // Get NRF24L01 ready to transmit
  //Serial.println("start");
  
  attachInterrupt(0, wakeUpNow, LOW); // use interrupt 0 (pin 2) and run function wakeUpNow when pin 2 gets LOW  
}

void loop(void) {
  if(start_time == 0){
    //radio.powerUp();
    start_time = millis();
    Serial.println("on");
    delay(50);
  }
  if ((millis() - start_time) <= on_time) {
    pressed = readbutton();
    if (pressed != 0)                     //wenn knopf gedrückt wird jeweiliger wert gesendet
    {
      sendbutton(pressed);
    }
    delay(200);
  }
  else {
    start_time = 0;
    Serial.println("sleep");
    //radio.powerDown();
    delay(200);
    sleepNow();
  }
}

void sendbutton(int pressed) {                          //wird bei Button Input ausgeführt
  start_time = 0;
  Serial.println(pressed);
  SentMessage[0] = pressed;
  for (int i = 0; i < sendingtime; i++) {               //sendet sendingtime mal das/die Modul an dessen Knopf gedrückt wurde
    radio.write(SentMessage, 1);
    Serial.println(SentMessage[0]);
    delay(20);                                          //sendet über 2,4 Ghz Modul    
  }
}
int readbutton() {                              //auf gedrückten knopf überprüfen
  int pushed;
  if (!digitalRead(but_1)) {
    pushed = 1;
  }
  else if (!digitalRead(but_2)) {
    pushed = 2;
  }
  else if (!digitalRead(but_3)) {
    pushed = 3;
  }
  else if (!digitalRead(but_4)) {
    pushed = 4;
  }
  else if (!digitalRead(but_5)) {
    pushed = 5;
  }
  else {
    pushed = 0;
  }
  return pushed;
}

void wakeUpNow() {
        
}  

void sleepNow() {  
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);   // sleep mode is set here  
    sleep_enable();          // enables the sleep bit in the mcucr register  
    attachInterrupt(0,wakeUpNow, LOW); // use interrupt 0 (pin 2) and run function  
    sleep_mode();            // here the device is actually put to sleep!!  
    sleep_disable();         // first thing after waking from sleep: disable sleep...
    detachInterrupt(0);      // disables interrupt 0 on pin 2 so the wakeUpNow code will not be executed during normal running time.  
}


Die Serielle Ausgabe habe ich in den Anhang gepackt

Ich bin hier schon seit stunden am verzweifeln und das Internet bringt auch keine Lösung

LG louard
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.11.2020, 21:32
Beitrag #42
RE: Stromsparender Microkontroller für Akkubetrieb
Ich habe den Fehler bereits selber gefunden, er lag nicht wie vermutet in dem Interrupt sondern im Datentyp von start_time : hier muss Long statt int verwendet werden, da millis() sonst zu groß wird

LG louard
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.11.2020, 21:36
Beitrag #43
RE: Stromsparender Microkontroller für Akkubetrieb
Wenn es auf millis zurück geht, ist long auch noch falsch. Richtig wäre unsigned long.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.11.2020, 21:47
Beitrag #44
RE: Stromsparender Microkontroller für Akkubetrieb
Vielen dank für die Korrektur, das wäre mir wohl erst in einer Woche aufgefallen...

LG louard
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Akkubetrieb und USB kommunikation gleichzeitig kartoffelsuppe 1 2.940 11.06.2015 21:52
Letzter Beitrag: Thorsten Pferdekämper
  Stromsparender Mikrocontroller Xtremefly 1 2.446 12.03.2015 10:41
Letzter Beitrag: Xtremefly

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste