PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : IF - Schleife geht nicht richitg ?!?



cyby
05.02.2005, 13:08
hi,
programmiere gerade mein erstes Programm in Bascom für einen sehr einfachen Roboter und da geht die IF Schleife nicht :(


'Roboter Projekt
'-------------------------------------------------------------- ---------------
$regfile = "m32def.dat" 'AT Mega 32
$crystal = 8000000 'Quarz: 8 MHz

'------------------ Pin setzten -----------------------------------------------
Ddra = &B11111000 'Pin PA 3-7 auf Output setzen
Porta = &B11111000 'Pin PA 3-7 auf High setzen

Ddrb = &B00000001 'Pin PB 0 auf Output setzen
Portb = &B00000001 'Pin PB 0 auf High setzen

'------------------------------------------------------------------------------
'------------------ MainLoop --------------------------------------------------
'------------------------------------------------------------------------------
Do

'------------------ Motore einschalten ----------------------------------------
Porta.3 = 1 'Motor Rechts einschalten
Porta.6 = 1 'Motor Links einschalten

'################################################# ################################################## ###################
If Pina.0 = 0 Then 'Wenn bei PA0 Spannung anliegt
'rückwärts fahren
Porta.4 = 0 'vorwärts Rechts
Portb.0 = 0 'vorwärts Links
Porta.5 = 1 'rückwärts Rechts
Porta.7 = 1 'rückwärts Links
End If
'################################################# ################################################## ###################
If Pina.0 = 1 And Pina.1 = 1 And Pina.2 = 1 Then 'Wenn keine Spannung bei PA0, PA1 und PA2 anliegt
'vorwärts fahren
Porta.4 = 1 'vorwärts Rechts
Portb.0 = 1 'vorwärts Links
Porta.5 = 0 'rückwärts Rechts
Porta.7 = 0 'rückwärts Links
End If
'################################################# ################################################## ###################


Loop
End

und zwar ist es so , das wenn bei


If Pina.0 = 0 Then 'Wenn bei PA0 Spannung anliegt
'rückwärts fahren
Porta.4 = 0 'vorwärts Rechts
Portb.0 = 0 'vorwärts Links
Porta.5 = 1 'rückwärts Rechts
Porta.7 = 1 'rückwärts Links
End If
Spannung anliegt , fährt er wie gewollt rückwärts ...
aber wenn keine Spannung mehr anliegt fährt er immer noch rückwärts obwohl er vorwärts fahren sollte

BITTE helft mir , bin ratlos !!!!!!!!! :-k
THX O:)

MFG,
cyby \:D/

harryup
05.02.2005, 14:00
hi,
if pina.0 = 0 ' die bedingung ist erfüllt, wenn KEINE spannung anliegt
sind evtl. alle anderen bedingungen (pina.1 und .2) erfüllt und das kerlchen führt ständig nur eine if-anweisung aus?
kannste schön testen mit:
if bedingung then ' bedingung erfüllt
vorwärts...
else ' bedingung nicht erfüllt
rückwärts...
end if
gruss, harry

RCO
05.02.2005, 14:30
Was hast du denn für einen Sensor... angeschlossen, vielleicht solltest du auch einen pullup/down verwenden.

MFG Moritz

cyby
05.02.2005, 14:51
if pina.0 = 0 ' die bedingung ist erfüllt, wenn KEINE spannung anliegt
sind evtl. alle anderen bedingungen (pina.1 und .2) erfüllt und das kerlchen führt ständig nur eine if-anweisung aus?
nein , die anderen Bedingungen sind nicht erfüllt , da habe ich zum impuls-test einfach die Batterie dran gehängt ...


if bedingung then ' bedingung erfüllt
vorwärts...
else ' bedingung nicht erfüllt
rückwärts...
end if

ok , versuche ich mal



Was hast du denn für einen Sensor... angeschlossen, vielleicht solltest du auch einen pullup/down verwenden.

eine Batterie wie oben beschrieben , GND-Anschluss an die Batterie und VCC an den Chip

cyby
05.02.2005, 14:58
'Roboter Projekt
'-------------------------------------------------------------- ---------------
$regfile = "m32def.dat" 'AT Mega 32
$crystal = 8000000 'Quarz: 8 MHz

