www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bascom - Frage


Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ???

Autor: Ralf (Gast)
Datum:

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

dieliebenrechtschreibfehler *g*

Autor: anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if pind.0 = 1 then toggle "led"

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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Hesse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Ich weiss nicht mehr genau wie BASCOM das macht.

Gruss
Andreas

Autor: Raimond (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kurt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Raimond (Gast)
Datum:

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

Genau, das hatte ich glatt übersehen.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kurt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kurt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ....

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hat wer ne idee woran das liegen könnte? (das komische verhalten)

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf K (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.