Archiv verlassen und diese Seite im Standarddesign anzeigen : scheitere an einfach if - then - else
M!ni M0nk3y
02.10.2007, 20:30
hallo.
ich habe mir um den umgang mit einem atmega8 zu erleichtern ein kleines testboard aufgebaut. port d 0 ist ein taster an 5V und an port c 5 ist eine LED.
mein "cot" lautet wie folgt:
$regfile = "m8def.dat"
$crystal = 1000000
Config Portc = Output
Config Portd = Input
If Portd.0 = 1 Then
Portc.5 = 1
Else
Portc.5 = 0
End If
was mache ich falsch?
MfG
M!ni M0nk3y
Du musst noch den Pull-Up Widerstand aktivieren.
jon
Zentauro
02.10.2007, 20:38
der "CODE" funzt tadellos...
vielleicht willste ja sowas:
$regfile = "m8def.dat"
$crystal = 1000000
Config Portc = Output
Config Portd = Input
DO
if Portd.0 = 1 Then
Portc.5 = 1
Else
Portc.5 = 0
End If
LOOP
lg
M!ni M0nk3y
02.10.2007, 20:39
das mache ich wie?
sry, blutiger anfänger!
mit do und loop geht es auch
hat es was zu sagen das portd.0 auch mit RXD beschriftet ist im datenblatt?
Zentauro
02.10.2007, 20:43
ich glaube, dass dein problem einfach das ist, dass der code nach dem starten des controllers ganz genau einmal durchlaufen wird und dann nie wieder - darum die endlosschleife...
lg
M!ni M0nk3y
02.10.2007, 20:46
damit klappts aber auch net
Ist mir gar nicht aufgefallen, dass Do-Loop fehlt...
Was mich wundert ist, dass du den Pull-Up Widerstand nicht aktivieren musst. Ich kann bei mir keinen Taster auswerten, wenn ich den nicht aktiviere :-k
jon
M!ni M0nk3y
02.10.2007, 20:53
Was mich wundert ist, dass du den Pull-Up Widerstand nicht aktivieren musst. Ich kann bei mir keinen Taster auswerten, wenn ich den nicht aktiviere
??
es klappt doch gar nicht, oder was hast du gemeint?
Zentauro
02.10.2007, 20:53
aha, dachte es geht schon:
mit do und loop geht es auch
mit dem beispiel aus dem wiki sollte es gehen...
$regfile = "m32def.dat" 'Die Anweisung bestimmt Controllertyp, hier AVR Mega 32
$framesize = 32 'Stackanweisungen, die eigentlich nur bei größeren Programmen
$swstack = 32 'wirklich nötig werden
$hwstack = 32
$crystal = 16000000 'Die Frequenz des verwendeten Quarzes
$baud = 9600 'Die Baudrate für RS232 Ausgabe.
'Sie muss auch bei PC Terminalprogramm identisch sein
Config Portc.0 = Output 'Ein Pin wird aus Ausgang konfiguriert PC0 (also Pin0 von Port C)
Led Alias Portc.0
Config Pina.0 = Input 'Ein Pin (PA0) wird als Eingang definiert
Taster Alias Pina.0
Porta.0=1 'Interner Pullup Widerstand ein
do
if taster=0 then
Led=1 'Pin wird auf High, also 5V geschaltet
else
Led = 0 'Pin wird auf Low, also 0V geschaltet
endif
Waitms 100
loop
Ausgaben mit zb. set Portc.5
Eingaben aber mit zb if Pind.0
$regfile = "m8def.dat"
$crystal = 1000000
Config Portc = Output
Config Portd = Input
DO
if Pind.0 = 1 Then
Portc.5 = 1
Else
Portc.5 = 0
End If
LOOP
Probiere das mal.
M!ni M0nk3y
02.10.2007, 20:56
schon probiert...
habs halt nur auf meine ausgänge/eingänge umgeschrieben...
geht nix
kann man portd.0 als eingang definieren?
vllt ist ja da irgendwas faul.
weil ein einfaches blinklicht oder so funktioniert, also der atmenga8 is nicht defekt! is außerdem ganz neu, heute erst gekommen...
Zentauro
02.10.2007, 20:58
Was mich wundert ist, dass du den Pull-Up Widerstand nicht aktivieren musst. Ich kann bei mir keinen Taster auswerten, wenn ich den nicht aktiviere
@jon: ich hab den code simuliert, falls du mich meintest
Zentauro
02.10.2007, 21:00
ist die hardware ok??
schon nachgemessen, ob der input vom taster richtig kommt???
Im Simulator im Einzelschritt geht es. Haste das mal simuliert?
M!ni M0nk3y
02.10.2007, 21:01
wie gehtn das? ;)
Zentauro
02.10.2007, 21:07
F2 drücken, dann der vierte button von links oben
Ich bin dafür, dass es so funktioniert:
$regfile = "m8def.dat"
$crystal = 1000000
Config Portc = Output
Config Pind.0 = Input
Portd.0=1
Do
If Portd.0 = 1 Then
Portc.5 = 1
Else
Portc.5 = 0
End If
Loop
Zentauro
02.10.2007, 21:15
ich kann mich dem nur anschiessen, falls es so nicht geht, haste nen hardwarefehler...
Ich bin dafür, dass es so funktioniert:
Nö :)
If Portd.0 = 1 Then 'geht nicht
So geht's:
If Pind.0 = 0 then 'Eingang=Pin , gegen Masse schalten =0
Gruß
Christopher
@Jon
Mit der Zeile: Portd.0 schaltest du die Pullup ein, richtig?
Mit der Zeile: If Portd.0=1 fragst du eigentlich: Ist der Pullup von Portd.0 eingeschaltet?
Teste mal im Simulator beide Varianten !!
In der reallen Schaltung ist es deutlich zu sehen.
Merke O:)
Portd.x für Output-Sachen
Pind.x für Input-Sachen
Sauerbruch
02.10.2007, 21:38
...jetzt mal wieder 'ne Antwort für M!niM0nk3y:
port d 0 ist ein taster an 5V
Das könnte ein Problem sein: Wenn Dein interner PullUp-Widerstand aktiviert ist (portd.0=1), liegt der Eingang (pind.0) immer auf 1, egal ob der Taster gedrückt ist oder nicht. Ist der PullUp deaktiviert (portd.0=0), hängt der Eingang in der Luft, solange der Taster nicht gedrückt ist. Und das führt nicht gerade zu reproduzierbaren Resultaten...
Kannste denn den Taster auch nach Masse schalten?
Und wenn Du dann noch den Eingang korrekt mit "pind.0" abfragst, müsste das laufen...
Merke
Portd.x für Output-Sachen
Pind.x für Input-Sachen
Hierzu hätten sich die Entwickler von Bascom ja eigentlich schon irgendwas anwenderfreundlicheres ausdenken können.
Über irgendwas wie PullupX.x zum Schalten und Abfragen der Pullups hätte sicher schon vielen Kunden eine Menge Zeit gespart.
PORTX für den ganzen Port und PINX.X für einen einzelnen Pin wäre irgendwie auch naheliegender.
M!ni M0nk3y
02.10.2007, 21:45
'Eingang=Pin , gegen Masse schalten =0
das heißt ich muss den pin auf masse legen?
aber es muss doch auch möglich sein mit nem high zu schalten...
Kannst du natürlich auch.
Dann muß aber der Pullup weg und ein externer Pulldown dran.
Wenn du
config pind.0 =input schreibst und Portd.0 auf 0 setzt,
dann ist der Eingang offen und kann irgendwo mit der Spannung sein.
Den musst du dann eben extern mit einem Widerstand nach Masse ziehen,
sonst ist der Pegel undefiniert.
Gruß
Christopher
roboterheld
02.10.2007, 21:54
geht auch so :
config pinb.1=output
config pinb.2=input
config portc=output
config portd=input
auslesen :
a=portb
pinb.1=1
pinb=255
b=portb.1
mfg
@M!ni M0nk3y:
Sollte auch gehen und ist vielleicht etwas einfacher :)
Do
portD.5=PinD.0
Loop
ansonsten einfach eine Bitvariable zu hilfe nehmen:
Do
bitvariable=PinD.0
PortD.5=bitvariable
Loop
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.