Forum: Compiler & IDEs Verständnisproblem bei


von Jarod (Gast)


Angehängte Dateien:

Lesenswert?

Hallo alle,
ich habe eine kleine Steuerungsaufgabe.
Ich weiss net wo mein Problem überhaupt liegt .
hoffe könnt ihr mir helfen und auf ihre fragen würde ich mich freuen ..
Danke im Voraus

von Grrrr (Gast)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

Dein Programm ergibt irgendwie überhaupt keinen Sinn.
Es ist zwar, mit etwas Phantasie, erkennbar wo die Reise hingehen soll, 
aber wenn man versucht den Autobus zu fassen zu kriegen, verschwindet er 
wieder.

Zu viel Code auf einmal geschrieben. Schmeiss es weg und fang nochmal 
neu an. Aber überleg dir diesmal einen STufenplan, wie du einzelne Teile 
nacheinander zum laufen kriegen kannst und vor allen Dingen, wie du die 
einzelnen Stufen immer wieder testen kannst.

Und ach ja: Ein sauber formatiertes Programm mit sauberer 
Einrückstruktur ist kein Luxus oder Selbstzweck.

Verusch vielleicht erst mal in eigenen Worten, unabhängig von der 
Programmiersprache
* das Problem zu beschreiben
* zu beschreiben wie du dir vorstellst, in welcher Reihenfolge welche
  Aktionen ausgeführt werden müssen, damit das Problem gelöst wird

Insbesondere beim letzten Punkt: Fang ruhig mit einer ganz groben 
Beschreibung deines Lösungswegs an, den du dann immer weiter 
verfeinerst.

von Jarod (Gast)


Lesenswert?

Mit diesem Programm wollte ich eigentlich eine Steuerung von einem 
Winkel zwischen 0 und 360° was zeitlich 0...20ms entspricht mit einem 
Frequenz von 50Hz.

Sollwinkel werde ich mit Hex Schalter eingeben
IstWinkel entspricht Zeitdifferenz zwischen eine steigende Flanke von 
PIND2 und die nächste steigende Flanke von PIND1.

PORTB5 --> EINschalten
PORTB6 --> AUSschalten

Das Programm soll jedes mal laufen, das heisst vergleicht imma und 
wieder soll mit ist .
Korrekturwert wird dekrementiert bis Korrekturwert =0 dann schaltet ein: 
PB5ein bzw. PB6 aus

In dem fall dass ein 0 bei PIND0 habe, dann schaltet aus: PB6 ein bzw. 
PB5 aus

von Karl H. (kbuchegg)


Lesenswert?

Jarod schrieb:

> Das Programm soll jedes mal laufen, das heisst vergleicht imma und
> wieder soll mit ist .

Dein Programm läuft sowieso dauernd.
Die Schleife in main()
1
   while( 1 ) {
2
3
     ...
4
   }

wird viele Tausend male in der Sekunde durchlaufen. OK, bei dir nicht, 
weil du die Schleife ständig mit einem _delay_ms ausbremst


Kanstt du das in Form eines Alaufdiagrams formulieren?

von Karl H. (kbuchegg)


Lesenswert?

Jarod schrieb:

Genau das meine ich mit detailieren

> Das Programm soll jedes mal laufen, das heisst vergleicht imma und
> wieder soll mit ist .

Soweit so gut.
Wo kriegst du den Ist-Wert her? Was ist seine Bedeutung? Wie wird er 
ermittelt?

> Korrekturwert wird dekrementiert

Wo kommt auf einmal der Korrekturwert her? Was ist seine Bedeutung? Was 
wird da korrigiert?

> bis Korrekturwert =0 dann schaltet ein:
> PB5ein bzw. PB6 aus
>

Du meinst wohl das hier?

> /*Korrekturswert dekrementieren*/
> for (;Korrektur_wert != 0; Korrektur_wert--)
> {
> }

Nun, das wirft dir jeder bessere Compiler ersatzlos raus und ersetzt es 
durch
   Korrektur_wert = 0;

Und das darf er auch. Denn nachdem beide Varianten durchgelaufen sind 
(also deine bzw. die durch die sie der COmpiler ersetzt hat), ist das 
Endergebnis dasselbe: Korrektur_wert hat den Wert 0. Dein Code kommt 
umständlich zu diesem Ziel, der vom Compiler macht das direkt.

von Jarod (Gast)


Lesenswert?

