Port´s einstellen

Hallo Matthias!

Irgendwie kann ich deinen Ausführungen nicht folgen..... :hmmmm:

Wenn du globale Variablen definierst, dann stehen die Werte natürlich auch nach einem GOSUB und erst recht nach einem GOTO zur Verfügung!

Mit GOTO solltest du generell vorsichtig sein!
Verwende es NUR, wenn du innerhalb der selben Schleife bzw. Routine bleibst.
Springe mit GOTO bitte nicht in andere Subroutinen oder Schleifen..... dafür gibt es GOSUB!

Wenn du momentan Probleme mit GOSUB und GOTO hast, dann würde ich auf einen genrellen Programmier- und Verständnisfehler tippen!
Vielleicht hilft es uns ja, wenn du deinen aktuellen Programmcode hier mal einstellst......
Vorausgesetzt jemand hat die Zeit, um sich in deinen Code einzuarbeiten. :wink:

Grüße,
Cassio
 
Hallo Cassio,



Danke trotzdem erstmal, so ich hab mal grob Kommentiert und besagte stelle Rot hervor gehoben, vielleicht hat ja wirklich jemand lust und zeit, kann in der Form auch im simulator laufen hab die hardware abfragen raus bis auf pind.7 der mus auf null geschalten werden für die Grundstellung und pinb.2 simuliert die fertigmeldung der Bohrmaschine(damit die For next nicht einfach durchrattert bei der simulation)
Code:
'************************************************************************
'*                                                                      *
'*   Programm zum ansteuern eines automatischen Werkstückvorschubes     *
'*                                                                      *
'*   von Matthias G.                                                    *
'*                                                                      *
'************************************************************************


$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32

'$sim


'****************** Initialisierung Display *****************************
Config Lcdpin = Pin , E = Portc.0 , Rs = Portc.1 , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcd = 16 * 2
Config Lcdbus = 4                                           'Im Code sind längere Texte als das LCD 16 * 2 anzeigen kann, ich Tausche es noch gegen ein 20 * 2
Initlcd
Cls
'***************** Ports bestimmen **************************************
Ddrb = &H00                                                 'portb.0 - .5   eingänge
Ddrd = &H0F                                                 'portd.4 - .7   eingänge und .0 - .3 ausgänge
Portb = &HFF                                                'Port B alle Eingänge haben Pullup Widerstände
Portd = &HF0                                                'Port D Eingänge haben Pullup Widerstände , Ausgänge haben Low Pegel

'Ausgänge Port D
Ma Alias Portd.0                                            'gibt der Maschine Freigebe zum bohren  1 = Bohren 0 = Grundstellung
Z1 Alias Portd.1                                            'vordere Werkstückklemmung  1 = klemmen , 0 = lösen
Z2 Alias Portd.2                                            'hintere Werkstückklemmung  1 = klemmen , 0 = lösen
Z3 Alias Portd.3                                            'Werkstückvorschub   1 = vorn , 0 = hinten

'Eingänge Port D (Rückmeldung)
Di Alias Portd.4                                            'Drehzahlimpuls
Sr Alias Portd.5                                            'Spindelrückmeldung - fertig gebohrt Werkstück weiterschieben
Z3v Alias Portd.6                                           'Vorschubzylinder ist vorn
Z3h Alias Portd.7                                           'Vorschubzylinder ist hinten
'Eingänge Port B
Z1z Alias Pinb.0                                            'vordere Werkstückklemmung ist zu
Z2z Alias Pinb.1                                            'hintere Werkstückklemmung ist zu
Su Alias Pinb.2                                             'Spindel unten **********************************
T1 Alias Pinb.3                                             'Taster 1      * Die Taster haben die Funktion, *
T2 Alias Pinb.4                                             'Taster 2      * die in der zweiten Zeile des   *
T3 Alias Pinb.5                                             'Taster 3      * Displays angezeigt werden.     *
'                                                                           **********************************



'***************** Variablen dimensionieren*****************************
Dim Bo As Byte                                              'Bo steht für die anzahl der zu Bohrenden Löcher
Dim Boa As String * 2                                       'Boa wird zur formatierten Ausgabe von Bo benötigt
Dim Sbo As Byte
Dim I As Byte

