Forum: Mikrocontroller und Digitale Elektronik 328p-pu problem


von Mirco J. (mircoha60)


Lesenswert?

Guten Tag,
Ich kenne mich kaum aus. Und zwar habe ich seit Freitag erstmalig ein 
arduino uno. Vorher kaum programmiert.

Ich habe am Wochenende bereits viele erfolgreiche kleine Schaltungen und 
Programme getestet.

Ich habe zum schluss 2 pwm Ausgänge mit je einer led und je einem 220 
Ohm Wiederstand mit analogWrite von 0-255 zählen lassen.

Alles hat funktioniert. Leider war ich nicht zufrieden mit dem ersten 
Schritt, da dieser mir schon zu hell war. Die ersten 10 schritte sind 
für das auge zu groß. Dannach geht es.

Habe dann viel gelesen, und ein Programm welches ich natürlich nicht 
kapiert habe aus dem netz kopiert. Dieser sollte 16 bit fast pwm auf 
meinen 328 bereitstellen.

Nach dem hochladen keine Funktion.
Habe dann meinen vorheriges Programm wieder aufgespielt.

Jetzt plötztlich das Problem.
Die led die zuerst initialisiert wird läuft wie immer, die andere läuft 
in slowmotion. Das die nicht sychron laufen verstehe ich nicht.
Da sie es vorher getan haben.

Habe ich den zweiten timer mit dem unbekannten Programm verstellt ? Ist 
soetwas möglich ?
Verstehe das alles nicht.

Im voidloop abschnitt habe ich nur 2 absätze. Einmal für led1, einmal 
für led 2.
Tausche ich die beiden leds in voidloop funktioniert die andere led wie 
in slowmotion.
Also immer die led die als zweites angesteuert wird, läuft 
unerklärlicherweise überhaubt nicht im takt.

Kann man mich verstehen?
Weiß jemand was da komisch ist ?

: Bearbeitet durch User
von D'oh! (Gast)


Lesenswert?

Mirco J. schrieb:
> Weiß jemand was da komisch ist ?

Dein Programm vielleicht? Moment, Sketch heißt jetzt ja.

von Mirco J. (mircoha60)


Lesenswert?

Hallo,
die zwei Zeilen sind für
Led 1 und led 2 geklont.
Danach kommt ein delay von x sekunden. Das gilt für beide.

: Bearbeitet durch User
von 42 (Gast)


Lesenswert?

Fehler in Zeilr 42

von Karl M. (Gast)


Lesenswert?

Du bist neu uns solltest Dich mit den Richtlinien in solche einem Forum 
vertraut machen.

Dann heißt es lernen und nochmals lernen, real 2 Jahre.

Danach sollte ein wenig Einblick vorhanden sein.

Mirco J. schrieb:
> Guten Tag,
> Ich kenne mich kaum aus. Und zwar habe ich seit Freitag erstmalig ein
> arduino uno. Vorher kaum programmiert.
>
> Ich habe am Wochenende bereits viele erfolgreiche kleine Schaltungen und
> Programme getestet.

von Carl D. (jcw2)


Lesenswert?

Mirco J. schrieb:
> Hallo,
> die zwei Zeilen sind für
> Led 1 und led 2 geklont.
> Danach kommt ein delay von x sekunden. Das gilt für beide.

Versuch erst mal deine .ino-Datei an deinen nächsten Post anzuhängen.
Über fremde Software kann man nämlich nur spekulieren, solange sie sie 
nicht lesbar ist.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Es schadet sicher auch nicht, wenn der 'fremde Code, Der nicht 
verstanden wurde' auch hier verlinkt wird.
Vll. wurde dort ein böser Hardware-Hack ausgeführt, Der ein oder zwei 
Innereien umgebogen hat.
(jetzt fragt mich bitte nicht, wie ... aber das Betriebssystem 'Arduino' 
muß ja auch irgendwo stehen - und bestimmt auch, wie der Neustart 
auszusehen hat - und Da wurde vll. gedreht)

MfG

von Mirco J. (mircoha60)


Lesenswert?

Also das ist das Programm, wo beide LEDs am Wochenende gleich liefen.

int led1 = 5;
int led2 = 6;


void setup(){

}

void loop(){

  for(int helligkeit =0; helligkeit <= 255; helligkeit = helligkeit +1 
){
    analogWrite(led1, helligkeit);

  for(int helligkeit =0; helligkeit <= 255; helligkeit = helligkeit +1 
){
    analogWrite(led2, helligkeit);



    delay(500);
}
}
}


Auf jedem Fall reagiert eine led jetzt immer total verzögert. Stelle ich 
bei Delay 100 ein, fängt die Led die sonst sofort mit anging, erst nach 
ca. 30 sekudnen an zu leuchten.
Ich habe leider mehrere fremde Programme eingespielt, deshalb kann ich 
nicht mit Sicherheit sagen,ob es das folgendes Programm war, mit dem ich 
was verstellt haben könnte.


