Forum: Mikrocontroller und Digitale Elektronik Bascom- Fehlerausgabe bei Programmierung


von Jannis P. (jannis94)


Lesenswert?

Hallo,
bekomme folgende Fehlermeldungen:
if then expected
interrupt needs return
end if expected
--------------------
Eine weitere Frage wäre noch, funktioniert das so mit and und wenn 2 
elseif Fälle zutreffen, werden dann auch beide aktiviert?
Mfg Jannis
1
[avrasm]AVR-Assembler-Code
$regfile = "m32def.dat"

Disable Jtag
Config Adc = Single , Prescaler = Auto

Start Adc

Dim Sensor As Word
Dim X As Integer
Dim A As Integer
Dim B As Integer
Dim C As Integer
Dim D As Integer
Dim E As Integer
Dim F As Integer
Dim G As Integer
Dim H As Integer
Dim I As Integer
Dim J As Integer
Dim K As Integer
Dim L As Integer
Dim M As Integer
Dim N As Integer
Dim O As Integer
Dim P As Integer
Dim Q As Integer
Dim R As Integer
Dim S As Integer
Dim T As Integer
Dim U As Integer
Dim V As Integer
Dim W As Integer
Dim Y As Integer
Dim Z As Integer
Dim Aa As Integer
Dim Bb As Integer
Dim Cc As Integer
Dim Dd As Integer
Dim Ee As Integer
Dim Ff As Integer
Dim Gg As Integer
Dim Hh As Integer
Dim Ii As Integer
Dim Jj As Integer
Dim Kk As Integer
Dim Ll As Integer
Dim Mm As Integer
Dim Nn As Integer
Dim Oo As Integer
Dim Pp As Integer
Dim Qq As Integer

Dim Kl As Integer

Kl = 1
X = 0

 A = 0
 B = 0
 C = 0
 D = 0
 E = 0
 F = 0
 G = 0
 H = 0
 I = 0
 J = 0
 K = 0
 L = 0
 M = 0
 N = 0
 O = 0
 P = 0
 Q = 0
 R = 0
 S = 0
 T = 0
 U = 0
 V = 0
 W = 0
 Y = 0
 Z = 0
 Aa = 0
 Bb = 0
 Cc = 0
 Dd = 0
 Ee = 0
 Ff = 0
 Gg = 0
 Hh = 0
 Ii = 0
 Jj = 0
 Kk = 0
 Ll = 0
 Mm = 0
 Nn = 0
 Oo = 0
 Pp = 0
 Qq = 0



Config Portc = Output
Config Portb = Output
Config Portd = Output



Config Timer0 = Timer , Prescale = 8
Enable Timer0
On Timer0 Isrtimer0
Enable Interrupts

Enable Timer0

    Do
      Sensor = Getadc(7)
      If Sensor < 500 Then
         Goto Main


      End If

    Loop

    End


    Main:
       Do
       If X = 0 Then
        Sensor = Getadc(7)
        And Sensor < 500 Then
         Incr X
         Portc.6 = 1
         Portc.7 = 0
         Goto Rot

         Elseif X = 1 Then
         Sensor = Getadc(7)
         and Sensor < 500 Then
         X = X - 1
         Portc.7 = 1
         Portc.6 = 0
         Goto Rot

         End If
         Loop
         End


     Rot:
     Do
      Sensor = Getadc(0)

      If Sensor > 0 Then

       Select Case Sensor

         Case Is < 25                                       ' Taster1
         If A = 0 Then
         Incr A
         Elseif A = 1 And B = 0 Then
         Incr B
         Elseif B = 1 And C = 0 Then
         Incr C
         Elseif C = 1 And D = 0 Then
         Incr D
         Elseif D = 1 And E = 0 Then
         Incr E
         Elseif E = 1 And F = 0 Then
         Incr F
          Goto Main

         Case Is < 175                                      'Taster 2
         If G = 0 Then
         Incr G
         Elseif G = 1 And H = 0 Then
         Incr H
         Elseif H = 1 And I = 0 Then
         Incr I
         Elseif I = 1 And J = 0 Then
         Incr J
         Elseif J = 1 And K = 0 Then
         Incr K
         Elseif K = 1 And L = 0 Then
         Incr L
         Goto Main

         Case Is < 325                                      'Taster 3
         If M = 0 Then
         Incr M
         Elseif M = 1 And N = 0 Then
         Incr N
         Elseif N = 1 And O = 0 Then
         Incr O
         Elseif O = 1 And P = 0 Then
         Incr P
         Elseif P = 1 And Q = 0 Then
         Incr Q
         Elseif Q = 1 And R = 0 Then
         Incr R
         Goto Main

         Case Is < 450                                      'Taster 4
         If S = 0 Then
         Incr S
         Elseif S = 1 And T = 0 Then
         Incr T
         Elseif T = 1 And U = 0 Then
         Incr U
         Elseif U = 1 And V = 0 Then
         Incr V
         Elseif V = 1 And W = 0 Then
         Incr W
         Elseif W = 1 And Y = 0 Then
         Incr Y
         Goto Main

         Case Is < 600                                      'Taster 5
         If Z = 0 Then
         Incr Z
         Elseif Z = 1 And Aa = 0 Then
         Incr Aa
         Elseif Aa = 1 And Bb = 0 Then
         Incr Bb
         Elseif Bb = 1 And Cc = 0 Then
         Incr Cc
         Elseif Cc = 1 And Dd = 0 Then
         Incr Dd
         Elseif Dd = 1 And Ee = 0 Then
         Incr Ee
         Goto Main

         Case Is < 750                                      'Taster 6
         If Ff = 0 Then
         Incr Ff
         Elseif Ff = 1 And Gg = 0 Then
         Incr Gg
         Elseif Gg = 1 And Hh = 0 Then
         Incr Hh
         Elseif Hh = 1 And Ii = 0 Then
         Incr Ii
         Elseif Ii = 1 And Jj = 0 Then
         Incr Jj
         Elseif Jj = 1 And Kk = 0 Then
         Incr Kk
         Goto Main

         Case Is < 900                                      'Taster 7
         If Ll = 0 Then
         Incr Ll
         Elseif Ll = 1 And Mm = 0 Then
         Incr Mm
         Elseif Mm = 1 And Nn = 0 Then
         Incr Nn
         Elseif Nn = 1 And Oo = 0 Then
         Incr Oo
         Elseif Oo = 1 And Pp = 0 Then
         Incr Pp
         Elseif Pp = 1 And Qq = 0 Then
         Incr Qq
         Goto Main


         End Select

         End If


    Loop
    End




  Isrtimer0:

    If A = 1 Then
    Set Portc.5
    Set Portd.6
    Reset Portc.5
    Reset Portd.6

    Elseif B = 1 Then
    Set Portc.4
    Set Portd.6
    Reset Portc.4
    Reset Portd.6

    Elseif C = 1 Then
    Set Portc.3
    Set Portd.6
    Reset Portc.3
    Reset Portd.6

    Elseif D = 1 Then
    Set Portc.2
    Set Portd.6
    Reset Portc.2
    Reset Portd.6

    Elseif E = 1 Then
    Set Portc.1
    Set Portd.6
    Reset Portc.1
    Reset Portd.6

    Elseif F = 1 Then
    Set Portc.0
    Set Portd.6
    Reset Portc.0
    Reset Portd.6

    Elseif G = 1 Then
    Set Portc.5
    Set Portd.5
    Reset Portc.5
    Reset Portd.5

    Elseif H = 1 Then
    Set Portc.4
    Set Portd.5
    Reset Portc.4
    Reset Portd.5

    Elseif I = 1 Then
    Set Portc.3
    Set Portd.5
    Reset Portc.3
    Reset Portd.5

    Elseif J = 1 Then
    Set Portc.2
    Set Portd.5
    Reset Portc.2
    Reset Portd.5

    Elseif K = 1 Then
    Set Portc.1
    Set Portd.5
    Reset Portc.1
    Reset Portd.5

    Elseif L = 1 Then
    Set Portc.0
    Set Portd.5
    Reset Portc.0
    Reset Portd.5



         Return
 [/avrasm]

