Forum: Mikrocontroller und Digitale Elektronik PWM in Bascom lässt mich verzweifeln


von Franz (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein kleines Problem mit einem Tiny 2313 und einem PWM Programm.
Es soll eine Innenlichtdimmung fürs KFZ werden.
Ich habe Programm 1 geschrieben und in den Chip geladen. Es funktioniert 
ohne Probleme.
Jetzt habe ich das Programm 1 etwas erweitert. Ihr findet es als 
Programm 2 im Anhang.

Ich möchte mit 2 Tastern, zwei unterschiedliche Dimmgeschwindigkeiten 
erreichen.
Wenn ich jetzt aber Programm 2 in den Controller lade, geht nur das 
andimmen über Taster 1. Beim Drücken des zweiten Tasters, springt die 
LED sofort auf 100% Helligkeit, und dimmt dann mit der Geschwindigkeit 
runter, mit der sie eigentlich dimmen sollte, wenn der Taster 1 
losgelassen wurde. Ich weiß aber nicht was ich da falsch gemacht habe.

Könntet ihr bitte mal mit drüber schauen und mir sagen was ich falsch 
gemacht habe? Ich bin mit meinem Latein so ziemlich am Ende.

Vielen Dank

von Horst H. (horha)


Lesenswert?

Hallo,

Du hast
Dim A as Word ' deklariert

das ist keine gute Idee, wenn man auf kleiner 0 vergleicht, weil dies 
nie vorkommen kann.

Dim A as integer ' muesste es tuen

von Franz (Gast)


Lesenswert?

Danke, das werde ich gleich mal versuchen. Klingt auch ziemlich logisch 
wenn du das jetzt so sagst.

von Franz (Gast)


Lesenswert?

Habe es gerade in den Chip geladen mit A als Integer statt Word, leider 
kein Erfolg. Das Problem ist immer noch das gleiche. Woran könnte es 
denn noch liegen?

von Horst H. (horha)


Lesenswert?

Hallo,

Deine Programmlogik ist etwas seltsam.
Dank des Kopierens ohne Änderung der Kommentare, kann man sich die 
Arbeit auch schwieriger machen.
Du hast zwei Taster die nacheinander abgefragt werden, aber beide auf 
eine Variable wirken,wobei jede Taste auch eine entweder/oder 
Entscheidung hat.
Entweder aufdimmen oder abdimmen, unabhängig von der anderen Taste.
Es passiert also immer was, egal ob Taste gedrückt(=0)oder nicht.

wiederhole:

Falls Taster1 an PinD.5(0) aufdimmen + 5 sonst (1)abdimmen -1
Falls Taster2 an PinD.4(0) aufdimmen +10 sonst (1)abdimmen -10

Also ergibt sich auch sowas>
Keine Taste  gedrückt -> abdimmen mit -11
Beide Tasten gedrückt -> aufdimmen mit 15

Du sollest beide Tasten gleichzeitig verarbeiten, um Fehleingaben zu 
unterbinden

von Franz (Gast)


Lesenswert?

Hallo,

danke für deine Antwort. Ja das mit dem kiopieren un einfügen ohne 
Kommentare zu ändern ist mir auch aufgefallen, aber ich stecke zur Zeit 
recht tief in der ganzen Sache drin, deswegen weiß ich mittlerweile im 
Schalf welche Taster was bedeuten :-).

Ich habe es jetzt so probiert, das ich die beiden Programme als 
Subroutinen laufen lasse. Aber mit mäßigem bis keinem Erfolg.

Beide Tasten gleichzeitig verabrbeiten, das klingt zwar einfach, aber 
wie hast du dir das genau gedacht? Ich bin damit echt überfordert. Bei 
mir blockieren sich die Programme immernnoch gegenseitig.

von Hannes L. (hannes)


Lesenswert?

Franz schrieb:

> Beide Tasten gleichzeitig verabrbeiten, das klingt zwar einfach, aber
> wie hast du dir das genau gedacht? Ich bin damit echt überfordert. Bei
> mir blockieren sich die Programme immernnoch gegenseitig.

Nur mal so zum Querlesen:

http://www.mikrocontroller.net/attachment/74026/Seilbahn_Tn13_1.bas

...

von Horst H. (horha)


Lesenswert?

Hallo,

..wie habe ich mir das gedacht..

Was sollen Deine Tasten bewirken:
Wenn Taste1 gedrückt wird soll, solange sie gedrückt wird, aufgedimmt 
werden mit +5 beim loslassen automatisch mit -1 abgedimmt werden.
Wenn Taste2 gedrückt wird soll, solange sie gedrückt wird, aufgedimmt 
werden mit +10 beim loslassen automatisch mit -10 abgedimmt werden.

Wenn also eine TasteX gedrückt wird, dann dimme auf mit einem Wert z.B. 
DimmUp.Wenn diese losgelassen wird abdimmen mit einem Wert DimmDown.

Du erstellst Dir zwei Sub's
1
const UpperLimit = 1023
2
const LowerLimit = 0
3
....
4
DIM DimmUp as Byte,DimmDown as Byte,LetzteTaste as Byte
5
6
Declare Sub Aufdimmen
7
Declare Sub Abdimmen
8
...
9
10
sub Aufdimmen
11
A = A+DimmUp
12
IF A > UpperLimit then
13
  A = UpperLimit
14
end sub
15
16
sub Abdimmen
17
A = A-DimmDown
18
IF A < LowerLimit then
19
  A = LowerLimit
20
end sub
LetzteTaste speichert nun, ob keine (0) oder Taste1 (1) oder Taste2 (2) 
gedrückt gewesen war.
Zu Beginn ist LetzteTase = 0
1
Wiederhole diesen Kram:
2
Wenn letzteTaste <> 0 dann 
3
  Wenn Gedrückte Taste = LetzteTaste dann
4
    Aufdimmen 
5
  sonst 
6
    'Egal ob die andere Taste jetzt gedrückt wird, wird nichts gemacht
7
    'Erst wieder im nächsten Durchgang
8
    ' sonst abdimmen
9
    letzteTaste = 0
10
sonst
11
  Wenn Taste1 gedrückt dann
12
    ' Dimmwerte festlegen
13
    DimmUp = 5
14
    DimmDown =1
15
    'Taste merken
16
    LetzteTaste = 1
17
    Aufdimmen ' kann man auch weglassen dann fehlen 20 ms....
18
  sonst
19
    Wenn Taste2 gedrückt dann
20
      DimmUp = 10
21
      DimmDown = 10
22
      LetzteTaste = 2
23
      Aufdimmen
24
    sonst ' keine Taste gedrückt
25
      Abdimmen ' mit dem Wert , der vorher festgelegt war
26
Führe den PWM aus 
27
'und wieder von vorne

Damit wird auch bei gleichzeitigem drücken beider Tasten immer nur die 
erste das Rennen machen.Solange diese gedrückt bleibt ist die andere 
egal.Erst nach dem loslassen, kommen die andere zum Zug.

von Franz (Gast)


Lesenswert?

WOW,
großes Danke für die sehr kompetente Hilfe. Ich werde das morgen gleich 
mal in die Tat umsetzen.

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.