#define ledPin 13
void setup()
{
pinMode(ledPin, OUTPUT);
// initialize Timer1
noInterrupts();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 34286;
TCCR1B |= (1 &lt;&lt; CS12);
TIMSK1 |= (1 &lt;&lt; TOIE1);
interrupts(); //
}
ISR(Timer1_OVF_vect)
{
TCNT1 = 34286; //
digitalWrite(ledPin, digitalRead(ledPin) ^ 1);
}
void loop()
{

}

Bitte keine Beleidigungen, dass habe ich so gefunden, und wollte gucken 
was passiert. Jetzt weiß ich nicht wie ich meinen 328p wieder in die 
Werkseinstellung bekomme.

: Bearbeitet durch User
von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Mirco J. schrieb:
> void loop(){
>
>   for(int helligkeit =0; helligkeit <= 1; helligkeit = helligkeit +1 ){
>     analogWrite(led1, helligkeit);
>
>      for(int helligkeit =0; helligkeit <= 1; helligkeit = helligkeit +1 ){
>        analogWrite(led2, helligkeit);
>
>        delay(50);
>      }
>   }
> }

Ich habe die Klammern eingerückt.

Die obere Schleife (LED 1) zählt immer nur um einen Schritt hoch und 
gibt Diesen aus (die LED wird ein Muckensack heller).
Jetzt kommt Schleife Zwei und zählt die Helligkeit der LED 2 hoch - 
Diese dimmt hoch, bis maximale Helligkeit.
Jetzt geht es wieder zur LED 1, wo wir wieder nur einen Schritt heller 
machen ...


Denke, Du hattest Folgendes:
1
void loop(){
2
3
  for(int helligkeit =0; helligkeit <= 1; helligkeit = helligkeit +1 ){
4
    analogWrite(led1, helligkeit);
5
    delay(50);
6
  } 
7
  for(int helligkeit =0; helligkeit <= 1; helligkeit = helligkeit +1 ){
8
    analogWrite(led2, helligkeit);
9
    delay(50);
10
  }
11
}

MfG

von Mirco J. (mircoha60)


Lesenswert?

Mh ne, war schon fast so wie geschrieben, hab das nochmal aktualisiert, 
bevor du geantwortet hattest. Du hattest leider schon mein Zitat bei dir 
drin..
Auf jedem Fall, wenn die Schleife mit Delay 10 läuft, macht Port 6 einen 
Durchgang in 2,5 Sekunden, Port 5 benötigt ca. 600 Sekunden.

Also ist ein Ausgang immer so ungefähr um Faktor 240 langsamer.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Die 'geschätzten 240' sind wohl ziemlich genau 256.
Die erste Schleife wird, bei Deinem oben gepostetem Code, ja nur jeweils 
um 1 erhöht.
Dann kommt Schleife 2 und zählt von 0 bis 255.
- Schleife 1 auf 1
- Schleife 2 und zählt von 0 bis 255.
- Schleife 1 auf 2
- Schleife 2 und zählt von 0 bis 255.
...

So braucht die Schleife 1 256 Durchläufe der Schleife 2, um selber 1x 
durch zu kommen.

Wie war das vorher?
Stehe etwas auf dem Schlauch.

MfG

von Udo R. (blackbird)


Lesenswert?

Hi,
Mirco schrieb: "... habe ich seit Freitag erstmalig ein
arduino uno."
So einem Greenhorn muss doch geholfen werden!
Patrick hat es doch schon als Code für dich formuliert!
Als ich anfing mit mc und so, habe ich auch solche Bolzen geschossen.
Versuche mal, den von mir leicht (formal) abgeänderten Codeaufbau zu 
durchdenken:
void loop()
{  // Klammer 1 auf

  for(int helligkeit =0; helligkeit <= 1; helligkeit = helligkeit +1 )
  {   // Klammer 2 auf
    analogWrite(led1, helligkeit);
    delay(50);
  }  // Klammer 2 zu
  for(int helligkeit =0; helligkeit <= 1; helligkeit = helligkeit +1 )
  {  // Klammer 3 auf
    analogWrite(led2, helligkeit);
    delay(50);
  }   // Klammer 3 zu
}   // Klammer 1 zu
Eine farbige Markierung der Klammernpaare hilft auch!
Mfg  Udo

von Mirco J. (mircoha60)


Lesenswert?

Udo R. schrieb:
> So einem Greenhorn muss doch geholfen werden!


Vielen Dank,


Ich meine, dass Funktionierte am Wochenende auch mit den wenigen Zeilen.


Ich verstehe gerade nicht, was am Wochenende noch anders war.

Beide Ausgänge sollen AnalogWrite 0 haben.
Dann sollen beide Ausgänge gleichzeitig 8bit PWM hochzählen, damit die 
Leds heller werden.

Ich möchte 2 Ausgänge haben, damit man später die eine LED unabhängig 
von der anderen steuern lassen kann.

Ist das nicht möglich?

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Dann schreib Das doch so :)

Dafür brauchst Du hier jetzt nur eine Schleife und packst beide 
analogwrite in diese eine Schleife rein.
Dann dimmen beide LED mit dem gleichen Wert hoch und springen dann 
zurück auf Null.

