PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hallo neues Problem - Hoffe auf Hilfe



t4-torsten
13.01.2009, 14:45
Hallo , nach der schnellen Hilfe von gestern heute nun ein neuer Versuch ...

Da ich mich erst seid kurzem mit dem dem Atlem und der Programmierung befasse ist vielleicht noch nicht alles perfekt .
hab damit angefangen eine Lichtsteuerung für mein Fahrzeug zu entwerfen erst einmal auf einen Testboard ...

Jetzt zu meinem Problem...

Wenn ich mit meinem kleinen Programm in ein Unterprogramm und dieses wird dieses auch ausgeführt -- aber mit Return springt er wieder zurück zu dem zuletzt ausgeführten Unterprogramm eigentlich sollte er zum Hauptprogramm zurückkehren .

Ich kopier mal den bisherigen Code dazu: vielleicht Hilfs ja ... nicht lachen .. mach das erst seid Samstg!


$regfile = "m8def.dat"
$crystal = 4000000
'--------------------------------------------------------------------- Konfiguration
Config Portb.1 = Output '-----------Innenleuchte
Config Pinb.0 = Input '-----------Türkontakt
Config Pinb.2 = Input 'Zündung an ( Licht soll ausgehen )
Config Portb.3 = Output 'Testleuchte ( wo das Programm steht entfällt später)
Config Portb.4 = Output '
Portb.0 = 1
Portb.2 = 1

'---------------------------------------------------------------------- Grundvariablen



Dim A As Byte
Dim I As Byte
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1 ' PWM Timer
Compare1a = 255

Dim Richtung As Integer
Richtung = 0

'------------------------------------------------------------------------ Tasterabfragen



DO

Debounce Pinb.0 , 0 , Pr , Sub
Debounce Pinb.2 , 0 , Pa , Sub

Loop

End


'------------------------------------------------------------------------- Unterprogranmm Abdimmen


Pr:
If Richtung = 0 Then


Do

Compare1a = Compare1a - 1
Waitms 10
Loop Until Compare1a = 0
Richtung = 1

Portb.3 = 1
Wait 1
Portb.3 = 0
Gosub Vzr

Else
Return
End If

Return

'--------------------------------------------------------------------------- Unterprogramm Andimmen
Pa:

'---- If Richtung = 0 Then

'-------- if richtung = 1 then

Do

Compare1a = Compare1a + 1
Waitms 10
Loop Until Compare1a = 255
Richtung = 0



'------ Else
' Return
'------ End If


Return

'--------------------------------------------------------------------------- Timer für Nachleuchten
Vzr:

Portb = 1
Config Timer0 = Timer , Prescale = 1024 'Konfiguriere Timer1
Enable Timer0 'schalte den Timer1 ein
On Timer1 Isr_von_timer1
Enable Interrupts
Timer1 = 0

Do


If Pinb.2 = 0 Then

Gosub Pr

Else

Loop
End If

Return

'------------------------------------------------------------------------------
Isr_von_timer1: Timer0 'Timer0

Gosub Pr





Return








[/code]

MeckPommER
13.01.2009, 15:48
Hi :)

Es kann bei der Fehlersuche nicht schaden, sich einen lesbaren Stil anzueignen. Wenn man bei Schleifen und IF-Konstrukten sinnvolle Einrückungen vornimmt, kann man leichter feststellen, wo etwas falsch sein könnte.

Einiges ist arg unsinnig, die das "else return" beim Abdimmen, anderes ist falsch, wie z.B. das loop im IF-Block beim Timer fürs Nachleuchten.

Ich muss auch ehrlich gestehen, das es nicht grade Spaß macht, dieses Listing zu lesen.

So ... aber dafür, das du das erst sein ein paar Tagen machst ... Respekt :-)

Gruß MeckPommER

Jon
13.01.2009, 16:03
Hi!
Das die Zeilen nicht eingerückt sind könnte daran liegen, dass der Code nicht im [code*][/code*] (ohne*) eingetragen wurde.

Ich habe, so wie MeckPommER nicht wirklich lust, das ganz genau durch zu arbeiten. Ich würde dich bitte, dein Programm nach dem, was schon gesagt wurde und nach dem, was ich gleich schreiben werde, nochmal zu überarbeiten und dann in dem [code*][/code*] (ohne*) zu posten.
Mir ist als erstes aufgefallen, dass du in deinen Subs zum Entprellen ein Do anfängst, aber nicht mit nem loop aufhörst.
Und ob BASOM nen Config Timerx im Programm mag weiß ich auch nicht.

mfg,
jon