'------------------ Pin setzten -----------------------------------------------
Ddra = &B11111000 'Pin PA 3-7 auf Output setzen
Porta = &B11111000 'Pin PA 3-7 auf High setzen

Ddrb = &B00000001 'Pin PB 0 auf Output setzen
Portb = &B00000001 'Pin PB 0 auf High setzen

'------------------------------------------------------------------------------
'------------------ MainLoop --------------------------------------------------
'------------------------------------------------------------------------------
Do

'------------------ Motore einschalten ----------------------------------------
Porta.3 = 1 'Motor Rechts einschalten
Porta.6 = 1 'Motor Links einschalten

'################################################# ################################################## ###################
If Pina.0 = 0 Then 'Wenn bei PA0 Spannung anliegt
'rückwärts fahren
Porta.4 = 0 'vorwärts Rechts
Portb.0 = 0 'vorwärts Links
Porta.5 = 1 'rückwärts Rechts
Porta.7 = 1 'rückwärts Links
'################################################# ################################################## ###################
Else 'Wenn keine Spannung bei PA0, PA1 und PA2 anliegt
'vorwärts fahren
Porta.4 = 1 'vorwärts Rechts
Portb.0 = 1 'vorwärts Links
Porta.5 = 0 'rückwärts Rechts
Porta.7 = 0 'rückwärts Links
End If
'################################################# ################################################## ###################


Loop
End