Eigentlich ist Deine jetzige Schaltung aber viel geiler ;)

Wenn Du dabei wider Erwarten Probleme bekommst, aktuellen Code hier rein 
und sagen, was wo passiert und was Du Dir gedacht hast, was passieren 
sollte.
Bringt ja Nichts, wenn wir Dir hier nen Code hinwerfen und Du in zwei 
Tagen damit vor neuen Problemen stehst.

Zumindest meine Meinung, daß es bestimmt besser ist, wenn Du verstehst, 
was Du da schreibst und auch, warum Du das so und so geschrieben hast.

MfG

: Bearbeitet durch User
von Udo R. (blackbird)


Lesenswert?

Da stimme ich Patrick voll zu!

Möchte noch hinzufügen:
Mirco schrieb:
"Beide Ausgänge sollen AnalogWrite 0 haben.
Dann sollen beide Ausgänge gleichzeitig 8bit PWM hochzählen, damit die
Leds heller werden."
Also Startbedingung: Beide Leds aus.
Dann innerhalb einer Schleife (gleichzeitig) beide Leds auf voll 
durchdimmen.
Das macht man dann so:

void loop()
{  // Klammer 1 auf

  for(int helligkeit =0; helligkeit <= 1; helligkeit = helligkeit +1 )
  {   // Klammer 2 auf
    analogWrite(led1, helligkeit);
    analogWrite(led2, helligkeit);
    delay(50);
  }   // Klammer 2 zu
}   // Klammer 1 zu

Mirco schrieb:
"Ich möchte 2 Ausgänge haben, damit man später die eine LED unabhängig
von der anderen steuern lassen kann."

Welche Bedingung steuert/kontrolliert das -> SPÄTER <- ?

Schau mal auf dieser (guten) mc-homepage links oben unter Home.
Da stehen 2 (lesenswerte!) Tutorials.
Die habe ich gelesen. Ja, das Lesen und Verstehen dauert schon länger, 
ist ja kein Roman, ABER da muss man mal durch! -:))

MfG Udo

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Mirco J. schrieb:
> for(int helligkeit =0; helligkeit <= 255; helligkeit = helligkeit +1

Fiel mir in den unteren Posts auf - dort steht überall <=1 ... da würde 
die LED nur bis 1 hoch gedimmt - was praktisch auch AUS wäre.
Dort muß natürlich <=255 stehen, daß wir auch bis 255 zählen.

Aaaahh ... jetzt dämmerts ... DAS war der erste 'hatte gerade editiert' 
... ;)

Die <=1 sind ab meinem Post mit dem (dann falschem) Zitat hier im Thread 
:/

MfG

: Bearbeitet durch User
von Udo R. (blackbird)


Lesenswert?

Patrick J. schrieb:
> Hi
>
> Mirco J. schrieb:
>> for(int helligkeit =0; helligkeit <= 255; helligkeit = helligkeit +1
>
> Fiel mir in den unteren Posts auf - dort steht überall <=1 ... da würde
> die LED nur bis 1 hoch gedimmt - was praktisch auch AUS wäre.
> Dort muß natürlich <=255 stehen, daß wir auch bis 255 zählen.
>
> Aaaahh ... jetzt dämmerts ... DAS war der erste 'hatte gerade editiert'
> ... ;)
>
> Die <=1 sind ab meinem Post mit dem (dann falschem) Zitat hier im Thread
> :/
>
> MfG

Hallo Patrick,
Das habe ich auch übersehen, mich nur auf den logischen Ablauf/die 
Formatierung konzentriert und nicht auf einzelne Argumente geachtet.
Und an Mirco: Also in der for-Schleife alle helligkeit <=1 in helligkeit 
<=255 ändern.

Schönen Abend noch!

von Mirco J. (mircoha60)


Lesenswert?

Udo R. schrieb:
> void loop()
> {  // Klammer 1 auf
>
>   for(int helligkeit =0; helligkeit <= 1; helligkeit = helligkeit +1 )
>   {   // Klammer 2 auf
>     analogWrite(led1, helligkeit);
>     analogWrite(led2, helligkeit);
>     delay(50);
>   }   // Klammer 2 zu
> }   // Klammer 1 zu

Hallo Udo, vielen Dank für die Antwort.

Mein Dank geht an alle die mir Helfen wollen ?.Danke euch.

Zu dem Vorschlag muss ich sagen, das er gut ist und funktioniert.
Ich hatte 2 for schleifen drinnen, weil ich später den Anfangswert, 
sowie die Anzahl der Schritte und den Endwert für jede led einzeln 
bestimmen möchte.

Zum Beispiel wenn aktion x eingrifft, dann soll zum Beispiel led 1 und 
led 2 hochfahren, led 1 soll aber bei 50 % ihren endwert erreichen. Led 
2 soll bis 75% steigen.

Deshalb denke ich, dass ich zwei for schleifen brauche oder ?

Mein kleines Testprogramm soll nur erstmal dazu dienen, 2 ausgänge mit 
analogWrite zu starten damit ich selber mal für mich testen kann, wie 
das mit pwm und dem dimmen so abläuft und aussieht.

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.