Bo = 1                                                      'vorgabe eine Bohrung


'****** Hauptprogramm **************************************************



   Gosub Grundstellung                                      ' sprungbefehl zu Grundstellung
   Waitms 50                                                ' taster prellen noch werd´s noch anders lösen
   Bitwait T2 , Reset                                       ' warte auf betätigung Taster2 = "weiter"
   Gosub Anzahl_bohrungen                                   ' sprungbefehl Anzahl_Bohrungen
[COLOR="#B22222"]Klemm:[/COLOR]   Gosub Klemmung                                           ' sprungbefehl Klemmung
   Gosub Programmstart
  For I = sBo To 1 Step - 1                                  ' durchläufe nach anzahl der eingegebenen Bohrungen
   Gosub Maschine_bohren                                    ' hardware abläufe
   Gosub Vorschub
  Next
   Gosub Fertig









End



'*********** Subroutinen ***********************************************

Fertig:
 Waitms 250
Do
   Upperline : Lcd "    Fertig !     "
   Lowerline : Lcd "Aus   PgmSrt  Neu"


       If T1 = 0 Then                                       ' ist Taster1 (Aus) springe grundstellung mach display aus
         Gosub Grundstellung
         Display Off
         Return

       Elseif T2 = 0 Then                                   ' ist Taste2 (PgmSrt) [COLOR="#B22222"]jetzt sollte zur klemmung gesprungen werden um das werkstück tauschen zu können und das ganze programm wiederholt werden[/COLOR] 
         Bo = Sbo                                           ' sbo ist die variable die gesichert wurde bevor bo decrementiert wird [COLOR="#B22222"]leider sind nach goto die anzahl der Bohrungen Bo wegund mit gosub würde genau hier wieder hergesprungen werden[/COLOR]
         Goto Klemm
       Elseif T3 = 0 Then                                   ' ist Taster3 (neu) reset mit goto 0
        Goto 0
       End If

  Waitms 100

Loop

Vorschub:                                                   ' Spätere hardware ausführen kommen noch eingangs abfragen dazu - solang das Menü noch nicht geht ist es erstmal nicht wichtig

    Reset Z1
    Waitms 500
    Set Z3
    Waitms 500
    Set Z1
    Waitms 500
    Reset Z2
    Waitms 500
    Reset Z3
    Waitms 500
    Set Z2
    Waitms 500


Return





Maschine_bohren:
         Boa = Str(bo)                                      'wandelt variable in ein string um?
      Boa = Format(boa , "   ")                             'gibt den string in einem bestimmten Format zurück
   Upperline                                                ' LCD 1. Zeile anwählen

       If Bo = 1 Then                                       'wenn Bo = 1 dann gib den Text "Bohrung" aus
          Lcd "noch " ; Boa ; " Bohrung"
       Else                                                 'sonst gib "Bohrungen" aus
          Lcd "noch " ; Boa ; " Bohrungen"
       End If

   Lowerline : Lcd "Programm läuft"

        Set Ma                                              ' hardware ansteuerung

     Bitwait Su , Reset

        Reset Ma
        Decr Bo                                             ' zählt Bo für anzeige runter

Return


Programmstart:
 Waitms 250
Do
    Upperline : Lcd "Programm Starten"
    Lowerline : Lcd "Rst {132}ndern Start"


       If T3 = 0 Then                                       ' ist Taster3 (Start) springt zurück und startet die For Next schleife
        Return
       Elseif T1 = 0 Then                                   ' ist Taster1 (reset) reset mit goto 0
         Goto 0
       Elseif T2 = 0 Then                                   ' ist Taste2 (ändern) sprung zu anzahl bohrungen zum ändern und hierhin zurück
         Gosub Anzahl_bohrungen
       End If

  Waitms 100

Loop





Klemmung:
   Waitms 250