von Udo S. (urschmitt)


Lesenswert?

Jannis P. schrieb:
> funktioniert das so mit and und wenn 2 elseif Fälle zutreffen
Verstehst du diesen Satz selbst?

Jannis P. schrieb:
> interrupt needs return
ich kenne jetzt BASCOM nicht aber auf was würde dieser Fehler wohl 
hindeuten?

Jannis P. schrieb:
> end if expected
Dito, auf was deutet diese Fehlermeldung hin


Allgemein: Es ist schon schade, daß es in unserem Alphabet nur 26 
Buchstaben gibt, oder? Das schränkt die mögliche Anzahl von 
Variablennamen so eklig ein :-)

Viel Erfolg

von Jannis P. (jannis94)


Lesenswert?

Danke erst mal für deine Hilfe.
Die Frage ist ob bei "and" beides zutrifft. Habe da schon Erfahrungen 
gemacht, dass es nicht funktioniert. Bei "else if" dasselbe. Wenn 2 
elseifs zutreffen, werden dann beide ausgeführt?
Zu den Fehlern:
Ich habe den Code schon mehrmals überprüft und der return steht doch 
unten ganz am Ende oder? Warscheinlich bin ich blos zu blöd dafür :(
Mfg
Jannis

von Karl H. (kbuchegg)


Lesenswert?

Die kurze Antwort ist

Nein. So funktioniert das nicht.

Du kannst dir nicht deine eigene Syntax ausdenken und dann hoffen, dass 
der Compiler das daraus macht was du dir vorstellst.

Die dir aufs Auge gedrückte Syntax für if lautet

   if   Bedingung    then

      anweisungen

   else if  andere Bedingung then

      anweisungen

   end if


wobei du beliebig viele else if haben kannst

Du kannst eine Bedingung aus mehreren Teilen zusammensetzen, wobei du 
die Teilbedingung zum Bleistift mit einem AND miteinander verknüpfst. 
Diese zusammengesetzte Bedingung ist aber wieder einfach nur eine 
Bedingung und nicht mehr.

von Karl H. (kbuchegg)


Lesenswert?

> Wenn 2
elseifs zutreffen, werden dann beide ausgeführt?

Nein.
Denn 'else' bedeutet andernfalls

Wenn deine Anweisungen lauten

  wenn eine geometrische Figur 4 Ecken hat

    dann ist es ein Rechteck

  andernfalls wenn es ....


dann ist mit der ersten zutreffenden Bedingung die Sache erledigt. Denn 
dann gibt es kein 'andernfalls' mehr. Entweder die Bedingung trifft zu, 
dann haben sich alle weiteren 'andernfalls' automatisch erledigt, oder 
sie trifft nicht zu und in diesem Fall wird die nächste 
'andernfalls'-Bedingung untersucht.

von Horst III (Gast)


Lesenswert?

Jannis P. schrieb:
> Ich habe den Code schon mehrmals überprüft und der return steht doch
> unten ganz am Ende oder?

Die isrtimer0 beginnt mit einer IF Abfrage. Der Compiler "denkt", daß 
das return noch innerhalb dieser Abfrage, weil sie noch nicht 
abgeschlossen ist. Womit schließt man die IF Abfrage ab?

von Jannis P. (jannis94)


Lesenswert?

Erstmal vielen Dank für Ihre Hilfe. Jetzt habe ich verstanden, dass ich 
es so nicht machen kann. Des Weiteren möchte ich Ihnen für ihre geduld 
danken.
Ich bin noch relativer Anfänger in Bascom und deshalb nicht so gut.
-------------------------
Isrtimer0:



 If A = 1 Then
    Set Portc.5
    Set Portd.6
    Reset Portc.5
    Reset Portd.6

    Elseif B = 1 Then
    Set Portc.4
    Set Portd.6
    Reset Portc.4
    Reset Portd.6

    Elseif C = 1 Then
    Set Portc.3
    Set Portd.6
    Reset Portc.3
    Reset Portd.6


    return
-----------------------------
Könnten sie mir eventuell obwohl ich sie damit nerve, zeigen wie man es 
so macht, dass wenn diese Bedingungen zutreffen auch alle aktiviert 
werden.
Also z.B.:
Nur A und C
Nur B und A
Oder Alle.
Ich kann ja nicht sagen if c = 1 and A = 1 then... Es könnte ja z.B. 
sein das nur A leuchten soll. Des Weiteren würde es auch sehr viel Code 
werden oder? Suche da eine relativ effiziente Lösung.
Vielen Dank für ihre Hilfe.
Mfg
Jannis

von Jannis P. (jannis94)


Lesenswert?

mit:
end if
return
Allerdings bleibt der Fehler dennoch enthalten.

von Horst III (Gast)


Lesenswert?

Jannis P. schrieb:
> mit:
> end if
> return
> Allerdings bleibt der Fehler dennoch enthalten.

Dann mußt du die anderen Abfragen auch alle überprüfen, ob sie mit "end 
if" abgeschlossen sind. Wenn ich das richtig sehe, fehlen da mehrere. 
Denke, vor allem vor den verschiedenen CASE IS. Du brauchst soviele END 
IF wie IF aufgemacht sind.

von Jannis P. (jannis94)


Lesenswert?

Vielen Dank an euch alle :D
Habe jetzt nur noch 2 Probleme mit denen ich euch nerven kann:
1. Die Bascom-Demo ist vollgelaufen ;)
2. Das Problem mit der Timer Interrupt-Schleife.
Es soll ja wie weiter oben beschrieben so sein, dass wenn ein oder 
mehrere Fälle zutreffen auch beides angeht.
if A = 1 and C = 1 then..
wäre dann glaube ich Quatsch.

