attiny13a schlafen oder warten lassen.

OP #4818304
Hallo
Ich habe mir ein kleinen Akku Wächter mit dem attiny13a gebaut/gelötet 
was sogar geht (Schulterklopf).
Nur bei einer sache brauche ich noch Hilfe, wenn die Spannung den wert 
von 2 volt unterschrieten hat soll der die last trennen, macht er auch.

Nur wäre es mir lieb wenn er dann den mosfet nicht mehr einschaltet oder 
erst nach 30/60 Minuten ein neuen versuch macht.
Ich habe es zuerst so lösen wollen:

void setup() {
pinMode(PB0, OUTPUT); (last+LED zur anzeige)
pinMode(PB2, OUTPUT); (led die anzeigt wenn Akku leer)
 }
void loop() {
int sensorValue = analogRead(PB3);
float voltage = sensorValue * (4.9 / 1023.0);
if (voltage > 2.0)
{
digitalWrite(PB0,HIGH);
} else {
digitalWrite(PB0,LOW);
digitalWrite(PB2,HIGH);
delay(3600000);
}
delay(10000);
}

Aber nach cr 2-3 Minuten hängt er sich auf und schaltet alle Ausgänge 
auf HIGH um also auch die Last wieder ein ????

Wie kann ich das umgehen ?
hin zukommt noch:

Der Sketch verwendet 1.020 Bytes (99%) des Programmspeicherplatzes. Das 
Maximum sind 1.024 Bytes.
Globale Variablen verwenden 4 Bytes (6%) des dynamischen Speichers, 60 
Bytes für lokale Variablen verbleiben. Das Maximum sind 64 Bytes.

Habe also nur noch wenige Möglichkeiten was den platz angeht.
Jemand eine Idee ?
DANKE
(Firma: matzetronics) #4818313
DAVID -. schrieb:
> Jemand eine Idee ?

Wie willst du mit nur noch 4 Bytes irgendwas reissen? Du musst also den 
Code so umschreiben, das du Luft hast. Das geht in C oder auch in 
Assembler, aber nicht mit den Arduino Libraries. Wenigstens das PinMode 
und DigitalOut Zeugs ist ja auch wirklich easy auf C umzunageln.

DAVID -. schrieb:
> pinMode(PB0, OUTPUT); (last+LED zur anzeige)
> pinMode(PB2, OUTPUT); (led die anzeigt wenn Akku leer)

Wird zu
1
DDRB = (1 << PB0) | (1 <<PB2);
Und

DAVID -. schrieb:
> digitalWrite(PB0,HIGH);

wird zu
1
PORTB |= (1 << PB0);
Willst du wieder auf low, dann
1
PORTB &= ~(1 << PB0);
#4818343
DAVID -. schrieb:
> Habe also nur noch wenige Möglichkeiten was den platz angeht.
> Jemand eine Idee ?


> float voltage = sensorValue * (4.9 / 1023.0);
> if (voltage > 2.0)

Floating Point ist auf einem so kleinen Kontrölerchen grundsätzlich 
keine gute Idee. In diesem Fall sogar eine ganz schlechte.
Das rechnest du gar nicht, sondern benutzt den ADC-Wert direkt. Denn mit 
deiner Rechnung machst du nichts anderes, als den Wert mit viel Aufwand 
ein wenig aufzuhübschen. Viel Aufwand für nichts.
#4818372
DAVID -. schrieb:
> void loop() {
> int sensorValue = analogRead(PB3);
> float voltage = sensorValue * (4.9 / 1023.0);
> if (voltage > 2.0)

Da kann man alle Rechnungen als Konstante herausziehen und den Compiler 
machen lassen.
Übrig bleibt nur der Vergleich:
1
#define VOLT2ADC(volt) (uint16_t)(volt * 1023.0 / 4.9)
2
void loop() {
3
  if( analogRead(PB3) > VOLT2ADC(2.0))
OP #4818589
das sieht schon mal gut aus!

void setup() {
DDRB = (1 << PB0) | (1 <<PB2);
 }
void loop() {
int sensorValue = analogRead(PB3);
float voltage = sensorValue * (4.9 / 1023.0);
if (voltage > 2.0)
{
PORTB |= (1 << PB0);
} else {
PORTB &= ~(1 << PB0);
PORTB |= (1 << PB2);
delay(3600000);
}
delay(10000);
}

Der Sketch verwendet 858 Bytes (83%) des Programmspeicherplatzes. Das 
Maximum sind 1.024 Bytes.
Globale Variablen verwenden 4 Bytes (6%) des dynamischen Speichers, 60 
Bytes für lokale Variablen verbleiben. Das Maximum sind 64 Bytes.

Testen obs auch geht kommt später bekomme aber immer hin schon mal keine 
Fehler.

Muss ich mir noch überlegen wie ich eine warte oder abschalt zeit hin 
bekomme wenn Spannung runter geht.
habe gelesen das es bei delay Zeiten über 2 Minuten immer wieder zu 
Fehlern kommt stimmt das ?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.