Forum: Mikrocontroller und Digitale Elektronik Attiny 167(Digispark Pro) USB Verbindung unterbricht nach Programmupload


von Markus W. (maxpower26)


Angehängte Dateien:

Lesenswert?

Hallo liebes Forum,

Wir haben ein Program auf der Arduino IDE geschrieben. Das Programm 
läuft auf den Arduino UNO wunderbar nur wenn wir von Digispark den 
Attiny 167 benutzen, verbindet sich der Attiny mit den Computer per USB 
und bricht nach wenigen Sekunden die Verbindung wieder ab. Das Program 
wird auch nicht ausgeführt. Durch löschen von bestimmten Programmteilen 
zb das 2DArray, lässt sich der Attiny richtig bespielen und er führt den 
restlichen Code auch aus. Vermutlich ist der Arbeitsspeicher voll von 
unseren Arrays, kann das sein?

Jetzt unsere Frage :) gibt es eine Möglichkeit unser Program zu 
verkleiner bzw einen anderen weg den Attiny 167 noch zu verwenden.

Oder sollen wir auf einen anderen Mikrocontroller umsteigen? Wir würden 
aber einen benötigen den man mittels Arduino IDE und USB Kabel bespielen 
kann.

Vielen Dank schon für eure Hilfe,

von doedel (Gast)


Lesenswert?

ich habe den Code gerade mal kompiliert und bekomme als Ausgabe:

Der Sketch verwendet 9.310 Bytes (62%) des Programmspeicherplatzes. Das 
Maximum sind 14.844 Bytes.
Globale Variablen verwenden 721 Bytes des dynamischen Speichers.

Das sollte eigentlich problemlos gehen. Die Code-Größe sollte also 
eigentlich nicht das Problem sein.

von doedel (Gast)


Lesenswert?

Anmerkungen zum Code:

a) Du solltest Delay() vermeiden. Das blockiert den Prozessor
b) Du solltest den Code in einzelne Funktionen zergliedern ... 
Spagetti-Code ist immer schwerer zu warten / fehleranfälliger (zumindest 
vermute ich mal, dass das alles in Loop passiert ... ist anhand der 
fehlenden Einrückungen schwer zu lesen).
c) Du initialisierst das Array Schalttabelle und viele andere Variablen 
in jedem Loop-Durchlauf neu. Pack das alles in Setup. In Loop sollte 
eigentlich gar keine Variable definiert werden.

wenn der Code vernüftig formatiert ist, fallen mir sicher noch ein paar 
andere Sachen auf ;)

von Markus W. (maxpower26)


Lesenswert?

Das ist ja der Punkt der uns verwirrt XD

wenn der Programteil, ab ,,schalten,,, das ist der untere Teil 
auskommentiert wird. Läuft das Program. Ansonsten verbindet er sich und 
trennt anschließend die USB verbindung.

von doedel (Gast)


Lesenswert?

wie gesagt: erstmal Code besser strukturieren durch auslagern von 
Teilfunktionalitäten in Funktionen. Dann auf alle Fälle das Array global 
definieren und in Setup einmalig initalisieren. Tut mir Leid: insgesamt 
ist der Code einfach schlecht geschrieben. Das er nicht läuft scheint 
mir weniger am Attiny zu liegen ;-)

von Markus W. (maxpower26)


Lesenswert?

Danke Doedel!!!


Es lag am Code, wir sind auch nicht gerade die Profis in Programieren.
Attiny lässt sich bespielen, ein Traum. Werde ich gleich mal testen.

Ich geb alles aus den Loop raus, was etwas deklariert, also auch die 
Schalttabelle(Array).

Programm werden wir ein bisschen schöner schreiben :)
und sollte es nicht gehn kann ich ja noch einen Auszug schicken.



Cool, der Kas is bissn :)

von doedel (Gast)


Lesenswert?

ja mai ... gfreit mi wens gäht!

Ansunstn schickst den Schmarrn heud umi, dann schau i'n mia numei oh.

von Markus W. (maxpower26)


Angehängte Dateien:

Lesenswert?

Ok, ganz is der Kas doch ned bissn.


Es ist möglich jetzt den Attiny zu bespielen, nur macht das Program 
jetzt nicht mehr das was wir wollen XD.

Ich hab grob das Program abgeändert, die variablen alle Global 
deklariert doch jetzt gibt er den Analogen Messwert (Volt) nicht mehr 
richtig aus.

Wie kann/soll ich die variablen richtig deklarieren, um speicher zu 
sparen.
Ich glaub eh dass das 2DArray am meisten braucht und wenn das richtig 
deklariert ist sollte es auch funktionieren....

Program für Attiny im Anhang :)

von doedel (Gast)


Lesenswert?

warum verwendet Ihr für Pin1 bis Pin5 Variablen? Schaut Euch hierfür mal 
die #define Anweisung an.

Dann ist das immer noch Spagetti-Code. Ich würde Euch nochmal dringend 
empfehlen, das in einzelne Funktionen aufzuteilen, die man unabhängig 
voneinander auch testen kann. Das macht den Code wesentlich 
übersichtlicher und leichter wartbar. Dann kann man auch bedeutend 
besser entscheiden, welche Variablen in einer Funktion Sinn machen und 
welche, die global sein sollten.

Also macht eine eigene Funktion für das Einlesen des ADC, eine für das 
Bilden des Mittelwertes, eine eigene für das Schalten usw.

Die Delay() sind immer noch schlecht und sollten raus. Arbeitet Euch in 
die Grundlagen von Zustandsautomaten ein.

Warum zwei Schleifen zum Einlesen? Ihr berechnet praktisch den 
Mittelwert eines Mittelwertes. Was ist denn der tiefere Sinn dahinter?

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.