Forum: Mikrocontroller und Digitale Elektronik Bascom - Frage


von Ralf (Gast)


Lesenswert?

Hi,

mal ne Frage - übe mich gerade mit Bascom ......

Möchte, wenn ich den Taster auf High setze (also Pind.0 = 1=)
das sich ein LED einschaltet und auch eingeschalten bleibt, bis ich den
Taster erneut drücke .....

Habs bissher nur geschafft die LED zum leuchten zu bringen solange ich
am Taster drücke und umgekehrt auch sämtlich Variationen ....
Aber noch nicht das ein Wert dann bleibt bis ich wieder dücke.

Mit welchem Befehl, muss ich das machen??? SET ???

von Ralf (Gast)


Lesenswert?

mein natürlich Pind.0 = 1
&
eine LED

dieliebenrechtschreibfehler *g*

von anfänger (Gast)


Lesenswert?

if pind.0 = 1 then toggle "led"

aber wahrscheinlich musst du den schalter entprellen, such in der hilfe
mal nach debounce.

von Ralf (Gast)


Lesenswert?

Hmmm .....

funktioniert nicht ganz - krieg im Bascom dann nur Fehlermeldungen, die
mir nicht gerade viel sagen.
Hab mit dieser Schreibweise gerade mal eine Fehlermeldung - wo liegt
der Fehler ???

$regfile = "8535def.dat"
$crystal = 4000000

Config Portb = Output
Config Portd = Input

Do
Portb = &B11111111

If Pind.0 = 1 Then Toggle Portb.0 = 0 End If

Loop

P.S.: die Leds hängen bei mir auf VCC darum ist Portb auf High gesetzt

von Andreas Hesse (Gast)


Lesenswert?

Hallo,

vielleicht musst Du noch die internen PullUps am PortD noch
aktivieren.

Ich weiss nicht mehr genau wie BASCOM das macht.

Gruss
Andreas

von Raimond (Gast)


Lesenswert?

Bei "If then" Abfragen gilt folgendes

If then
  ...irgendwas
end if

oder

if then  ... irgendwas

also wenn alles in einer Zeile steht, dann ist das "End If"
überflüssig

von Kurt (Gast)


Lesenswert?

Hallo,

möchte auch Bascom lernen.

Kann es sein dass
"" If Pind.0 = 1 Then Toggle Portb.0 = 0 End If ""
                                     ----
die Zuweisung "= 0 "  nicht hingehört ??

Denn Toggle wechselt den Pinzustand und wird sich nicht dreinreden
lassen.

Gruss Kurt

von Raimond (Gast)


Lesenswert?

<die Zuweisung "= 0 "  nicht hingehört ??>

Genau, das hatte ich glatt übersehen.

von Peter (Gast)


Lesenswert?

Versuch mal:

$regfile = "8535def.dat"
$crystal = 4000000

Config Portb = Output
Config Portd = Input
Portd = &B1111_1111 'Pullups einschalten!
Portb = &B1111_1111

Do
If Pind.0 = 1 and Portb = &B1111_1111 Then Portb = &B0000_0000
If Pind.0 = 1 and Portb = &B0000_0000 Then Portb = &B1111_1111
Loop

------------------------------ODER----------------------------
$regfile = "8535def.dat"
$crystal = 4000000

Config Portb = Output
Config Portd = Input
Portd = &B1111_1111 'Pullups einschalten!
Portb = &B1111_1111

Do
If Pind.0 = 1 Then Toggle Portb.0
Loop

MFG,

Peter.

von Holger (Gast)


Lesenswert?

hi,
versuchs mal hiermit:
$regfile = "2313def.dat"
Config Portb = Output
Config Portd = Input
Portd = &B00000001
Portb = &B00000001
Pind.0 = 1
Do
Debounce Pind.0 , 0 , Schalten , Sub
Loop
End
Schalten:
Toggle Portb.0
Return
Bei mir klappt es so !
MFG

von Ralf (Gast)


Lesenswert?

angenommen, ich schalte die pull ups am port d ein, ( mit &B11111111 )
wie schalte ich sie wieder aus falls ich das will ? mit &B00000000  ?

ist das überhaupt sinnvoll die einzuschalten? hab so verdrahtet:
von VCC auf nen vorwiederstand. Von dort einmal zu PD und einmal zum
Taster, welcher wiederum dann zu GND geht

von Peter (Gast)


Lesenswert?