Do
   Upperline : Lcd "Werkst{129}ck Klemmen "                 ' Anzeige LCD   warum da kein "ü" gemacht wird kann ich mir nicht erklären bis 127 geht alles ab 128 nicht mehr,

      If Z1z = 1 And Z2z = 1 Then
   Lowerline : Lcd "zu *   ok    auf"                       'in nem anderen Testprogramm von mir hat es schon funktioniert
      Else
   Lowerline : Lcd "zu     ok  * auf"
      End If

       If T3 = 0 Then                                       ' ist Taster3 (auf) gedrückt dann reset Z1 und Z2
        Reset Z1
        Reset Z2

       Elseif T1 = 0 Then                                   ' ist Taster1 (zu) gedrückt dann set Z1 und Z2
         Set Z1
         Set Z2

       Elseif T2 = 0 And Z1 = 1 And Z2 = 1 Then             ' wird Taste2 (ok) betätigt dann verlasse die Routine
         Return
       End If                                               ' rücksprung ins Hauptprogramm , [COLOR="#B22222"]hier leider das Problem mit dem wiederholen am ende - dann gilt dieses return dem sprungbefehl aus "Fertig:"[/COLOR]

  Waitms 100
Loop



Anzahl_bohrungen:
Waitms 250                                                  'entprellen und Anzeige beruhigen
Do                                                          'schleife
      Boa = Str(bo)                                         'wandelt variable in ein string um?
      Boa = Format(boa , "   ")                             'gibt den string in einem bestimmten Format zurück
   Upperline                                                ' LCD 1. Zeile anwählen

       If Bo = 1 Then                                       'wenn Bo = 1 dann gib den Text "Bohrung" aus
          Lcd Boa ; " Bohrung      "
       Else                                                 'sonst gib "Bohrungen" aus
          Lcd Boa ; " Bohrungen    "
       End If

   Lowerline : Lcd "-      ok      +"                       ' 2.Zeile gewählt und Ausgabe des Textes für die Funktion der  3 Taster

       If T3 = 0 Then                                       ' ist Taster3 (+) gedrückt dann addiere 1 zum Wert Bo dazu
        Incr Bo

          If Bo > 99 Then                                   ' Bo wird auf 99 begrenzt
             Bo = 99
          End If

       Elseif T1 = 0 Then                                   ' ist Taster1 (-) gedrückt dann subtrahiere 1 vom Wert Bo
         Decr Bo

           If Bo < 1 Then                                   ' ist Bo kleiner 1 dann setze Bo auf 1 und gib den Text aus
              Bo = 1
              Upperline : Lcd "  Sehr Witzig   "
              Wait 1
           End If

       Elseif T2 = 0 Then                                   ' wird Taste2 (ok) betätigt dann verlasse die Routine
         Sbo = Bo                                              ' die anzahl wird für eine spätere wiederholung gesichert, da bo ja decrementiert wird
         Return
       End If

  Waitms 100
Loop






Grundstellung:                                              ' Alle Ausgänge werden auf 0 gesetzt(Grundstellung)
    Ma = 0
    Z1 = 0
    Z2 = 0
    Z3 = 0

     Waitms 500                                             ' wird noch angepasst Aktionszeit der Zylinder oder Motore(hab mich noch nicht entschieden)

      If Pind = &H70 And Pinb = &HFF Or Pind = &H60 And Pinb = &HFF Then       ' Abfragen der Eingänge alle eingänge sollen nicht betätigt also High-Pegel haben

        Upperline : Lcd "  Grundstellung   "                ' ausser Pind.7(z3h in Grundstellung betätigt)muss Low-Pegel haben und bei Pind.4 ist der Pegel egal (drehzahlmessung)
        Lowerline : Lcd "       ok         "                ' ausgabe auf Display
      Return

      Else
       Upperline : Lcd "Fehler B" ; Bin(pinb)               ' zeigt port b und d im LCD an zur Fehlersuche oder was auch immer
       Lowerline : Lcd "       D" ; Bin(pind)
       Waitms 250
      End If

  Gosub Grundstellung
    Return



End



Danke

Gruss
Matthias
 
Hi Matthias,

Das Problem was ich habe liegt an den Befehlen Gosub und Goto.
Es gibt eine Stelle im Programm wo ich hinspringen möchte ohne wieder zurück zu springen, das geht mit Goto, da ist aber wieder das Problem das alle variablen gelöscht sind. Dieser Sprung bezweckt aber eben das ich am ende des Programmes abfrage ob es mit der gleichen "zahl" wiederholt werden soll. Springe ich mit Gosub springt es logischerweise wieder zurück zum ende springe ich mit goto ist die "zahl" weg.
muß ich mir erstmal im Programm ansehen.