von Karl H. (kbuchegg)


Lesenswert?

Jannis P. schrieb:

> Es soll ja wie weiter oben beschrieben so sein, dass wenn ein oder
> mehrere Fälle zutreffen auch beides angeht.

> if A = 1 and C = 1 then..
> wäre dann glaube ich Quatsch.

Was jetzt.

  wenn eine Bedingung zutrifft   ODER
  wenn eine andere Bedingung zutrifft

    ->  mach was


oder willst du

  wenn eine Bedingung zutrifft   UND
  wenn eine andere Bedingung zutrifft

    -> mach was


Du musst dich entscheiden, was du willst.
Ein UND ist kein ODER.
Bei einem UND müssen ALLE Teilbedingungen zutreffen, damit die komplette 
Aussage wahr ist. Bei einem ODER reicht es, wenn EINE Teilbedingung wahr 
ist, damit die komplette Bedingung als wahr angesehen wird.

  wenn eine Figur 4 Ecken hat  UND
  wenn diese Figur 4 rechte Winkel hat

     dann handelt es sich um ein Rechteck


beides muss erfüllt sein, damit man von einem Rechteck spricht. Eine 
Figur mit 4 Ecken aber nicht 4 rechten Winkeln ist ein Trapez und kein 
Rechteck


  wenn die Sonne aufgeht    ODER
  wenn die Sonne untergeht

      dann kann sich der Himmel rot färben

es reicht wenn eines von beiden der Fall ist. Es können auch beide 
Teilbedingungen zutreffen (ok, nicht in diesem konkreten Fall, aber 
grundsätzlich). Aber mindestens eine der Teilbedingungen muss zutreffen.

von Horst III (Gast)


Lesenswert?

Jannis P. schrieb:
> 1. Die Bascom-Demo ist vollgelaufen ;)

Die Demo Version ist halt begrenzt - wie auch der µC Speicher. Wozu sind 
denn die ganzen Variablen. Die sind doch alle auf 0 oder sehe ich das 
falsch. Vielleicht brauchst du da nur Byte Variable oder sogar nur Bit 
Variablen abgesehen von denen für den ADC. Damit läßt sich schon einiges 
an Platz sparen.

von Karl H. (kbuchegg)


Lesenswert?

>  If A = 1 Then
>    Set Portc.5
>    Set Portd.6
>    Reset Portc.5
>    Reset Portd.6
>
>    Elseif B = 1 Then
>    Set Portc.4
>    Set Portd.6
>    Reset Portc.4
>    Reset Portd.6
>
>    Elseif C = 1 Then
>    Set Portc.3
>    Set Portd.6
>    Reset Portc.3
>    Reset Portd.6


fang an deinen Code KORREKT einzurücken! Das Elseif steht genau unter 
dem if. UNd das End if steht auch genau unter dem if. UNd erst dann, 
nachdem das if mit einem end if abgeschlossen wurde, kommt der return

  If A = 1 Then
    Set Portc.5
    Set Portd.6
    Reset Portc.5
    Reset Portd.6

  Elseif B = 1 Then
    Set Portc.4
    Set Portd.6
    Reset Portc.4
    Reset Portd.6

  Elseif C = 1 Then
    Set Portc.3
    Set Portd.6
    Reset Portc.3
    Reset Portd.6
  End if

  Return

wenn du wissen willst, zu welchem if ein End  if gehört, dann gehst du 
in genau der gleichen Spalte nach oben und findest den if (bzw. elseif) 
in dieser Spalte. Wenn du das nicht kannst, dann ist deine Einrückung 
schiesse und gehört verbessert
1
   if A = 1 then
2
3
     if B = 5 then
4
5
       if C = 8 then
6
         mach was
7
       End if
8
       mach noch was
9
10
     Elseif B = 6 then
11
       was ganz anderes
