PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kleiner Fehler im Prog, aber wo?



strunz
04.06.2005, 17:31
Hallo Leute,

kann mir jemand sagen was an dier Schreibweise nich richtig ist?
PortC ist bei mir als Output und PortAC als Input konfiguriert.




Do

If Porta = &B00000000 Then
Portc.0 = 1
Portc.1 = 0
Portc.2 = 1
Portc.3 = 0
End If

If Porta = &B00000001 Then
Portc.0 = 1
Portc.1 = 0
Portc.2 = 0
Portc.3 = 0
End If


If Porta = &B00000010 Then
Portc.0 = 0
Portc.1 = 0
Portc.2 = 1
Portc.3 = 0
End If


If Porta = &B00000011 Then
Portc.0 = 1
Portc.1 = 0
Portc.2 = 1
Portc.3 = 0
End If

Loop



Ich vermute, dass hiermit "Porta = &B00000011" etwas nicht stimmt.

Was meint ihr?

Danke schon mal im voraus.

recycle
04.06.2005, 17:47
Was daran falsch ist, ist ziemlich schwierig zu sagen, wenn man nicht weiss, was das Programm machen soll.

Kompilieren lässt es sich in Bascom problemlos.

Du muss dem Compiler vorher allerdings entweder über die Menüs oder durch einfügen der Zeile $regfile = "xxxxx.dat" mitteilen, für welchen Controller das Programm sein soll.
Wenn du das nicht machst, bekommst du massenhaft "Ivalid Datatype" Fehlermeldungen.
Ich glaube wenn man nichts anderes angibt, geht Bascom immer von einem AT90S2313 aus und der hat nicht alle Ports und Pins die dein Programm verwendet.

strunz
04.06.2005, 17:53
Sorry mein Fehler,

hab gedacht es ist nur ein Syntaxfehler oder etwas ähnlich einfaches.

also hier nochmal der gesmmte Code:




Rem Portc.0 = 1 --> Motor links vor
Rem Portc.1 = 1 --> Motor links rück
Rem Portc.2 = 1 --> Motor rechts vor
Rem Portc.3 = 1 --> Motor rechts rück

Rem Sensor links --> Porta.0 (sw =1)
Rem Sensor rechts --> Porta.1 (sw =1)


$regfile = "m32def.dat"
$crystal = 4000000
$baud = 9600



Config Portc = Output
Config Porta = Input



Do

If Porta = &B00000000 Then
Portc.0 = 1
Portc.1 = 0
Portc.2 = 1
Portc.3 = 0
End If

If Pina = &B00000001 Then
Portc.0 = 1
Portc.1 = 0
Portc.2 = 0
Portc.3 = 0
End If


If Pina = &B00000010 Then
Portc.0 = 0
Portc.1 = 0
Portc.2 = 1
Portc.3 = 0
End If


If Pina = &B00000011 Then
Portc.0 = 1
Portc.1 = 0
Portc.2 = 1
Portc.3 = 0
End If

Loop


Also dass Programm soll einfach zwei Sensoren auswerten und und die Motorschaltung damit füttern. Einfach damit mein Bot ner schwarzen Linie nachfahren kann.

Hoffe es ist jetzt etwas verständlicher geworden.

PicNick
04.06.2005, 18:37
Hi, Kollege !
Weiche allen syntaktischen Feinheiten einfach mal aus und schreib (von oben nach unten)
if Pina = 0
if Pina = 1
if Pina = 2
if Pina = 3

Gleich nach dem "do" solltest du auch lieber "PINA" statt "porta" schreiben.
sonst seh ich aber nix falsches

EDIT du fragst die Pins digital ab. Oder sind das analog-eingänge vom CNY70 oder sowas ?
(das ging dann anders)

strunz
04.06.2005, 18:49
So, Danke mal für die Antwort.
Jetzt schaut mein Code so aus:



Rem Portc.0 = 1 --> Motor links vor
Rem Portc.1 = 1 --> Motor links rück
Rem Portc.2 = 1 --> Motor rechts vor
Rem Portc.3 = 1 --> Motor rechts rück

Rem Sensor links --> Porta.0 (sw =1)
Rem Sensor rechts --> Porta.1 (sw =1)


$regfile = "m32def.dat"
$crystal = 4000000
$baud = 9600



Config Portc = Output
Config Porta = Input




Do

If Pina = 0 Then
Portc.0 = 1
Portc.1 = 0
Portc.2 = 1
Portc.3 = 0
End If

If Pina = 1 Then
Portc.0 = 0
Portc.1 = 0
Portc.2 = 1
Portc.3 = 0
End If


If Pina = 2 Then
Portc.0 = 1
Portc.1 = 0
Portc.2 = 0
Portc.3 = 0
End If


If Pina = 3 Then
Portc.0 = 1
Portc.1 = 0
Portc.2 = 1
Portc.3 = 0
End If

Loop


Aber fahren tut er trotzdem nicht.

Wenn ich die Pins aber einzeln abfrage, also so:



Do

If Pina.0 = 0 Then
Portc.0 = 1
Portc.1 = 0
Portc.2 = 1
Portc.3 = 0
End If

If Pina.0 = 1 Then
Portc.0 = 0
Portc.1 = 0
Portc.2 = 1
Portc.3 = 0
End If


If Pina.1 = 2 Then
Portc.0 = 1
Portc.1 = 0
Portc.2 = 0
Portc.3 = 0
End If


If Pina.1 = 3 Then
Portc.0 = 1
Portc.1 = 0
Portc.2 = 1
Portc.3 = 0
End If

Loop


Dann gehts. Nur kann ich dann logischerweise den Portc nicht in Abhängigkeit von zwei Pins vom PortA ansteuern.

Verstehst du?

chr-mt
04.06.2005, 18:52
Nur kann ich dann logischerweise den Portc nicht in Abhängigkeit von zwei Pins vom PortA ansteuern.

Doch:


If pina.0=0 AND pina.1=0 then
'mach was
end if

Gruß
Christopher

PicNick
04.06.2005, 18:56
Aaaach, logo, alles klar !
Wenn du mit = abfragst, vergleichst du natürlich ALLE pins ab, auch die, wo nix draufhängt
Mach einen Zwischenschritt
DIM Ctl as byte
Ctl = 0
DO
Ctl.0 = Pina.0
Ctl.1 = Pina.1

if Ctl = 0 then ...
if Ctl = 1 then ...
if Ctl = 2 then ...
if Ctl = 3 then ...

Geht auch anders, egal.

strunz
04.06.2005, 18:57
Jawohl, es funktioniert.
Danke vielmals.

Aber kann mir vielleicht jemand trotzdem erklären, warum es in der Binären schreibweis nicht gefuntzt hat?

strunz
04.06.2005, 18:58
Alles klar, PicNick war schneller.

THX.

PicNick
04.06.2005, 19:05
Mit binär hat's nix zu tun , es geht darum, ob du einzelne Bits abfragst oder das ganze Byte. Man müßte die zwei fraglichen Bits maskieren und dann ginge es auch. Ich hab aber gehört, daß sich dabei schon mal einer die Finger gebrochen hat.

EDIT: um was zu lernen, kannst du ruhig das Ctl-byte auch binär abfragen

strunz
04.06.2005, 19:10
Ok, vielen Dank an alle für die raschen Antworten.
Bis zum nächsten mal:-)