Grundsätzlich gilt:
Für jedes Gosub MUSS ein Return vorhanden sein. Du mußt also die gleiche Anzahl von Sprüngen (Gosubs) in eine Subroutine haben wie du Rücksprünge (Returns) hast. Wenn das nicht der Fall ist, dann bekommst du mächtig Probleme mit der Programmausführung. Nennt man Stack-Überlauf und ergibt die wildesten Fehlererscheinungen.

Zu GOTO :
Das benötigt man in Hochsprachen nicht mehr wirklich. Es gibt eigentlich immer (OK evtl bis auf 0,0001%) Möglichkeiten es anders, überschaubarer und eleganter zu lösen.

Gruß
Dino
 
Hi Dino,

ja ich hab ja alle Gosub´s mit einen Return und hab mir das schon gedacht wenn ich die Rücksprünge auslasse das sich die Rücksprung adressen im Stack addieren,
ich denke ich hab auch sicher die falsche Herangehensweise Allgemein für solch eine Struktur,
geht halt nur darum das wenn ich am Ende des Programm angekommen bin die Möglichkeit haben möchte mitten ins Programm wieder einzuspringen ohne neue Werte abzufragen. (wenn man z.B. zweimal das gleiche Werkstück macht)
Das Problem ist halt man springt vom ende des Programmes dahin und wird natürlich wieder zum ende des Programmes zurückgesprungen.

Gruss
Matthias
 
Hi Matthias,

also ich hab einmal auf den Quellcode gesehen und hab den üblichen Fehler der PC-Programmierer entdeckt ... ;)
Ein Mikrocontroller ist KEIN PC ! Du mußt nicht nur ein Programm schreiben sondern dein gesamtes Betriebssystem.
Was macht Windows wenn du Word schließt ? Ist der PC danach aus ? Nein. Also warum programmierst du es dann so ?

Du mußt im Mikrocontroller dein BIOS (die Hardwareeinstellungen), deine Treiber (die Bibliotheken für LCD, ...), dein Betriebssystem (deine Hauptschleife) und deine Anwendungen (die Subroutinen) schreiben. So könnte man es ganz grob erklären.

Du hast da als Hauptprogramm irgendwas mit GOSUB und so geschrieben. Dein eigentliches Hauptprogramm müßte aber die Mainloop (Do...Loop) sein die auf ewig durchläuft. Von dort aus wird in die einzelnen Bereiche für die Funktionen die du ausführen möchtest verzweigt.

Ich würde mal sagen das dieses Programm erstmal seziert werden und danach wie Frankensteins Monster neu zusammengebaut werden muß ;)

Gruß
Dino
 
jaaaa hmmm...., na dann - auf ein neues

hab ja jetzt urlaub, vielleicht kommt mir da noch nen Geißtesblitz :D.
Aber hast recht sah für mich auch schon merkwürdig aus mit den ganzen Gosubs, mal davon abgesehen das es bis auf den Sprung super funktioniert.

Ist es sinnvoll diese State Maschine für so eine kleine Menüstrucktur zu verwenden?

Gruss
Matthias
 
Hallo Matthias!

Ich habe mir vorhin mal den Spaß gemacht und dein Programm durch den Simulator gejagt.....

