Forum: Mikrocontroller und Digitale Elektronik attiny13a schlafen oder warten lassen.


von DAVID B. (bastler-david)


Lesenswert?

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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);

von Thomas E. (thomase)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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))

von DAVID B. (bastler-david)


Lesenswert?

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 ?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

DAVID -. schrieb:
> Der Sketch verwendet 858 Bytes (83%) des Programmspeicherplatzes.

Kannste mal sehen. Wenn du jetzt noch die Floats los wirst und den ADC 
selber bedienst, kannste noch 3 solche Programme in den Tiny flashen :-P
https://www.mikrocontroller.net/articles/Festkommaarithmetik

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.