PDA

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

Jon
02.10.2007, 20:34
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

Jon
02.10.2007, 20:46
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

Stromi
02.10.2007, 20:55
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???

Stromi
02.10.2007, 21:00
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

Jon
02.10.2007, 21:12
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...

chr-mt
02.10.2007, 21:17
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

Stromi
02.10.2007, 21:21
@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...

recycle
02.10.2007, 21:41
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...

chr-mt
02.10.2007, 21:50
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

Skragan
05.10.2007, 09:24
@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