12
13
     End if
14
   End if

Anhand der Einrückung ist genau erkennbar, was zu wem gehört. Wenn ich 
das zu einem if gehörende End if suche, dann gehe ich in genau der 
Spalte vom if mit dem Cursor nach unten, bis ich wieder auf eine Zeile 
stosse, die in dieser Spalte beginnt. Das kann dann nur ein Elseif sein 
oder ein End if.
Alle Zeilen die dazwischen liegen, sind diejenigen Zeilen die jeweils 
ausgeführt werden, wenn die Bedingung vom if (bzw. elseif) zutrifft. 
Sieh dir mein Beispiel an - die logische Struktur - die Klammerung und 
Gruppierung der Anweisungen ist anhand der Einrückung ablesbar
1
   if A = 1 then                 -----------------+
2
                                                  |
3
     if B = 5 then               -------------+   |
4
                                              |   |
5
       if C = 8 then             --------+    |   |
6
         mach was                        |    |   |
7
       End if                    --------+    |   |
8
       mach noch was                          |   |
9
                                              |   |
10
     Elseif B = 6 then           -------------+   |
11
       was ganz anderes                       |   |
12
                                              |   |
13
     End if                      -------------+   |
14
   End if                        -----------------+

von mira (Gast)


Lesenswert?

ich dacht Freitags kommen immer die Bascom-Amüsements. Sind wir jetzt 
schon zur Wochenmitte vorgerückt?

Fragen über Fragen .... :-)

von Horst III (Gast)


Lesenswert?

mira schrieb:
> ich dacht Freitags kommen immer die Bascom-Amüsements. Sind wir jetzt
> schon zur Wochenmitte vorgerückt?

Leider muß man sonst über ernste Probleme nachdenken.

von Chr. M. (snowfly)


Lesenswert?

Jannis P. schrieb:
> 1. Die Bascom-Demo ist vollgelaufen ;)

Da hast du ja auch ein Monster geschaffen...
Ich würde vorschlagen klopf das komplett in die Tonne und überleg dir 
ein brauchbares Konzept.

Und als allererstes: Schreib 1000x an die Tafel "Ich soll kein GOTO 
benutzen" :)


Wenn du mal in ein paar Worten beschreibst was das Programm überhaupt 
machen soll kommen vielleicht noch ein paar brauchbare Tips.

von Karl H. (kbuchegg)


Lesenswert?

Chr. Messener schrieb:

> Und als allererstes: Schreib 1000x an die Tafel "Ich soll kein GOTO
> benutzen" :)

Tatsächlich.
Die GOTO hatte ich in dem Sauhaufen noch gar nicht gesehen.

von Joe (Gast)


Lesenswert?

hat es denn noch keiner gesehen?

      Case Is < 450                                      'Taster 4
         If S = 0 Then
         Incr S
         Elseif S = 1 And T = 0 Then
         Incr T
         Elseif T = 1 And U = 0 Then
         Incr U
         Elseif U = 1 And V = 0 Then
         Incr V
         Elseif V = 1 And W = 0 Then
         Incr W
         Elseif W = 1 And Y = 0 Then
         Incr Y
         Goto Main

bei jedem Case
            If ...

fehlt das End If

von Jannis P. (jannis94)


Lesenswert?

Chr. Messener schrieb:
> Jannis P. schrieb:
>> 1. Die Bascom-Demo ist vollgelaufen ;)
>
> Da hast du ja auch ein Monster geschaffen...
> Ich würde vorschlagen klopf das komplett in die Tonne und überleg dir
> ein brauchbares Konzept.
>
> Und als allererstes: Schreib 1000x an die Tafel "Ich soll kein GOTO
> benutzen" :)
>
>
> Wenn du mal in ein paar Worten beschreibst was das Programm überhaupt
> machen soll kommen vielleicht noch ein paar brauchbare Tips.