t4-torsten
13.01.2009, 21:15
So danke erst mal zu dem Tip mit den ganzen Schleifen.... war ja auch verschleift ... [-o<

vielleicht wenn jamand lust hat ... geht vielleicht auch kürzer ? Oder besser ?

Stell ich den Code noch mal rein hoffe jetzt Richtig !




$regfile = "m8def.dat"
$crystal = 4000000
'----------------------Konfiguration---------------------------------------------
Config Portb.1 = Output '-----------Innenleuchte
Config Portb.0 = Input '-----------Türkontakt
Config Portb.2 = Input 'Zündung an ( Licht soll ausgehen )
Config Portb.3 = Output 'Testled ( wo das Programm steht entfällt später)
Config Portb.4 = Output 'Testled (wo das Programm steht entfällt später )
Config Portd.4 = Input 'ZV Eingang Türen auf
Config Portd.5 = Input 'ZV Eingang Türen zu



Pinb.0 = 1 'Pull upps
Pinb.2 = 1 'Pull upps
Pind.4 = 1 'Pull upps
Pind.5 = 1 'Pull upps


'------------------- Grundvariablen---------------------------------------------



Dim A As Byte
Dim I As Byte
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1 ' PWM Timer
Compare1a = 255


'------------------ Tasterabfragen----------------------------------------------
Main:

'schleife für Tasterabfragen
Do
Debounce Pinb.0 , 0 , Pr , Sub ' TÜRKONTAKT
Debounce Pind.4 , 0 , Prr , Sub ' ZV Tür auf

Loop

End


'--------------- Unterprogranmm Andimmen----------------------------------------


Pr:

Do
Compare1a = Compare1a - 1 ' Dimmvorgang
Waitms 5
Loop Until Compare1a = 0




Gosub Vzr ' geht zur Zeitverzögerung




'------------------- Unterprogramm langsam Andimmen ---------------------------



Prr:

Do
Compare1a = Compare1a - 1 ' Dimmvorgang
Waitms 15
Loop Until Compare1a = 0

' geht zur Zeitverzögerung
Gosub Vzr

Return


'------------------Unterprogramm schnell Andimmen -------------------

Paa:



Do
Compare1a = Compare1a + 1
Waitms 5
Loop Until Compare1a = 255

Goto Main

Return

'-----------------Unterprogramm Langsames Abdimmen -------------------------------

Pa:


Do 'Abdimmen
Compare1a = Compare1a + 1
Debounce Pinb.0 , 0 , Pr , Sub
Waitms 10
Loop Until Compare1a = 255
'

Goto Main

Return

'--------------------- Timer für Nachleuchten ---------------------------------
Vzr:

For I = 1 To 255 ' Timer Schleife
Debounce Pinb.2 , 0 , Paa , Sub ' ZV Tür Zu
Debounce Pind.5 , 0 , Pa , Sub ' ZV Tür Zu
Waitms 300 'Wartezeit
Next I

Gosub Pa 'Aufruf Abdimmen


Return

'----------------------------------- ende -------------------------------------

Also für Vorschläge bin ich offen ! Was will ich noch tun ? Coming / Living Home Funktion .. Soll heißen wenn es draußen dunkel ist sollen auch die Scheinwerfer mit andimmen ... Und wenn es draußen kalt ist könnt ja auch die Heizung mit angehen oder das Lenkrad vorwärmen ....

Danke noch mal das Ihr mich hier nicht auslacht aber die Micro Prozessor Geschichte hat mich irgendwie schon immer gereizt.

MeckPommER
13.01.2009, 21:49
Ok, 2. Runde :-)

Im Pr: Unterprog. fehlt das Return, und generell müssen Unterprogramme, die mit Gosub angesprungen werden auch mit Return verlassen werden, sonst hängt sich dein Controller auf. Bei einem Gosub "merkt" sich der Controller, woher er kam - und sprint mit dem Return wieder zu der Adresse zurück. Erfolgt kein Return, so merkt er sich die ganzen Ursprungsadressen bis ihm irgendwann der RAM ausgeht, und das kann je nach Programm in einigen Stunden oder auch nach wenigen Millisekunden der Fall sein.

Übrigens können Sinnvolle Namen für Unterprogramme enorm die Lesbarkeit verbessern :-)

Generell würde ich das Programm anders aufbauen. Der jetzige Nachteil ist der, das dein Programm die Taster nicht mehr abfragt, sobald eine Aktion wie das Dimmen erfolgt.
Besser wäre es, in den Unterprogrammen nur über Variablen festzulegen wohin (z.b. 0 oder 255) und wie schnell gedimmt werden soll und das eigentliche Dimmen im Hauptprogramm zu machen.
So bleibt das System immer "am Ball" und wertet ständig die Sensoren (Taster, später vielleicht auch Helligkeits- und Temperatursensoren) aus.

Gruß und nie entmutigen lassen

MeckPommER