Sei bitte so nett und verwende die Software niemals für eine echte Maschine!
Wenn ich das beim Überfliegen und Ausprobieren richtig gesehen habe, wird sich dein Programm "verselbstständigen"!
Du springst munter mit den GOSUB`s hin und her, kommst aber nicht zum Ende (bzw. zum RETURN zurück)!

Fazit....
Du bekommst permanent Speicherüberläufe und dein Programm bzw. die Maschine wird in relativ kurzer Zeit Dinge ausführen, die gar nicht sein dürften!


So hart das jetzt vielleicht auch klingt, aber du musst das gesamte Programm noch mal neu strukturieren und überarbeiten!
Speziell, wenn du damit wirklich eine echte Maschine mit Werkstücken betreiben möchtest!!!

Grüße,
Cassio
 
Hi Cassio,

das hab ich auch schon bemerkt, aber das ist nur im swSimulator so, weil ich vergessen habe einige zustands abfragen den pegel zu invertieren, hatte die hardware mit dioden und schalter (real)simuliert - ging gut muss mich nur nochmal hinsetzen und lernen wie man geziehlt einen eingang abfragt ohne wartezeiten(mit interupts hab ich auch schon gemacht aber nicht in verbindung mit nem kompletten Programm.

Die schalter des simulators lassen sich auch zu langsam bedienen und dafür ist die waitms 100 bzw 250 zu kurz.

Jedes Gosub hat sein Return und aus den Schleifen gehts nur mit einem Return raus, ausser bei Goto 0 das sollte aber einem Power_On_Reset gleichen damit wäre der Stack auch wieder Jungfräulich. (so gelesen im I-Net)
Und natürlich der versuch mit "Goto Klemm:" da gibs dann irgendwann nen überlauf( aber auch unwahrscheinlich das jemand das programm 40 mal wiederholt)

Aber mir gefällts eh nicht ich versuchs nochmal;)

Achso zu der "Maschine" eher Maschinchenchen - Platienen Bohren oder ähnliches also ich tu mir da nicht wirklich weh :D
Gruss
Matthias
 
Hallo Matthias!

Nun ja..... das wird nicht nur im Simulator so sein! :wink:


Schau z.B. mal hier:
Code:
[B][COLOR="#FF0000"]Grundstellung:[/COLOR][/B]                                              ' Alle Ausgänge werden auf 0 gesetzt(Grundstellung)
    Ma = 0
    Z1 = 0
    Z2 = 0
    Z3 = 0

     Waitms 500                                             ' wird noch angepasst Aktionszeit der Zylinder oder Motore(hab mich noch nicht entschieden)

      If Pind = &H70 And Pinb = &HFF Or Pind = &H60 And Pinb = &HFF Then       ' Abfragen der Eingänge alle eingänge sollen nicht betätigt also High-Pegel haben

        Upperline : Lcd "  Grundstellung   "                ' ausser Pind.7(z3h in Grundstellung betätigt)muss Low-Pegel haben und bei Pind.4 ist der Pegel egal (drehzahlmessung)
        Lowerline : Lcd "       ok         "                ' ausgabe auf Display
      Return

      Else
       Upperline : Lcd "Fehler B" ; Bin(pinb)               ' zeigt port b und d im LCD an zur Fehlersuche oder was auch immer
       Lowerline : Lcd "       D" ; Bin(pind)
       Waitms 250
      End If

[B][COLOR="#FF0000"]  Gosub Grundstellung[/COLOR][/B]
    Return

Bei einem Fehler an den Portpins führst du innerhalb weniger Millisekunden zig GOSUB`s aus.....
ohne jemals zurück zu kehren.
Das geht nun mal auf Dauer nicht gut!


Fang lieber noch mal von vorne an.
Denn wenn du den jetzigen Code umbauen möchtest, geht das meistens in die Hose. :wink:

Grüße und viel Spaß mit dem Maschinchen :)
Cassio
 
Sorry du hast recht,wie Peinlich, da unten hab ich lang nicht mehr hingesehen. Danke....
Hab ich eh schon gelöscht, alle festplatten vom Hauptrechner ab und mit Laptop im Koffer und Morgen gehts im Urlaub weiter :D

gruss
Matthias
 
Hi Matthias,

das Problem an den Stack-Überläufen wegen der Gosubs ist leider das man das eventuell zuerst garnicht merkt. Man wundert sich nur das auf der realen Maschine ab und zu irgendwas "komisches" passiert und danach wieder alles normal ist. Oder der ganze Controller frißt sich immer nach ner viertel Stunde fest und nix geht mehr. Stack-Überläufe sind echt üble Fehler wo man teilweise tagelang suchen kann oder nur durch nen blöden Zufall die Fehlerquelle findet.

Genauso schön zu finden sind Interrupts die sich gegenseitig beharken ;)

Wenn man dann nicht genug Erfahrung hat ist man als Anfänger meißt verraten und verkauft.

Gruß
Dino
 
Hi Dino und Cassio,

also.... ich hab jetzt wirklich lang überlegt. Klar ist das das nix war mit dem ersten entwurf aber ich finde keine passende Struktur für das was ich da vorhab.