Das Programm (im Timer) soll, wenn z.B. die Variable A den Wert 1 
zugewiesen bekommt dafür sorgen, dass durch das 1 in der Variable z.B. 
Portc.5 auf 1 gesetzt wird. Wenn B z.B. auch noch den Wert 1 hat sollen 
beide so schnell geschaltet werden, dass z.B. bei einer Led, das 
Wechseln so schnell geht, dass das menschliche Auge nicht mitkommt. Das 
Problem ist, ich weiß nicht wie ich das in Bascom schreiben soll. Es 
könnte ja sein das A = 1 ist aber B = 0 ist und C = 1, wenn das der Fall 
ist soll er B ignorieren und bei c weitermachen.
Wenn b allerdings = 1 ist soll b nicht ignoriert werden.
Hiernochmal das Teilprogramm um das es geht. (Ja ich weiß es 
funktioniert so nicht und ist grottenschlecht :( ).
Mfg Jannis
$regfile = "m32def.dat"                                     ' von Jannis
Disable Jtag
Config Adc = Single , Prescaler = Auto
Start Adc

Dim A As Integer                           'rote Led unten links
Dim B As Integer
Dim C As Integer
Dim D As Integer
Dim E As Integer
Dim F As Integer
Dim G As Integer
Dim H As Integer
Dim I As Integer
Dim J As Integer
Dim K As Integer
Dim L As Integer
                                         'rote led oben rechts
Dim Ab As Integer                        'grüne led unten links
Dim Ac As Integer
Dim Ad As Integer
Dim Ae As Integer
Dim Af As Integer
Dim Ag As Integer
Dim Ba As Integer
Dim Bc As Integer
Dim Bd As Integer
Dim Be As Integer
Dim Bf As Integer
Dim Bg As Integer

 A = 0                  'Das sind die Variablen, die sagen, welche Leds
 B = 0                  'leuchten sollen.
 C = 0
 D = 0
 E = 0
 F = 0
 G = 0
 H = 0
 I = 0
 J = 0
 K = 0
 L = 0


 Ab = 0
 Ac = 0
 Ad = 0
 Ae = 0
 Af = 0
 Ag = 0
 Ba = 0
 Bc = 0
 Bd = 0
 Be = 0
 Bf = 0
 Bg = 0
Config Portc = Output                        ' Outputausgänge
Config Portb = Output
Config Portd = Output

Config Timer0 = Timer , Prescale = 8                  'Timeraktivierung
Enable Timer0
On Timer0 Isrtimer0
Enable Interrupts

On Timer0

 ' timer Interrupt soll alle Leds, die Leuchten sollen am laufen halten

  Isrtimer0:
   'rot
    If A = 1 Then                                           ' 1. Spalte
    Set Portc.5
    Set Portd.6
    waitms 5
    Reset Portc.5
    Reset Portd.6

    Elseif B = 1 Then
    Set Portc.4
    Set Portd.6
    waitms 5
    Reset Portc.4
    Reset Portd.6

    Elseif C = 1 Then
    Set Portc.3
    Set Portd.6
    waitms 5
    Reset Portc.3
    Reset Portd.6

    Elseif D = 1 Then
    Set Portc.2
    Set Portd.6
    waitms 5
    Reset Portc.2
    Reset Portd.6

    Elseif E = 1 Then
    Set Portc.1
    Set Portd.6
    waitms 5
    Reset Portc.1
    Reset Portd.6

    Elseif F = 1 Then
    Set Portc.0
    Set Portd.6
    waitms 5
    Reset Portc.0
    Reset Portd.6

    Elseif G = 1 Then                                       ' 2. Spalte
    Set Portc.5
    Set Portd.5
    waitms 5
    Reset Portc.5
    Reset Portd.5

    Elseif H = 1 Then
    Set Portc.4
    Set Portd.5
    waitms 5
    Reset Portc.4
    Reset Portd.5

    Elseif I = 1 Then
    Set Portc.3
    Set Portd.5
    waitms 5
    Reset Portc.3
    Reset Portd.5

    Elseif J = 1 Then
    Set Portc.2
    Set Portd.5
    waitms 5
    Reset Portc.2
    Reset Portd.5

    Elseif K = 1 Then
    Set Portc.1
    Set Portd.5
    waitms 5
    Reset Portc.1
    Reset Portd.5

    Elseif L = 1 Then
    Set Portc.0
    Set Portd.5
    waitms 5
    Reset Portc.0
    Reset Portd.5

    'gruen
     If Ab = 1 Then                                         '1. Spalte
    Set Portb.5
    Set Portd.6
    waitms 5
    Reset Portb.5
    Reset Portd.6

    Elseif Ac = 1 Then
    Set Portb.4
    Set Portd.6
    waitms 5
    Reset Portb.4
    Reset Portd.6

    Elseif Ad = 1 Then
    Set Portb.3
    Set Portd.6
    waitms 5
    Reset Portb.3
    Reset Portd.6

    Elseif Ae = 1 Then
    Set Portb.2
    Set Portd.6
    waitms 5
    Reset Portb.2
    Reset Portd.6

    Elseif Af = 1 Then
    Set Portb.1
    Set Portd.6
    waitms 5
    Reset Portb.1
    Reset Portd.6

    Elseif Ag = 1 Then
    Set Portb.0
    Set Portd.6
    waitms 5
    Reset Portb.0
    Reset Portd.6

    Elseif Ba = 1 Then                                      '2.Spalte
    Set Portb.5
    Set Portd.5
    waitms 5
    Reset Portb.5
    Reset Portd.5

    Elseif Bc = 1 Then
    Set Portb.4
    Set Portd.5
    waitms 5
    Reset Portb.4
    Reset Portd.5

    Elseif Bd = 1 Then
    Set Portb.3
    Set Portd.5
    waitms 5
    Reset Portb.3
    Reset Portd.5

    Elseif Be = 1 Then
    Set Portb.2
    Set Portd.5
    waitms 5
    Reset Portb.2
    Reset Portd.5

    Elseif Bf = 1 Then
    Set Portb.1
    Set Portd.5
    waitms 5
    Reset Portb.1
    Reset Portd.5

    Elseif Bg = 1 Then
    Set Portb.0
    Set Portd.5
    waitms 5
    Reset Portb.0
    Reset Portd.5

     End If
     End If

      Return

von Joe (Gast)


Lesenswert?

So klappt das Compile.

Aber die Logik erschließt sich mir nicht !!

Eine saubere Struktur ohne GOTO wäre Hilfreich !!


$regfile = "m32def.dat"
Disable Jtag
Config Adc = Single , Prescaler = Auto
Start Adc

Dim Sensor As Word
Dim X As Integer
Dim A As Integer
Dim B As Integer
Dim C As Integer
Dim D As Integer
Dim E As Integer
Dim F As Integer
Dim G As Integer
Dim H As Integer
Dim I As Integer
Dim J As Integer
Dim K As Integer
Dim L As Integer
Dim M As Integer
Dim N As Integer
Dim O As Integer
Dim P As Integer
Dim Q As Integer
Dim R As Integer
Dim S As Integer
Dim T As Integer
Dim U As Integer
Dim V As Integer
Dim W As Integer
Dim Y As Integer
Dim Z As Integer
Dim Aa As Integer
Dim Bb As Integer
Dim Cc As Integer
Dim Dd As Integer
Dim Ee As Integer
Dim Ff As Integer
Dim Gg As Integer
Dim Hh As Integer
Dim Ii As Integer
Dim Jj As Integer
Dim Kk As Integer
Dim Ll As Integer
Dim Mm As Integer
Dim Nn As Integer
Dim Oo As Integer
Dim Pp As Integer
Dim Qq As Integer

Dim Kl As Integer

Kl = 1
X = 0

 A = 0
 B = 0
 C = 0
 D = 0
 E = 0
 F = 0
 G = 0
 H = 0
 I = 0
 J = 0
 K = 0
 L = 0
 M = 0
 N = 0
 O = 0
 P = 0
 Q = 0
 R = 0
 S = 0
 T = 0
 U = 0
 V = 0
 W = 0
 Y = 0
 Z = 0
 Aa = 0
 Bb = 0
 Cc = 0
 Dd = 0
 Ee = 0
 Ff = 0
 Gg = 0
 Hh = 0
 Ii = 0
 Jj = 0
 Kk = 0
 Ll = 0
 Mm = 0
 Nn = 0
 Oo = 0
 Pp = 0
 Qq = 0



Config Portc = Output
Config Portb = Output
Config Portd = Output



Config Timer0 = Timer , Prescale = 8
Enable Timer0
On Timer0 Isrtimer0
Enable Interrupts

Enable Timer0

    Do
      Sensor = Getadc(7)
      If Sensor < 500 Then
         Goto Main


      End If

    Loop

    End


    Main:
     Do
       If X = 0 Then
        Sensor = Getadc(7)
  '==>      And Sensor < 500 Then
         Incr X
         Portc.6 = 1
         Portc.7 = 0
         Goto Rot

         Elseif X = 1 Then
         Sensor = Getadc(7)
'==>         and Sensor < 500 Then
         X = X - 1
         Portc.7 = 1
         Portc.6 = 0
         Goto Rot

         End If
      Loop
         End


     Rot:
 Do
      Sensor = Getadc(0)

    If Sensor > 0 Then

       Select Case Sensor

         Case Is < 25                                       ' Taster1
         If A = 0 Then
         Incr A
         Elseif A = 1 And B = 0 Then
         Incr B
         Elseif B = 1 And C = 0 Then
         Incr C
         Elseif C = 1 And D = 0 Then
         Incr D
         Elseif D = 1 And E = 0 Then
         Incr E
         Elseif E = 1 And F = 0 Then
         Incr F
          Goto Main
       End If

         Case Is < 175                                      'Taster 2
         If G = 0 Then
         Incr G
         Elseif G = 1 And H = 0 Then
         Incr H
         Elseif H = 1 And I = 0 Then
         Incr I
         Elseif I = 1 And J = 0 Then
         Incr J
         Elseif J = 1 And K = 0 Then
         Incr K
         Elseif K = 1 And L = 0 Then
         Incr L
         Goto Main
End If
         Case Is < 325                                      'Taster 3
         If M = 0 Then
         Incr M
         Elseif M = 1 And N = 0 Then
         Incr N
         Elseif N = 1 And O = 0 Then
         Incr O
         Elseif O = 1 And P = 0 Then
         Incr P
         Elseif P = 1 And Q = 0 Then
         Incr Q
         Elseif Q = 1 And R = 0 Then
         Incr R
         Goto Main
End If
         Case Is < 450                                      'Taster 4
         If S = 0 Then
         Incr S
         Elseif S = 1 And T = 0 Then
         Incr T
         Elseif T = 1 And U = 0 Then
         Incr U
         Elseif U = 1 And V = 0 Then
         Incr V
         Elseif V = 1 And W = 0 Then
         Incr W
         Elseif W = 1 And Y = 0 Then
         Incr Y
         Goto Main
End If
         Case Is < 600                                      'Taster 5
         If Z = 0 Then
         Incr Z
         Elseif Z = 1 And Aa = 0 Then
         Incr Aa
         Elseif Aa = 1 And Bb = 0 Then
         Incr Bb
         Elseif Bb = 1 And Cc = 0 Then
         Incr Cc
         Elseif Cc = 1 And Dd = 0 Then
         Incr Dd
         Elseif Dd = 1 And Ee = 0 Then
         Incr Ee
         Goto Main
End If
         Case Is < 750                                      'Taster 6
         If Ff = 0 Then
         Incr Ff
         Elseif Ff = 1 And Gg = 0 Then
         Incr Gg
         Elseif Gg = 1 And Hh = 0 Then
         Incr Hh
         Elseif Hh = 1 And Ii = 0 Then
         Incr Ii
         Elseif Ii = 1 And Jj = 0 Then
         Incr Jj
         Elseif Jj = 1 And Kk = 0 Then
         Incr Kk
         Goto Main
End If
         Case Is < 900                                      'Taster 7
         If Ll = 0 Then
         Incr Ll
         Elseif Ll = 1 And Mm = 0 Then
         Incr Mm
         Elseif Mm = 1 And Nn = 0 Then
         Incr Nn
         Elseif Nn = 1 And Oo = 0 Then
         Incr Oo
         Elseif Oo = 1 And Pp = 0 Then
         Incr Pp
         Elseif Pp = 1 And Qq = 0 Then
         Incr Qq
         Goto Main
End If

         End Select

 End If


    Loop
    End




 Isrtimer0:

 If A = 1 Then
    Set Portc.5
    Set Portd.6
    Reset Portc.5
    Reset Portd.6

    Elseif B = 1 Then
    Set Portc.4
    Set Portd.6
    Reset Portc.4
    Reset Portd.6

    Elseif C = 1 Then
    Set Portc.3
    Set Portd.6
    Reset Portc.3
    Reset Portd.6

    Elseif D = 1 Then
    Set Portc.2
    Set Portd.6
    Reset Portc.2
    Reset Portd.6

    Elseif E = 1 Then
    Set Portc.1
    Set Portd.6
    Reset Portc.1
    Reset Portd.6

    Elseif F = 1 Then
    Set Portc.0
    Set Portd.6
    Reset Portc.0
    Reset Portd.6

    Elseif G = 1 Then
    Set Portc.5
    Set Portd.5
    Reset Portc.5
    Reset Portd.5

    Elseif H = 1 Then
    Set Portc.4
    Set Portd.5
    Reset Portc.4
    Reset Portd.5

    Elseif I = 1 Then
    Set Portc.3
    Set Portd.5
    Reset Portc.3
    Reset Portd.5

    Elseif J = 1 Then
    Set Portc.2
    Set Portd.5
    Reset Portc.2
    Reset Portd.5

    Elseif K = 1 Then
    Set Portc.1
    Set Portd.5
    Reset Portc.1
    Reset Portd.5

    Elseif L = 1 Then
    Set Portc.0
    Set Portd.5
    Reset Portc.0
    Reset Portd.5

 End If
Return

von Karl H. (kbuchegg)


Lesenswert?

Jannis P. schrieb:

> Das Programm (im Timer) soll, wenn z.B. die Variable A den Wert 1
> zugewiesen bekommt dafür sorgen, dass durch das 1 in der Variable z.B.
> Portc.5 auf 1 gesetzt wird. Wenn B z.B. auch noch den Wert 1 hat sollen
> beide so schnell geschaltet werden, d

Bla, bla, bla


beschreib die Aufgabenstellung und nicht wie du sie zu lösen gedenkst. 
Dein ganzer Programmansatz ist Müll. Schon alleine die 50 Variablen sind 
höchst wahrscheinlich quatsch.

Also: Beschreib zb:

Ich möchte ein Rollo steuern.
Oder: ich will eine Zeitsteuerung für einen Hühnerkäfig machen.
Oder: Ich brauch eine Steuerung für den Zündzeitpunkt bei einem 
Viertakter

von Jannis P. (jannis94)


Lesenswert?

> beschreib die Aufgabenstellung und nicht wie du sie zu lösen gedenkst.
> Dein ganzer Programmansatz ist Müll. Schon alleine die 50 Variablen sind
> höchst wahrscheinlich quatsch.
>
> Also: Beschreib zb:
>
> Ich möchte ein Rollo steuern.
> Oder: ich will eine Zeitsteuerung für einen Hühnerkäfig machen.
> Oder: Ich brauch eine Steuerung für den Zündzeitpunkt bei einem
> Viertakter

Ich möchte ein 4gewinnt Spiel mit einer Led Matrix + 7 Spalten-Tastern 
und 1.Reset + 1.Starttaster realisieren. Des Weitern weiß ich, dass das 
Programm am besten in einer Matrix durch multiplexen gemacht wird. 
Allerdings bin ich zu dumm um das so realisieren zu können. Es ist ein 
Schulprojekt. Mir wurde gesagt es muss nicht schön aussehen, sondern 
soll funktionieren. Es funktioniert auch alles soweit bis auf die 
Ausgabe auf das LedMatrixFeld(7x6).

von Karl H. (kbuchegg)


Lesenswert?

Jannis P. schrieb:
>> beschreib die Aufgabenstellung und nicht wie du sie zu lösen gedenkst.
>> Dein ganzer Programmansatz ist Müll. Schon alleine die 50 Variablen sind
>> höchst wahrscheinlich quatsch.
>>
>> Also: Beschreib zb:
>>
>> Ich möchte ein Rollo steuern.
>> Oder: ich will eine Zeitsteuerung für einen Hühnerkäfig machen.
>> Oder: Ich brauch eine Steuerung für den Zündzeitpunkt bei einem
>> Viertakter
>
> Ich möchte ein 4gewinnt Spiel mit einer Led Matrix + 7 Spalten-Tastern
> und 1.Reset + 1.Starttaster realisieren. Des Weitern weiß ich, dass das
> Programm am besten in einer Matrix durch multiplexen gemacht wird.
> Allerdings bin ich zu dumm um das so realisieren zu können.

Das ist aber deine beste Chance, das mit einem Array und einer 
Multiplex-Steuerung zu machen. Alles andere ist nämlich noch 
komplizierter und fehleranfälliger.

> soll funktionieren. Es funktioniert auch alles soweit bis auf die
> Ausgabe auf das LedMatrixFeld(7x6).

ALso so gut wie gar nichts.

von Karl H. (kbuchegg)


Lesenswert?

erklärst du mir noch, wozu du bei einem 4-gewinnt einen ADC brauchst?

von Karl H. (kbuchegg)


Lesenswert?

Jannis P. schrieb:
> Mir wurde gesagt es muss nicht schön aussehen, sondern
> soll funktionieren.

Weißt du was wirklich lustig (und auch interessant) ist:

Das die Programme, die auch einigermassen schön aussehen, auch meistens 
die sind die gut funktionieren, während die Programme, die einfach nur 
scheuslich sind, oft die Programme sind, die nicht funktionieren und die 
man auch ohne Code-Aufräumen nicht zum funktionieren bringen kann. :-)

