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
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.
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
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?
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.
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.