Das do loop in dem Hauptprog brauch ich nicht, denn es soll ja nicht wiederholt werden ausser ich wünsche es in einem Menüpunkt.
Abgefragt werden nur drei Tasten deren Aufgabe dem entspricht was in der zweiten Zeile des LCD steht (dieTasten sind unterm LCD Links , Mitte , Rechts = Taste1 , Taste2 , Taste3)
Und das ganze Programm hat auch nix weiter zu tun als auf eine der drei Tasten zu warten bis es den nächsten Schritt macht und am Ende letztendlich eine voreingestellte Anzahl von Wiederholungen der ansteuerung der Maschine macht.

Nun weiss ich nicht weiter, war es grundlegend Falsch jeden Menüabschnitt in eine Unterroutine zu packen? Wenn ich alles ins Hauptprogramm schreibe dann heißt´s wieder Spagetticode.
Irgendwie fehlt mir da ein ansatz um nicht den gleichen Unsinn zu machen wie zuvor

Danke

gruss
Matthias
 
Hi
Ich hab zwar keine Ahnung von Bascióm, aber das hier
Das do loop in dem Hauptprog brauch ich nicht, denn es soll ja nicht wiederholt werden ausser ich wünsche es in einem Menüpunkt.
brauchst du auf jeden Fall. Der Controller arbeitet ja Zeile für Zeile ab, inddem sein Programmcounter (PC) Befehl für Befehl adressiert und zur Ausführung in den Befehlsdecoder packt. Hast du ein Do ... Loop, dann rotiert er "nur " in diesem Bereich.
Läßt du es weg, "rennt" er durch alle Adressen und fängt dann wieder von vorn an. Also auch Initialisierungen usw. Das Do ... Loop hat nix mit "Menüpunkten" zu tun. Es kann natürlich welche geben... aber dem µC ist es egal, ob Menüpunktverzweigung oder Zahlenaddition... ( Vergleich kann wieer zum Menüpunkt führen)
Auch wenn es vielleicht "altklug" ist, ein Assembler öffnet da wesentlich mehr Verständnis für die Arbeitsweise eines Controllers. Solange BASOM funktioniert, klar, geht schneller und ist (erlernbar). Trifft man aber mal ins Schwarze, und das kommt garantiert, kann es schon schwierig bei der Fehlersuche werden.
Assembler ist (schwer) erlernbar... ist häufig eine Fehleinschätzung, zumindest was das "schwer" angeht.
Bei Assembler weiß man, wenn etwas nicht läuft, hat man es selbst verbockt. Da ist kein Bug in der Programmiersoftware oder so.
Aber auch assemblerprogramme rotieren (immer) in einer Loop ....
Gruß oldmax
 
Hallo Matthias!

Kommt mir so vor, als hättest du eine falsche Vorstellung von einer DO-LOOP Hauptschleife. :hmmmm:

Letztlich hast du es ja selber schon geschrieben.....
Du hast drei Taster und dein Programm wartet (läuft in einer Schleife) bis einer der Taster gedrückt wurde.
Jenachdem welcher Taster gedrückt wurde wird etwas bestimmtes ausgeführt und danach kehrt das Programm zur Haupt-DO-LOOP Schleife wieder zurück.

Das wäre der Ansatz für ein ganz normales Programm.

Wie kurz oder aufwendig du eine Subroutine gestaltest hängt natürlich vom Verwendungszweck ab und wie die Subroutine aufgerufen wurde.
Rufst du eine Sub per Interrupt auf, sollte die Sub so kurz wie möglich sein.
Du wirst auch wesentlich mehr als drei Subroutinen benötigen :wink: , weil z.B. dein Display nur dann angesteuert werden muss, wenn sich die Anzeige geändert hat.


Denk halt noch mal über die Funktionsweise und den Ablauf nach, dann platzt der Knoten meistens von allein.

Grüße,
Cassio
 
Hi
Ich hab zwar keine Ahnung von Bascióm, aber das hier