Interessante Beobachtung, findest du nicht? Wurde an hunderten von 
Beispielen verifiziert und die Trefferquote dieser Aussage ist 
erschreckend hoch.

von Jannis P. (jannis94)


Lesenswert?

Karl Heinz Buchegger schrieb:
> erklärst du mir noch, wozu du bei einem 4-gewinnt einen ADC brauchst?

Ich habe 7 Taster an einen ADC.0 angeschlosen. Jenachdem welche Spannung 
ankommt, weiß der Atmega32 was er zu tun hat.
Könnten Sie mir damit mein Programm besser läuft denn ein Beispiel Array 
zeigen + Multiplexsteurung? Damit ich das auf meine Platine umschreiben 
kann.
Bei den Seiten im Internet steige ich nicht durch, bzw. sind sie oft in 
C dargestellt. Oder es sind kompliziertere Versionen.
Mfg
Jannis
----------------------------------------------------------------------
volatile int8_t  spielfeld[6][7]={     // Speichert Positionen der 
Spielsteine
            {0,0,0,0,0,0,0},            //  (5;6) . . . . . (0;6)     um 
180° gedreht
            {0,0,0,0,0,0,0},            //    .   . . . . .   .       0 
= LED aus
            {0,0,0,0,0,0,0},            //    .   . . . . .   .       1 
= LED rot
            {0,0,0,0,0,0,0},            //    .   . . . . .   .       2 
= LED grün
            {0,0,0,0,0,0,0},            //    .   . . . . .   .       3 
= LED gelb
            {0,0,0,0,0,0,0}             //  (5;0) . . . . . (0;0)
------------------------------------------------------------------------ 
---soetwas  z.B.

von Chr. M. (snowfly)


Lesenswert?

Das ist doch jetzt schonmal ein Ansatz.

-Also erstmal Reset Taster(das einfachste) - ein Taster an Reset und mit 
Start/Reset beschriften ;)
-Dann 7 Eingänge für die 7 Spalten - Taster ran, fertig
für jede Spalte würde ich eine Byte Variable definieren und bei 
Tastendruck
nach links schieben und 1 addieren