Hallo,

Ja, Pullups ausschalten mittels Portd = &B0000_0000

Sie haben nun selbst ein pullup gemacht (widerstand von PD nach VCC).
Nicht notwendig wenn das schon in AVR verfugbar ist..

Wenn port mal als ausgang geschaltet ist, kann kurzschluss entstehen
via taster zum GND..

Taster anschluss am besten mit interne pullup, und widerstand
von port nach taster.
Taster dann nach GND.

Widerstand mindestens 250 ohm, um strom zu begrenzen auf 20mA.
1Kohm ist OK.

Gruss,

Peter





ist das überhaupt sinnvoll die einzuschalten? hab so verdrahtet:
von VCC auf nen vorwiederstand. Von dort einmal zu PD und einmal zum
Taster, welcher wiederum dann zu GND geht

von Ralf (Gast)


Lesenswert?

Hi,

Danke daweil für Eure Hilfe!
Funktioniert jetzt mit folgendem Code:

$regfile = "8535def.dat"
$crystal = 4000000

Config Portb = Output
Config Portd = Input

Portd = &B11111111
Portb = &B11111111

Do

Debounce Pind.0 , 0 , Schalten1 , Sub
Loop

Schalten1:
Toggle Portb.0
Return

von Ralf (Gast)


Lesenswert?

ok steh komplett auf der Leitung .....

hab jetzt paar Test gemacht, die auch alle recht gut funktioniert
haben.
Doch jetzt häng ich wieder. Ich möchte, wenn ich das erste mal am
taster drücke, dass die erste led angeht.
beim zweitenmal drücken die zweite led unf beim dritten mal zb sollen
alle wieder ausgehen ....

hab versucht dies in meinen letzten geposteten code integriert mit if
.... funktioniert aber nicht
schreib ich ein komplett neuen code, schaff ich auch immer nur eine led
problemlos (oder ne gruppe) zu steuern
aber ich schaffs einfach nicht das so zu verwirklichen wie ichs gerade
vorhabe .....

Bitte Bitte Helfen :-)

von Ralf (Gast)


Lesenswert?

nagut bin nun zu dem ergebniss gekommen - funktioniert eigentlich ganz
gut hat nur nen kleinen hacken.
nachdem ich alle leds wieder abgedreht habe, bleiben sie auch aus und
es tut sich nichts mehr - dachte, dass loop sei dafür da, das es
wieder von vorn beginnt ..... es tut sich aber nichts


$regfile = "8535def.dat"
$crystal = 4000000

Config Portb = Output
Config Portd = Input

Portd = &B00000000
Portb = &B11111111

Debounce Pind.0 , 0 , Taster

Dim X As Byte
X = 0

Taster:

Do
If X = 0 And Pind.0 = 0 Then
X = 1
Portb.0 = 0
End If
If X = 1 And Pind.0 = 1 Then
X = 2
End If
If X = 2 And Pind.0 = 0 Then
X = 3
Portb.1 = 0
End If
If X = 3 And Pind.0 = 1 Then
X = 4
End If
If X = 4 And Pind.0 = 0 Then
Portb.0 = 1
Portb.1 = 1
End If

Loop

von Kurt (Gast)


Lesenswert?

Hallo Ralf,

wenn ich dass richtig sehe bleibt deine Laufvar  X
nach einem Schleifendurchlauf auf 4 stehen.

Alle folgenden Durchläufe finden nur "4"

in der letzten Abfrage sollte X auf 1 gesetzt werden dann gehts wieder
von Vorne an weiter.

Gruss Kurt

von Kurt (Gast)


Lesenswert?

hab nicht richtig gelesen

in der letzten Abfrage sollte X auf 1 gesetzt werden dann gehts wieder
von Vorne an weiter.

X auf "0" setzen.

Viel Erfolg  Kurt

von Ralf (Gast)


Lesenswert?

ja sowas in der Richtung habe ich mir auch gedacht, darum habe ich den
Code jetzt so geändert:
So funktionierts jetzt auch einwandfrei - das einzige Problem was jetzt
halt noch besteht, ist das ich nicht schnell drücken darf, sondern dem
AVR zwischen den Schaltvorgängen ein bissi Zeit lassen muss.
Das ist aber wahrscheinlich ein Geschwindigkeitsproblem von Bascom her,
oder?

$regfile = "8535def.dat"
$crystal = 4000000

Config Portb = Output
Config Portd = Input

