Forum: Mikrocontroller und Digitale Elektronik ATtiny45 Programmierfehler?


von Helmut H. (hheck)


Lesenswert?

Hallo zusammen,
Endlich  konnte ich die damit erzeugte .hex in den ATtiny45 mit Ponyprog 
laden, aber der MC macht nix. (Die H-Brücke besteht aus 4 NPN, die einen 
Scheibenwischermotor ansteuern):

/*
  Servosteuerung:
Differenz-analogwert an Pin3 ermitteln und Transistoren einer H-Brücke 
entsprechend mit Softstart ansteuern und durch kurzschließen abstoppen.
*/

int Wert; // Variable für den Analogwert
byte T = 0;

void setup()
{

  pinMode( 0, OUTPUT);
  pinMode( 1, OUTPUT);
  pinMode( 2, OUTPUT);
  pinMode( 4, OUTPUT);
  pinMode( 3, INPUT);
}

void loop()
{
  noch:
  Wert = analogRead(3);
  if (Wert > 130)
  { if (T = 255)
    (T = T + 1);
    digitalWrite( 0, LOW);
    digitalWrite( 1, HIGH);

    delay(T);

    digitalWrite( 0, LOW);
    digitalWrite( 1, LOW);

    delay(255-T);
    goto noch;
  }

  if (Wert < 120)
  {
    T = T + 1;
    digitalWrite( 2, LOW);
    digitalWrite( 4, HIGH);

    delay(T);

    digitalWrite( 2, LOW);
    digitalWrite( 4, LOW);

    delay(255-T);
    goto noch;
  }
    digitalWrite( 2, HIGH);
    digitalWrite( 4, HIGH);
    T = 0;
}


Das ist mein erster Versuch mit ATtiny ( bisher PIC )

Ist da was falsch?

Gruß
Helle

von Stefan F. (Gast)


Lesenswert?

Helmut H. schrieb:
> if (T = 255)
>     (T = T + 1);

Das Gleich-zeichen ist eine Zuweiseung. Hier setzt du T auf der Wert 255 
und die Bedingung ist immer wahr, weil der Wert nicht 0 ist.

Du musst "if (T==255)" schreiben.

Dann erkläre mal, warum du danach zu dem Byte mit dem Wert 255 eine 1 
addierst. Setze es doch gleich auf 0.

Warum setzt du an Ende der loop T=0? So kann der Wert niemals 
fortlaufend hoch gezählt werden. Überlege dir nochmal ganz genau, wann 
du T hochzählen willst und ob du es überhaupt auf 0 setzen musst.

Auf das goto solltest du besser verzichten. Das kannst du mit Schleifen 
ordentlicher lösen.

Wenn du das nächste mal fragst, was in deinem Programm falsch ist, dann 
gewöhne dir an, es zu kommentieren und zu erklären was es tun soll. Hier 
ist ziemlich unklar, was du beabsichtit haben könntest.

Um das Ergebnis zu prüfen, besorge dir einen Debugger oder wenigstens 
einen Logic Analyzer.

von RPINNEN (Gast)


Lesenswert?

Helmut H. schrieb:
> Ist da was falsch?

Alles!

von Stefan F. (Gast)


Lesenswert?

Richtig Einrücken wäre auch hilfreich, das der Quelltext lesbar wird. Je 
schwerer du es den Helfern machst, umso weniger Hilfe wirst du bekommen.

Um PWM Signale zu erzeugen, benutzt man bei Arduino normalerweise die 
Funktion analogwrite().

Es fehlt der Schaltplan, man kann so gar nicht erkennen, welcher Ausgang 
welchem Zweck dient.

von S. R. (svenska)


Lesenswert?

Stefan ⛄ F. schrieb:
> Richtig Einrücken wäre auch hilfreich, das der Quelltext lesbar wird.

Sinnvoll wäre es auch, den Quelltext passend einzupacken (mit [c] und 
so), oder als Datei mit richtiger Endung anzuhängen. Steht netterweise 
auch in der Hilfe über dem Textfeld für neue Posts...

von Helmut H. (hheck)


Lesenswert?

Stefan ⛄ F. schrieb:
> Helmut H. schrieb:
>> if (T = 255)
>>     (T = T + 1);
>
> Das Gleich-zeichen ist eine Zuweiseung. Hier setzt du T auf der Wert 255
> und die Bedingung ist immer wahr, weil der Wert nicht 0 ist.
>
> Du musst "if (T==255)" schreiben.
>
> Dann erkläre mal, warum du danach zu dem Byte mit dem Wert 255 eine 1
> addierst. Setze es doch gleich auf 0.
>
> Warum setzt du an Ende der loop T=0? So kann der Wert niemals
> fortlaufend hoch gezählt werden. Überlege dir nochmal ganz genau, wann
> du T hochzählen willst und ob du es überhaupt auf 0 setzen musst.
>
> Auf das goto solltest du besser verzichten. Das kannst du mit Schleifen
> ordentlicher lösen.
>
> Wenn du das nächste mal fragst, was in deinem Programm falsch ist, dann
> gewöhne dir an, es zu kommentieren und zu erklären was es tun soll. Hier
> ist ziemlich unklar, was du beabsichtit haben könntest.
>
> Um das Ergebnis zu prüfen, besorge dir einen Debugger oder wenigstens
> einen Logic Analyzer.

Danke,
ich kenne eben nur ein wenig Basic, daher die Frage hier.
Gut, ich gehe an mir arbeiten...

Helle

von Stefan F. (Gast)


Lesenswert?

Alles klar. Sage Bescheid, wenn die Hinweise nicht ausreichen.

Die Arduino IDE hat übrigens eine Autoformat-Funktion zum Korrigieren 
der Einrückungen.

von Thomas G. (Firma: Frickelhauptquartier) (taximan)


Lesenswert?

" if (T = 255)
    (T = T + 1); "

Typischer Anfänger/Flüchtigkeitsfehler; passiert mir auch gelegentlich, 
und der Compiler meckert nicht... Ungleich bedeutet übrigens "!=", nicht 
wie in BASIC "<>". Für "T=T+1" (auch wieder BASIC) kannst du auch "T++" 
schreiben. Damit wird T um eins erhöht, T-- funktioniert auch.

von HildeK (Gast)


Lesenswert?

Thomas G. schrieb:
> Typischer Anfänger/Flüchtigkeitsfehler; passiert mir auch gelegentlich,
> und der Compiler meckert nicht...

Man könnte aber schreiben
1
  if(255=T)
Dies meckert er dann an, aber eben nicht, wenn der Vergleichsoperator 
verwendet wird.

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.