www.mikrocontroller.net

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


Autor: Franz (Gast)
Datum:
Angehängte Dateien:

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

Autor: Horst Hahn (horha)
Datum:

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

Autor: Franz (Gast)
Datum:

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

Autor: Franz (Gast)
Datum:

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

Autor: Horst Hahn (horha)
Datum:

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

Autor: Franz (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: Horst Hahn (horha)
Datum:

Bewertung
0 lesenswert
nicht 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
const UpperLimit = 1023
const LowerLimit = 0
....
DIM DimmUp as Byte,DimmDown as Byte,LetzteTaste as Byte

Declare Sub Aufdimmen
Declare Sub Abdimmen
...

sub Aufdimmen
A = A+DimmUp
IF A > UpperLimit then
  A = UpperLimit
end sub

sub Abdimmen
A = A-DimmDown
IF A < LowerLimit then
  A = LowerLimit
end sub 
LetzteTaste speichert nun, ob keine (0) oder Taste1 (1) oder Taste2 (2) 
gedrückt gewesen war.
Zu Beginn ist LetzteTase = 0
Wiederhole diesen Kram:
Wenn letzteTaste <> 0 dann 
  Wenn Gedrückte Taste = LetzteTaste dann
    Aufdimmen 
  sonst 
    'Egal ob die andere Taste jetzt gedrückt wird, wird nichts gemacht
    'Erst wieder im nächsten Durchgang
    ' sonst abdimmen
    letzteTaste = 0
sonst
  Wenn Taste1 gedrückt dann
    ' Dimmwerte festlegen
    DimmUp = 5
    DimmDown =1
    'Taste merken
    LetzteTaste = 1
    Aufdimmen ' kann man auch weglassen dann fehlen 20 ms....
  sonst
    Wenn Taste2 gedrückt dann
      DimmUp = 10
      DimmDown = 10
      LetzteTaste = 2
      Aufdimmen
    sonst ' keine Taste gedrückt
      Abdimmen ' mit dem Wert , der vorher festgelegt war
Führe den PWM aus 
'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.

Autor: Franz (Gast)
Datum:

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

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.