wie schon oben beschrieben , das selbe ergebnis das er nicht mehr vorwärts fahren will :(

PicNick
05.02.2005, 16:07
Hast du ihm auch gesagt, daß nix is mit Analog Conversion ?
ich glaub, bei porta nimmt er defaultmäßig analog statt digital an.
das wär schlecht in deinem Fall.
ich müßt aber auch erst genau nachsehen.
mfg robert

cyby
05.02.2005, 16:44
keine ahnung , kenne mich noch nicht lange damit aus ...

05.02.2005, 17:48
Bin auch nicht sicher
Aber wenn du das Register ADCSRA = 0 setzt, sollt so oder so Ruhe sein.
mfg robert

harryup
05.02.2005, 19:29
hi,
die nummer mit analog wird erst dann aktiv, wenn adc geconfigt wird.
in deinem beispiel ist alles korrekt, normalerweise müsste eine pegeländerung an pina.0 IRGENDETWAS auslösen.
wenn's hängt nehm ich immer irgend 'ne led und häng sie an einen pin, meistens hab ich aber 'n lcd dranne, da sieht man sofort an welcher stelle der avr nicht so will wie ich. wie ich das sehe haste 2 motoren dranne, test halt einfach mal mit einem aus, also in die if-kiste einmal motor an und einmal aus.
wie ist das mit der spannung an pina.0, liegt der pin zuverlässig auf gnd-niveau? notfalls pulldown-widerstand dranne, niemals einfach 'in der luft hängen lassen'. in so 'nem fall aktivierst du für gewöhnlich die internen pullup's (Porta.1 = 1), dann führt der pin spannung, wenn ein ext pegel (ic, transistor, schalter) ihn auf gnd 'zieht' -> andere bedingung.
immer dran denken, der avr 'reagiert' logisch, der menschliche verstand weniger, womit nur gesagt sein will, wenn der avr nicht tut was du erwartest hat das seinen grund, die kunst ist, ihn zu finden.
poste doch mal dein schaltbild, vllt. is da was nicht ok.
grüssens und immer straight geradenaus, harry

cyby
06.02.2005, 10:54
hab nun mal den code etwas gekürzt....

'Roboter Projekt
'-------------------------------------------------------------- ---------------
$regfile = "m32def.dat" 'AT Mega 32
$crystal = 8000000 'Quarz: 8 MHz
'------------------ Pin setzten -----------------------------------------------
Ddra = &B11111000 'Pin PA 3-7 auf Output setzen
Do
If Pina.0 = 0 Then 'Wenn bei PA0 Spannung anliegt
Porta.4 = 0
Elseif Pina.0 = 1 Then 'Wenn keine Spannung bei PA0 anliegt 'Pin PA 3-7 auf High setzen
Porta.4 = 1
End If
Loop
End


nun mal das ganze wie gesagt mit einer LED ausprobiert, wie schon oben gesagt - normal leuchtet die LED , aber sobald einmal kurz Spannung an Pina.4 anliegt leuchtet sie nicht mehr :(

wenn man "ADCSRA = 0" in den Code einbaut kommt irgentwie eine Fehlermeldung...

ICH_
06.02.2005, 13:31
Pulldown einbauen!

harryup
06.02.2005, 13:51
hi,
irgendwie is da noch was durcheinander, du fragst doch pina.0 ab. was macht die aussage '...sobald einmal kurz spannung an pina.4 anliegt...', meinst du die spannung, die der avr eingeschaltet hat oder legst du fröhlich an pina.4 spannung an und erwartest, dass pina.0 darauf reagiert?
du hast auch wieder geschrieben: if pina.0 = 0 then ' wenn spannung anliegt
es ist so: liegt spannung an, wird der pin als 1 gelesen, keine spannung liefert 0.
probierst du:
if pina.0 = 0 then reset porta.4 else set porta.4
kürzer geht's nimmer und muss funtzen, aber nur wenn die led an A4 und der spannungseingang an A0 hängt.
grüssens, harry

cyby
06.02.2005, 15:03
es geht :)

hier das Programm
'Roboter Projekt
'-------------------------------------------------------------- ---------------
$regfile = "m32def.dat" 'AT Mega 32
$crystal = 8000000 'Quarz: 8 MHz
'------------------ Pin setzten -----------------------------------------------
Ddra = &B11111111 'Pin PA 3-7 auf Output setzen

Do

If Pina.0 = 1 Then Reset Porta.4 Else Set Porta.4

Loop
End

aber nur weil jetzte A0 auch Output ist ...
Ddra = &B11111111

cyby
06.02.2005, 15:08
es lag nun wirklich an diesem
Ddra = &B11111111


'Roboter Projekt
'-------------------------------------------------------------- ---------------
$regfile = "m32def.dat" 'AT Mega 32
$crystal = 8000000 'Quarz: 8 MHz

'------------------ Pin setzten -----------------------------------------------
Ddra = &B11111111 'Pin PA 3-7 auf Output setzen

Ddrb = &B00000001 'Pin PB 0 auf Output setzen

'------------------------------------------------------------------------------
'------------------ MainLoop --------------------------------------------------
'------------------------------------------------------------------------------
Do

'------------------ Motore einschalten ----------------------------------------
Porta.3 = 1 'Motor Rechts einschalten
Porta.6 = 1 'Motor Links einschalten

'################################################# ################################################## ###################
If Pina.0 = 1 Then 'Wenn bei PA0 Spannung anliegt
'rückwärts fahren
Porta.4 = 0 'vorwärts Rechts
Portb.0 = 0 'vorwärts Links
Porta.5 = 1 'rückwärts Rechts
Porta.7 = 1
End If 'rückwärts Links
'################################################# ################################################## ###################
If Pina.0 = 0 Then 'Wenn keine Spannung bei PA0 anliegt
'vorwärts fahren
Porta.4 = 1 'vorwärts Rechts
Portb.0 = 1 'vorwärts Links
Porta.5 = 0 'rückwärts Rechts
Porta.7 = 0 'rückwärts Links
End If
'################################################# ################################################## ###################


Loop
End

harryup
07.02.2005, 08:53
hi,
'nen input als output deklarieren müssen damit er gelesen werden kann ist nicht wirklich gagig. ich verwend immer config xxxx = input, ist deutlicher.
trotzdem toll dass es marschiert, gruss, harry

cyby
07.02.2005, 09:10
so weit so gut , aber da gibt es noch ein Problem :-s
wenn man von einer 5V Batterie genau 5V vcc auf A0 anlegt funktioniert das ganze auch \:D/
aber sobald man ein Widerstand oder Transistor mit vor A0 baut wird kein Input an diesem Pin gemessen :-k

als Input soll ein Impuls von dem IS471F (IR Diode) gemessen werden sobald er was erkennt hat (Hinternis) ... deswegen muss ich einen Transistor einbauen ...

harryup
07.02.2005, 18:22
kommt einfach nicht hin, ich fahre inputs grundsätzlich über 5k6 widerstand an, damit ich's nicht versehentlich 'himmle', wenn mal an der spannung was blöd is. über 5k6 kannste input's noch mühelos lesen, bei zu hohem vorwiderstand wird der avr anfälliger für störungen. ein input MUSS als input definiert werden können und dann auch so funktionieren, alles andere wäre gesundgebetet.
also, alles durchchecken, fehler finden, korrigieren, freuen weil's perfekt geht, und vor allem sich niemals mit 'halbechten' lösungen zufriedengeben, das rächt sich immer an anderer stelle.
grüssens, harry

cyby
08.02.2005, 08:38
ist so ein Pulldown dann ein 5k6 Widerstand ?
könnte es vielleicht sein das der obere Code nicht gegangen ist weil kein Pulldown widerstand eingebaut war und jetzte mit pulldown gehen müsste ?

harryup
08.02.2005, 18:30
würde ich nicht als pulldown nehmen, geht zwar, aber dann müsste der 'signalstrombegrenzungswiderstand' (was'n wort, odda???) so niedrig gewählt werden können, dass (blöde anschaltung vorausgesetzt) der avr gekillt werden kann. ich hantier in meinen schaltungen immer mit 5v und 24v rum, da is schnell mal versehentlich (oooohps) der 24v zweig auf den input vom avr gelegt, deswegen verwende ich immer 47k als pulldown und 5k6 als 'signal...' wenn du nur 5v handlest (oder immer alles top im griff hast) kannst dun natürlich auch pulldown von 5k6 und keinen begrenzer nehmen (oder halt so um 1k). der begrenzer und der pulldown bilden ja einen spannungsteiler und der darf das signal nicht soweit 'runterziehen', dass der avr es nicht mehr als high erkennt. also nie 1:1, immer > 1:5.
die nummer mit pulldown hatten wir weiter oben schon, ich dachte der wär in der schaltung drinne, aber richtig, wenn ein input 'in der luft hängt' reicht ein muckenschiss an störung, um ihn high oder low zu setzen, wie er gerade lustig ist. input's immer auf einem klaren pegel führen.
gruss + viel spass, harry

cyby
08.02.2005, 20:28
also ich habe direkt an den pin vom M32 einen Printklotz (so ein Teil wo man ein Kabel anklemmen kann) hingebaut , d.h. der Input hängt direkt in der Luft !
wie du es nun gesagt hast könnte es vielleicht daran liegen das es so automatisch immer auf rückwärts gestellt hat so das es eigentlich nie vorwärts fahren konnte ...
ist es nun wirklich so das es an diesem gelegen ist das es mit dem Input nie geklappt hat ?
muss ich dann einen widerstand direkt an den Pin bauen und dann den Printklotz danach ?
dann wäre ja das problem gelöst ?!?

harryup
09.02.2005, 20:02
hi,
den ausdruck printklotz hab ich noch nie vernommen, aber gut, man lernt immer was dazu. ich kann mir nur nix rechtes drunter vorstellen.
baust du deine schaltungen nicht erst auf einem steckbrett zusammen? da isses ja kein problem, einen widerstand vom pin nach masse zu stecken.
wenn der printklotz das teil ist, über den du spannung auf den avr-input gelegt hast kannste ja an die gleiche stelle einen widerstand anklotzen und das andere ende auf masse (vielleicht löten, kleben, stecken, krokoklemme, egal wie). dass das der grund war ist möglich, aber nicht garantiert, man muss es halt ausprobieren.
aber auch wenn der pin in der luft hängt, die anweisung 'if bedingung then... else...' greift ja immer, entweder ist die bedingung erfüllt oder eben nicht. und ob oder nicht siehst du ja sofort, weil entweder das vor dem else oder das dahinter ausgeführt wird.
na denne, immer fröhlich weitermachen, gruss, harry

cyby
10.02.2005, 09:40
hab jetzte selber noch etwas dran rum gebastet und es geht nun ...