-Jetzt wird es schwieriger, eine LED-Matrix mit 7x6 LEDs
das sind 42, soviele Ausgänge hast du nicht - also 7x6 Matrix per 
Multiplexing programmieren.

-jetzt noch die Spalten variablen von der Matrix anzeigen lassen


Dann fehlt nur noch die Auswertung ob jemand gewonnen hat,
ne Siegermelodie, binken der Siegerreihe, usw.

Aber wie soll das mit einfarbigen LEDs überhaupt funktionieren
normal hat doch jeder Spieler eine Farbe?

Ich glaube langsam wir meinen verschiedene 4 Gewinnt.

Da hast du noch ganz schön was vor dir, ist aber mit der BASCOM Demo 
machbar.

von Jannis P. (jannis94)


Angehängte Dateien:

Lesenswert?

Ich verwende DuoLeds von Reichelt. Die leuchten in Grün und Rot und 
haben in der Mitte einen gemeinsamen Ground.
Mfg
Jannis

von Chr. M. (snowfly)


Lesenswert?

Ich will dir ja nicht den Mut nehmen, aber da hast du noch einiges vor 
dir

Das wäre dann ja schon eine 14x6(oder 7x12) Matrix, versuch doch einfach 
zuerstmal die zum laufen zu bringen und bau dann das Spiel mit ein.