Portd = &B00000000
Portb = &B11111111

Debounce Pind.0 , 0 , Taster

Dim X As Byte
X = 0

Taster:

Do
If X = 0 And Pind.0 = 0 Then
X = 1
Portb.0 = 0
End If
If X = 1 And Pind.0 = 1 Then
X = 2
End If
If X = 2 And Pind.0 = 0 Then
X = 3
Portb.1 = 0
End If
If X = 3 And Pind.0 = 1 Then
X = 4
End If
If X = 4 And Pind.0 = 0 Then
X = 5
Portb.0 = 1
Portb.1 = 1
End If
If X = 5 And Pind.0 = 1 Then
X = 0
End If

Loop

von anfänger (Gast)


Lesenswert?

das wird wohl an dem debounce liegen. du kannst die entprellzeit aber
niedriger setzen. guck mal in die hilfe-datei. da steht das ganz gut
beschrieben.

oder machst du das vielleicht alles im simulator? der ist von natur aus
sehr langsam.

von Ralf (Gast)


Lesenswert?

nee lade das programm jedesmal in den avr
der legt sowieso hin und wieder ein sehr merkwürdiges verhalten an den
tag .....
wie gesagt die schaltung funktioniert, nur hin und wieder macht er was
ganz anderes wie das er beide leds einschaltet oder nur eine aus dann
gehts hin und wieder gleich nach der ersten wieder aus oder es blinkt
nur ....
aber meistens (vorallem wenn ich langsam drücke) funktioniert er ....

von Ralf (Gast)


Lesenswert?

hat wer ne idee woran das liegen könnte? (das komische verhalten)

von Sven (Gast)


Lesenswert?

Hi Ralf,

irgendwie ist die do loop schleife bei dir Falsch gesetzt, du willst
doch den Taster in permanent abfragen oder nicht ???
Probiers mal so, der kleine Code sollte genau das machen was du vor
hast....


$regfile = "8535def.dat"
$crystal = 4000000

Config Portb = Output
Config Portd = Input



Do

Debounce Pind.0 , 0 , Taster, sub
loop

Dim X As Byte
X = 0

Taster:
Incr X
Portb = 0

If x = 1 then
Set Portb.0
elseif x = 2 then
Set Portb.1
elseif x = 3 then
Set Portb.2
elseif x = 4 then
Set Portb.3
elseif x = 5 then
X = 0
End If

Return
End

Gruß

Sven

von Ralf (Gast)


Lesenswert?

hmm ..... auch nicht ganz das wahre
hab die debounce zeit auch schon geändert nützt aber auch nicht viel
hatte mich auch schon mit der do-loop schleife gespielt.
find einfach nicht den bug da drinnen

von Ralf (Gast)


Lesenswert?

Ha !!!!!

Ich hab des Rätsel´s Lösung

Ich erstell den Code ja mit dem Programm Bascom-AVR .....
...... und da war unter: Optionen -> Compiler -> Chip noch auf den
"alten" 2313 eingestellt !
Jetzt auf den 8535er umgestellt, funktioniert es ohne Fehler !!

Ist rein das Geschwindigkeitsproblem noch - aber das liegt entweder an
Bascom selber, oder an der Debounce Zeit welche auf 0,1 gestellt
wurde.

Thanks @ All für Eure Hilfe

von Ralf K (Gast)


Lesenswert?

Also "Toggle" funktioniert bei mir überhaupt nicht, hats noch nie ;-)
Somit muß ich die Pins immer mit "von Hand" schalten z.b. mit
"Porb.0 = 0" oder mit Set/Reset.
Denke mal das ist ein Bascom Fehler.
Ansonsten sollte es auch ohne "Debounce" klappen.

Hoffe mal das hilft dir weiter

lg Ralf

von Sven (Gast)


Lesenswert?

Hallo Ralf,

mmhh, der Code müßte eigentlich rennen wie nix....
Versuch doch mal eben unter den Compiler Settings auch die
Frequenz von 4 Mhz einzustellen, kann mir nur noch vorstellen,
das es daran liegt, evtl, sind hier 8Mhz eingetragen....
An Bascom selbst wird es nicht liegen...

Sven

von Ralf (Gast)


Lesenswert?

nein das kanns auch nicht sein - die sind nämlich schon eingestellt.
wie gesagt ohne probleme jedoch akzeptiert der avr kein schnelles
gedrücke ratlosbin

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.