1-Wo kriegst du den Ist-Wert her? Was ist seine Bedeutung? Wie wird er
ermittelt?

--> Korrekturswert = (Soll_wert - (10000 - Timer_wert1));
    Ist_Wert = 10000 - Timer_wert1;
    Ist Wert wird berechnet wenn der Timer_wert1 zwischen 2 steigende 
Flanken PD2 und PD1 ermittlet wurde .


2-Wo kommt auf einmal der Korrekturwert her? Was ist seine Bedeutung? 
Was
wird da korrigiert?

-->  Korrekturswert ist eigentlich nix anders als Soll - Ist
     Korrektur_wert ist noch eine 2. Berechnung für Korrekturswert, wenn
     Korrekturswert kleiner als 0 ist.
     Sein Bedeutung ist Zeitdifferenz zwischen soll und ist. Er wird 
dekrementiert bis er 0 ist dann schalte ich ein PB5=1.

von Karl H. (kbuchegg)


Lesenswert?

Jarod schrieb:
> 1-Wo kriegst du den Ist-Wert her? Was ist seine Bedeutung? Wie wird er
> ermittelt?
>
> --> Korrekturswert = (Soll_wert - (10000 - Timer_wert1));
>     Ist_Wert = 10000 - Timer_wert1;
>     Ist Wert wird berechnet wenn der Timer_wert1 zwischen 2 steigende
> Flanken PD2 und PD1 ermittlet wurde .

OK.
Wo ermittelst du den 'Wert' zwischen 2 steigenden Flanken.
Ich kann das nirgends erkennen.

Das hier
1
/*Timer1 nullen*/   
2
TCNT1 = 0; 
3
4
 /*Warten auf Nulldurchgang*/      
5
while ( (PIND & (1 << PIND1)));
6
7
 /*Timer abfragen und in Timerswert speichen*/
8
Timer_wert1 = TCNT1;
macht alles mögliche, nur nicht den Wert zwischen 2 steigenden Flanken 
ermitteln. Das liegt zu einem nicht unerklecklichen Teil daran, das du 
bis jetzt noch kein Wort darüber verloren hast, was denn eigentlich der 
'Wert' sein soll. Sind das Äpfel oder Birnen oder Helligkeit oder 
Durchflussmenge oder vielleicht doch eine Zeit.

Aber Zeit kanns irgendwie nicht sein. Denn du setzt den Timer ziemlich 
unvermittelt irgendwann auf 0. Das ist ungefähr so sinnvoll, wie eine 
Stoppuhr einfach irgendwann zu starten, wenn Schumi schon längst auf 
seiner Runde ist und das ganze dann die 'Rundenzeit' zu nennen.

Du musst schon von einer Flanke bis zur nächsten Flanke messen.
Woran erkennt man denn eine Flanke?

> -->  Korrekturswert ist eigentlich nix anders als Soll - Ist
>      Korrektur_wert ist noch eine 2. Berechnung für Korrekturswert, wenn
>      Korrekturswert kleiner als 0 ist.
>      Sein Bedeutung ist Zeitdifferenz zwischen soll und ist.

Warum heißt er dann Korrektur?
Damit man von einer 'Korrektur' sprechen kann, muss es etwas geben was 
korrigiert werden kann.

> Er wird
> dekrementiert bis er 0 ist dann schalte ich ein PB5=1.

Wie schon gesagt: Das tust du im eigentlichen Sinne nicht.
Was ist der Zweck des Verringerns (ich nehme mal an Zeit zu verbraten)? 
Woher weißt du, wie lange das Runterzählen dauert?

von Jarod (Gast)


Angehängte Dateien:

Lesenswert?

ich werde diesmal genau beschreiben, wie mein Programm aussehen soll.
ich benutze ein Atmega16.

Die Aufgabe meines Programmes ist die Winkel Steuerung von der Phase 
250V AC 50Hz.

-Soll_zeit wird von Hex-Schalter gelesen, dafür sind PORTA und PORTC 
zuständig.

-hab 3 Eingang Signale für den Mikrocontroller:
  ->Komparator Signal stellt die 250V dar. an PORTD1
  ->Einschaltsignal von einer SPS Anlage. an PORTD0
  ->Stromdetektor: liefert mir Signal wenn der Schalter betätigt ist. an 
PORTD2

-2 Ausgang Signal von dem Mikrocontoller:
  ->Einschaltsignal PORTB5
  ->Ausschaltsignal PORTB6

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.