Wann willst du das abgeben?

von Jannis P. (jannis94)


Lesenswert?

So hab jetzt eine wesentlich kürzere und bessere Version geschrieben. 
Allerdings habe ich noch das Problem, dass wenn nach einer roten Led 
eine grüne kommen soll, es sehr lange dauert bis dieses angezeigt wird. 
Wenn danach direkt noch eine kommt ohne die Farbe zu wechseln geht es 
sehr schnell. Liegt es irgendwie daran, dass er noch Werte dazu zählen 
muss bis er die Led z.B. grün anzeigen kann? Vielen Dank für eine 
Antwort.
---------------------------------------------------------------------


$regfile = "m32def.dat"
Disable Jtag                                                'Jtag 
deaktiviert
Config Timer0 = Timer , Prescale = 1
On Timer0 Timer_isr
Enable Interrupts
Enable Timer0

Config Adc = Single , Prescaler = Auto
Start Adc
Dim Sensor As Integer
Dim Sensor1 As Integer

Config Portb = Output
Config Portc = Output
Config Portd = Output

Dim X As Integer
Dim Y As Integer
Dim Z As Integer
Dim A As Integer
Dim B As Integer
Dim C As Integer
Dim D As Integer
Dim E As Integer
Dim F As Integer
Dim G As Integer
Dim A1 As Integer
Dim A2 As Integer

X = 500
A1 = 0
A2 = 0
Y = 0
Z = 1

Set Portc.7

Do
Sensor = Getadc(0)

   If Sensor = 0 Then
      Incr A
      If A = 1 Then
         If Y = 0 Then
         A1 = A1 + 32
         Else
         A2 = A2 + 32
         End If
      End If

      If A = 2 Then
         If Y = 0 Then
         A1 = A1 + 16
         Else
         A2 = A2 + 16
         End If
      End If

      If A = 3 Then
         If Y = 0 Then
         A1 = A1 + 8
         Else
         A2 = A2 + 8
         End If
      End If

      If A = 4 Then
         If Y = 0 Then
         A1 = A1 + 4
         Else
         A2 = A2 + 4
         End If
      End If

      If A = 5 Then
         If Y = 0 Then
         A1 = A1 + 2
         Else
         A2 = A2 + 2
         End If
      End If

      If A = 6 Then
         If Y = 0 Then
         A1 = A1 + 1
         Else
         A2 = A2 + 1
         End If
      End If
   End If
       End Select
       End If
Sensor1 = Getadc(7)
If Sensor1 < 500 Then
   Select Case Y
      Case 0:
      Incr Y
      Waitms Z
      Case 1:
      Decr Y
      Waitms Z
End Select
End If
Loop
End

Timer_isr:
Select Case Y

Case 0:
Reset Portc.6
Set Portc.7
Waitms 1
Goto Isr1
Case 1:
Reset Portc.7
Set Portc.6
Waitms 1
Goto Isr1
end select

Isr1:
Portd = &B01000000
Portc = 0 + A1
Portb = 0 + A2
Waitus X
Reset Portc
Reset Portb
Return

von Jannis P. (jannis94)


Lesenswert?

Wenn z.B. in der 1. Reihe die erste und dritte Led leuchten soll, dann
ist doch A1+32 = 32     'rot
         A1+8 = 8       'rot           =40 Wenn die erste und 3. Led 
leuchten soll, braucht
Portc. den Wert 40?
Oder  A1+32 = 32                  'rot
      A2+16 = 16                  'grün
      A1+8 = 8   = 56             'rot

von Chr. M. (snowfly)


Lesenswert?

Das sieht doch schon wesentlich besser aus als dein 1. Versuch. :)

wenn du jetzt das ganze noch mit sinvollen Variablennamen versiehst
und ein paar Komentare einfügst dann wird es auch lesbar.

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.