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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von DAVID B. (bastler-david)


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


Bewertung
2 lesenswert
nicht 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. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
1 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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)


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


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

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]
  • [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.