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]
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
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
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.
> 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.
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?
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
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.
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.
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.
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.
> 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
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.
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.
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.
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
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
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
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
> 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).
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.
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.
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.
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.
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?
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
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
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.