brauchst du auf jeden Fall...
Nein, nicht in jedem. Wenn das Programm WIRKLICH nur einmal durchlaufen werden soll, kann man darauf verzichten, und das Programm mit der Bascom-Instruktion "end" "beenden".
Natürlich übersetzt Bascom das dann auch nur in eine leere do-loop-Endlosschleife, nach vorheriger Deaktivierung der Interrupts (CLI).
Soll eine interruptbasierte Reaktivierung des Programmes nötig sein, kann man mit "stop" eine leere Endlosschleife ohne Deaktivierung der Interrupts einbauen. Allerdings würde ich den Controller dann eigentlich gern schlafen schicken - in ASM steht bei mir dann in der Schleife üblichrweise ein "sleep".
 
Hi
Na, auch ich kann nur lernen.. ok, hab's verstanden. Beruhigt mich aber doch, das ein END bei BASCOM nicht einfach den Takt am Controller ausknipst. :sarcastic:
Gruß oldmax
 
Hi,

Nein, nicht in jedem. Wenn das Programm WIRKLICH nur einmal durchlaufen werden soll, kann man darauf verzichten, und das Programm mit der Bascom-Instruktion "end" "beenden".
Natürlich übersetzt Bascom das dann auch nur in eine leere do-loop-Endlosschleife, nach vorheriger Deaktivierung der Interrupts (CLI).
dann kann man für den nächsten Durchlauf aber nur den Strom ab/anschalten oder einen Reset-Taster drücken. Finde ich suboptimal und nicht wirklich gut für die Technikerehre :p :rolleyes: Sowas ist unsauber.

Also ich würde die Initialisierung durchlaufen und dann in einer Do-Loop auf den Starttaster warten. Dann kann man zB eine Sub anspringen (Gosub) aus der man dann subs für die jeweils einzelnen Arbeitsabschnitte anspringt (Gosub). Das wäre dann schön modular und leicht zu verändern ohne den ganzen ""Klops" anpacken zu müssen.

Man könnte es zB auch in der Hauptschleife durch einen Zähler und einer Select/Case als Art Schrittschaltwerk programmieren. Aus der Select/Case werden wieder die einzelnen Subs für die Arbeitsabschnitte angesprungen (Gosub).

Das ist auf jeden Fall alles sauberer als dieses Konstrukt was bisher existiert.

Grundsätzlich sollte man den Prozessor nach der Initialisierung der Hardware und Ports in oder durch die Mainloop laufen lassen. Aus der führt man dann die Aufgaben aus und kehrt danach in diese Mainloop zurück. Das ist die beste Lösung wenn man das ganze eventuell mal ändern oder erweitern möchte.

Ja, ich weiß, man kann alles mögliche programmieren. Aber dann muß man sich Notfalls auch durch einen Knoten von Spaghetti-Code quälen der mit GOTOs nur so zugekleistert ist und an den sich nach einem Monat niemand mehr rantraut.

Gruß
Dino
 
Hi,

Danke euch allen. Das mit dem Select case ist gerade in arbeit und auch da bin ich jetzt dran die Anzeige nur dann zu aktualisieren wenn sich auch wirklich der Inhalt ändert.
Ich werde wieder Berichten wenn ich mit meiner Arbeit zufrieden bin. :D

gruss
Matthias
 
...dann kann man für den nächsten Durchlauf aber nur den Strom ab/anschalten oder einen Reset-Taster drücken...
Das wäre dann auch nicht mehr WIRKLICH einmal
... nicht wirklich gut für die Technikerehre :p :rolleyes: Sowas ist unsauber...
weswegen ich es auch so nicht machen würde - wie gesagt, ich schicke den Controller in der loop üblicherweise auch noch in einen geeigneten sleep-mode.
Ich wollte nur den Absolutismus (;)) aus oldmax's Aussage ... ähm ... korrigieren (vom Assembler her gesehen hatte er ja recht - end und stop sind Endlosschleifen, aber)
wenn man schon in einer Hochsprache programmiert, dann sollte man (wenn möglich) auch die entsprechenden Befehle von dort verwenden. Und wenn man dann eine leere Endlosschleife braucht solllte man eben mit IRQs stop, und ohne end benutzen.

Aber hier konkret gehts natürlich um eine "gefüllte" Endlosschleife zur Abarbeitung/Reaktion auf unterschiedliche(r) Zustände.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)