Drehgeber mit Bascom auslesen und PWM regeln

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 29 3 2024  11:45:06      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte

Gehe zu Seite ( 1 | 2 | 3 | 4 Nächste Seite )      


Autor
Drehgeber mit Bascom auslesen und PWM regeln
Suche nach: pwm (3609)

    







BID = 466043

Drecksack

Gesprächig



Beiträge: 154
 

  


Hallöchen.

ich bin jetzt in meinem roland walter buch so weit, daß ich bei der PWM bin. jetzt würde ich gerne, statt mit avr Term (ein Terminal programm) das ganze mit nem Drehgeber machen.

Es geht darum mit dem Terminal programm die Helligkeit der PWM-Led zu regeln. da ich aber kein Nullmodemkabel habe würde ich das Gerne mit nem
Drehregler machen.
Ich habe auch schon bei der Bascom hilfe Hilfe gefunden, aber ich schaff es glaube ich nicht:

- Ihn auszulesen
- Den ausgelesenen wert zu verarbeiten.(also den Timerwert um 1 zu
vergrößern bei rechtsdrehung, oder den Timerwert um 1 zu verkleinern
bei linksdrehung

Ist jemand so nett und würde mir unter die Arme greifen?

Der Drecksack

Hier mal das original Listing, daß ich auf Drehgeber abändern möchte


'0604.BAS: Einfacher D/A-Wandler, LED-Helligkeitssteuerung
'Hardware: Nullmodemkabel zum PC, Pin PD5 mit LED verbinden
'----------------------------------------------------------
$regfile = "m8def.dat" 'ATmega8-Deklarationen
$crystal = 3686400 'Quarz: 3,6864 MHz
$baud = 9600 '9600 Baud
'
On Timer0 Ontimer 'Timer0-Interruptroutine
Dim Helligkeit As Byte 'Timer0-Zeitwert
'
Ddrd.5 = 1 'Pin PD5 ist Ausgang
Tccr0 = &B00000100 'Timer0: Bits210=100: Quarz/256
Timsk.toie0 = 1 'Timer0-Overflow-Interrupt ein
'Config Timer0=TIMER,Prescale=256
'Enable Timer0 'Overflow-Interrupt ein
'----------------------------------------------------------
Helligkeit = 255
'Initial LED ganz hell
Sreg.7 = 1 'Interrupts global einschalten
Do 'Hauptschleife
If Ucsra.rxc = 1 Then 'Zeichen im UART-Puffer?
Helligkeit = Udr 'Neuer Helligkeitswert
End If
Loop
'----------------------------------------------------------
Ontimer:
Portd.5 = Not Portd.5 'LED wechselnd an/aus
If Portd.5 = 1 Then 'Wenn LED gerade an
Timer0 = 256 - helligkeit 'Timer zählt vorwärts!
Else 'Wenn LED gerade aus
Timer0 = Helligkeit 'Komplementäre Zeit
End If
Return
'[Listing zum AVR-Mikrocontroller-Lehrbuch von Roland Walter, www.rowalt.de]

BID = 466074

PhyMaLehrer

Schriftsteller



Beiträge: 908
Wohnort: Leipzig

 

  

Falls deine BASCOM-Version mindestens 1.11.7.7 ist, dann schau in der Hilfe mal unter ENCODER !

BID = 466077

Drecksack

Gesprächig



Beiträge: 154

Hallo

Genau so habe ich es gemacht.
Nur statt der Print anweisung habe ich lcd geschrieben, um das ganze auf ein LCD zu übertragen. (habe kein Nullmodemkabel) Das hat auch funktioniert.
Nur kam bei einer drehung "left rotation" und "right rotation" im wechsel. ich hatte erwartet, daß nur ein befehl kommt. Daß würde ja heißen, daß die Tasten nicht gscheit entprellt (sind sie ja eigentlich mit Portb ) oder was kann das sonst noch sein?
Verstehst was ich meine?
Hier mal mein encoder Versuchsprogramm

$regfile = "m8def.dat"
$crystal = 3686400
Config Lcdpin = Pin , Db7 = Portb.1 , Db6 = Portb.2 , Db5 = Portb.3 , Db4 = Portb.4 , E = Portb.5 , Rs = Portc.0
Config Lcd = 16 * 2
'-----------------------------------------------------------
Dim D As Byte

Portd.7 = 1
Portd.6 = 1

Do
Cursor Off
Lcd "Volume"

D = Encoder(pind.7 , Pind.6 , Links , Rechts , 1)

Lcd D
Waitms 10

Loop

End
'-----------------------------------------------------------
Links:

Cursor Off
Lowerline
Lcd "left rotation"
Waitms 100
Cls

Return

Rechts:

Cursor Off
Lowerline
Lcd "right rotation"
Waitms 100
Cls

Return

Programm macht folgendes:
Vor "volume" steht immer eine einstellige zahl, die sich mit dem Drehen des encoders ändert. Die zahlen von 0 - 3.
Wenn ich nach links oder nach rechts drehe, dann erscheint in sehr schnellem wechsel "left rotation" und "right rotation".


Wo liegt mein Fehler?
Was macht eingetlich die Zeile "dim B as Byte"
Und nochwas, was hälst du davon sich als anfänger folgendes Buch zu kaufen Buch

BID = 466079

Drecksack

Gesprächig



Beiträge: 154

Ähm, ich meinte dieses Buch.

BID = 466104

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Sry, aber ich würde bei 0 anfangen.


Also, Grundlagen von Basic lernen, alle Programmierer haben so angefangen, dass man erstmal ein wenig vor sich hinkrebst und dann konkrete Sachen schreibt. Du musst nicht gleich so hochgreifen - wenn du die Grundlagen beherrscht, die bei Basic sehr einfach sind, dann kannst du auch recht problemlos mit Bascom Ergebnisse erzielen.

Bascom nimmt dir bereits soviel ab, das glaubst du garnicht.

Achso, ich habe es schonmal aufgeschrieben:

Dim Variable As Datentyp

Das ist eine Variablendeklaration.

_________________

BID = 466162

PhyMaLehrer

Schriftsteller



Beiträge: 908
Wohnort: Leipzig

Also, im Moment habe ich auch keine Idee für den Fehler. Immerhin könntest du mal probieren, die beiden für den Drehgeber benutzten Eingänge mit je einem Kondensator abzublocken, falls es doch Kontaktprellen ist.
Ich habe selber noch keinen Drehgeber verwendet, wollte aber schon lange mal damit experimentieren und habe auch schon einen gekauft. Ich habe es halt nur noch nicht ausprobiert. Das könnte ich aber heute abend glatt mal machen und sehen, wie es bei mir läuft. Schon, weil ich keine Vorstellung davon habe, was die Variable (D = Encoder...) denn eigentlich für einen Wert liefert. Also mal sehen!

Für die Funktion des Programms ist es zwar völlig unerheblich, aber trotzdem der Hinweis: Der Befehl "Cursor Off" muß nur einmal gegeben werden und gilt dann bis auf Widerruf.

Das Buch mit den Sprachbefehlen habe ich auch.
Obwohl das technische Englisch nicht sooo schwer ist, fand ich es doch ein bißchen nervig, die englische Hilfe zu verwenden, da man diesen Text beim Suchen nach etwas Bestimmten nicht so leicht überfliegt wie einen deutschen Text. Auch hätte ich gern eine Übersetzung gehabt bei Dingen, die von der Sache her etwas schwieriger sind, um sicher zu sein, daß ich auch alles richtig verstanden habe.
Na ja, sehr oft habe ich das Buch bisher noch nicht verwendet. Gerade jetzt aber hatte ich ein kleines Problem, wo ich es befragt habe. Spaßeshalber bzw. weil ich eine Formulierung etwas seltsam fand, habe ich mit der englischen Hilfe verglichen. Tatsächlich war die Übersetzung an der suspekten Stelle mißverständlich und ein wichtiger Satz fehlte ganz.
Auch bei dem "Encoder"-Befehl habe ich gestern nachgesehen und eine, allerdings für das Programm unerhebliche und eher harmlose Ungenauigkeit gefunden. Es heißt in der Hilfe:
Some encoders also have a build in switch.
Manche Encoder haben auch einen eingebauten Schalter.
(Wenn man auf die Achse drückt, nämlich.)
Die Übersetzung war: Manche Encoder werden auch als Schalter verwendet.
Irgendwie ist das schon etwas anderes...
Also: Um schnell das Gewünschte zu finden, ist dieses Buch womöglich recht nützlich (und ich werde meines auch nicht wegwerfen), man sollte aber die englische Hilfe nicht ganz außer acht lassen.

Und als letztes (obwohl von DonComi schon erwähnt): Mit
Dim B as Byte
wird ein "Schubfach" für eine Variable im Speicher reserviert. Damit der Mikrocontroller weiß, wie groß die Dimension dieses Schubfach sein muß, teilst du ihm mit, daß die Variable nur ein Byte umfaßt. (Word z. B. wären zwei Bytes und Long sogar vier.)
Und zum Schluß wird ein "Etikett" mit dem Namen "B" der Variablen an das Schubfach geklebt, damit auch immer die richtige Lade geöffnet wird, wenn diese Variable gebraucht wird.

BID = 466183

Drecksack

Gesprächig



Beiträge: 154

Super erklärung Phymalehrer.
Wenn du magst, dann kannst du mir ja deine Ergebnisse mit dem Encoder schreiben, oder wie können sogar (falls ich mithalten kann) zusammen experimentieren...

@ Don comi
Danke für den Tip. Aber so wie du mir es erklärt hast, ist es ein bißchen schwierig zu verstehen. Unser Phy-Lehrer hat da schon ein Händchen dafür.
Du sagst immer ich sollte doch Basic von Grund auf lernen. Ja, dann sag mir doch bitte wo oder wie (buch oder Seite) ich habe zwar schon etwas gefunden, aber ich lasse mir gerne noch andere Möglichkeiten zeigen.

Ist das Buch mit den Befehlen nun für einen Anfänger kaufenswert oder eher nicht?
Gibt es ein Gutes Basic-lern buch? Bücher mag ich mehr als den TFT



Ach ja, ich könnte mir jetzt vorstellen, warum mein Prog so "komisch" rumtut.
Es ist so, daß wenn ich nach links drehe, schon IMMER zuerst left kommt und dann wechselt es ja "left right left right......". Wenn ich dann nacht rechts drehe dann kommt IMMER zuerst "right" und dann im wechsel mit left.
Das sagt mir, daß wenn ich mir die Pulse eines Encoders ansehe, daß das schon seine Richtigkeit hat.

Was ich mir ja gedacht habe ist:
Die drehimpulse des Encoders mit dem Timer zu zählen, in von
der Variable Helligkeit abzuziehen. Das sollte doch möglich sein oder ist das ein dummer Weg?

Der
Drecksack

PS: Muß jetzt aufräumen. Hab frei und die Freundin will es so. Mist

[ Diese Nachricht wurde geändert von: Drecksack am 24 Okt 2007 10:38 ]

BID = 466199

PhyMaLehrer

Schriftsteller



Beiträge: 908
Wohnort: Leipzig


Zitat : Drecksack hat am 24 Okt 2007 10:32 geschrieben :

Es ist so, daß wenn ich nach links drehe, schon IMMER zuerst left kommt und dann wechselt es ja "left right left right......". Wenn ich dann nacht rechts drehe dann kommt IMMER zuerst "right" und dann im wechsel mit left.
Das sagt mir, daß wenn ich mir die Pulse eines Encoders ansehe, daß das schon seine Richtigkeit hat.

Neeneenee, das kann nicht sein. Aus der Art und Weise, wie die gegeneinander versetzten Impulse am µC eintreffen, soll dieser ja erkennen, in welche Richtung gedreht wird.

Mal eine dumme Frage (bitte nicht hauen!): Hast du den dritten Anschluß des Drehgebers auch mit Masse verbunden?

BID = 466215

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Moin,

Mit meinem Dim Variable As Datentyp wollte ich es seeehr allgemein ausdrücken, dabei ging ich allerdings davon aus, dass du in etwa weist, was eine Variable und was ein Datentyp ist .
Also nichts für ungut,

http://www.tutorials.at/

Da habe ich auf die Schnelle etwas zu Basic gefunden und es sieht ganz gut aus. Mit den Grundlagen kannst du dann auch Bascom richtig bedienen; ich möchte ja nicht nur rummeckern


Im Datenblatt ist es ja beschrieben wie die PWM funktioniert: TCNTx zählt immer, (und zwar mit der Taktfreuqnenz/Vorteiler) und wird permanent mit dem OCR-Register verglichen. Ist der Vergleich positiv, dann wird der OCn-Pin gesetzt oder gelöscht, je nachdem, ob die PWM invertierend oder nichtinvertierend ist.

Nimmt man beispielsweise den einfachen PWM-Modus, in der der 8bit-Zähler immer von 0 bis 0xFF (0 - 255) zählt, dann findet irgendwann ein positiver Vergleich statt, der Pin wird 1 und wenn der Zähler wieder auf 0 ist, wird der Pin wieder gelöscht (kleinigkeit: ich weiß grad nicht, ob bei 255 oder bei 0 gelöscht wird, ist auch nebensächlich)

Ist also der Wert im OCR-Register 0x80 (128), dann ist das An-Aus-Verhältnis (Duty-Cycle) 50% und so weiter.

Wenn dein Drehimpulsgeber/Enkoder nun funktioniert, dann machst du das, wie du bereits richtig vorgeschalgen hast!, so:

Left:
OCR0 = OCR0 + 1 'etwas weniger
Return

Right:
OCR0 = OCR0 - 1 'etwas mehr
Return

Da wird dann quasi das Vergleichsregister inkrementiert/dekrementiert und der Dyte-Cycle ändert sich und damit auch die Helligkeit deiner Hintergrundbeleuchtung.

Dazu musste natürlich noch im Datenblatt nachschauen, oder in der Bascom-Hilfe, wie du die PWM korrekt einrichtet, also, welche Frequenz, welcher Modus des Timers und was mit Pin OCn gemacht werden soll.

Und da greifen die Grundlagen: Es wird dazu notwendig sein, gezielt Bits zu setzen und zu löschen. Das kann man mit Bitmasken und logischen Verknüpfungen machen. Hier allerdings sollte es ausreichen, die richtigen Bascom-Anweisungen zur Konfiguration zu nutzen, siehe Bascom-Hilfe (ich habe kein Bascom, kann daher nicht nachschauen )



_________________

BID = 466257

Drecksack

Gesprächig



Beiträge: 154

Register Ocn? noch nie gehört.

War gerade in der Bücherei und hab mir "programmieren für Dummies" geholt. (So ein Doofer name. Da kommt man sich ja toll vor wenn man sich programmieren für dummies auleiht)
Werde da mal meine ersten schritte in basic gehen und dann sehen wir mal weiter.
Danke für die Hilfe bis hierher.

Der Drecksack

BID = 466276

PhyMaLehrer

Schriftsteller



Beiträge: 908
Wohnort: Leipzig

Also im Moment bin ich etwas ratlos...
Ich habe zwar herausgefunden, daß der mit Masse zu verbindende gemeinsame Anschluß sich wohl in der Mitte befindet (anders als in der Hilfe-Abbildung), aber das bessert nicht viel. Kondensatoren zum Entprellen scheinen auch nichts zu bringen.
Wenn ich langsam drehe, stimmt die Richtungsanzeige zwar meistens, aber eben auch nicht immer.
Vollkommen schleierhaft ist mir die Bedeutung des Wertes, den der Befehl ENCODER zurückliefert und der bei mir zwischen 0 und 3 schwankt.

Sicher gibt es tolle Beispiele zur Lösung des Problems in Assembler, aber ich würde schon gern wissen, wie bzw. unter welchen Bedingungen der BASCOM-Befehl ENCODER funktioniert.

Da bleibt noch Raum für die Forschung...

BID = 466299

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Hallo,

OCR ist das Register für den Vergleichswert, n ist ein Index, der von Timer zu Timer unterschiedlich ist:

Beispielsweise ist OCR0 das Vergleichsregister von Timer0, OCR1 von Timer1 und OCRn von Timern (Je nach Ausstattung hat ein AVR mehrere Timer, verschieden große Timer und verschiedene Timermodi)

Zum Enkoder:
Das ist eben das Problem von Bascom: Es gibt tausend Befehle, aber keiner weis so recht, wie er funktioniert.

Also:
Der zurückgelieferte Werte entspricht einem dekodierten Graykode: So ein Enkoder spukt seine Werte graykodiert aus, jenachdem ob hoch oder runtergezählt wird wurde entweder nach links oder rechts gezählt. Das ist der Wert, den die Funktion Encoder zurückliefert, nehme ich mal stark an. Jetzt kann man das auch anders auswerten, z.b. über XOR-Verknüpfung beider Phasen und jeweils dem Wert, der eine Messung vorher gespeichert wurde.
Gibt es denn keine exakte Beschreibung und Konfiguration der Encoder-Funktion?


Zum Testen des Enkoders:
Vermutliche Belegung ausprobieren, indem ein Pin auf Masse, die anderen beiden über Widerstände 1-100kΩ gegen Plus gelegt werden. Diese beiden kommen dann an je einen Kanal am Oszi; dann wird probiert, wann ein Signal auf beiden Kanälen kommt, dass um einige ms (Millisekunden) phasenverschoben ist. Es gibt drei Möglichkeiten.

Viel Erfolg

_________________

BID = 466302

Drecksack

Gesprächig



Beiträge: 154

also bei mir ist der GND anschluß de (wenn die Pins zu mir zeigen) der rechte....
Und das mit dem Wert zwischen 0 und 3 ist/war bei mir auch so!

Wir geben nicht auf, gell?
Ich habe mir diesesBuch gerade online gekauft.
Was haltet ihr davon ? Ich bin noch der Totale anfänger.
Aber um meinen Traum, gleich nach diesem Satz, zu verwirlichen brauche ich kenntnisse in elektronik und µC

Traum (hoffentlich nicht ewig)
Mit dem µC ein Xicor Digialpoti anzusprechen, ein Lcd anzuschließen und das alles über ein Drehencoder Menü am LCD zu steuern (Lautstärke und solche Scherze, was ein Verstärker so halt hat)
Das ist mein Traum auf den ich hinarbeite.

Der Drecksack

BID = 466309

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Hallo Drecksack,

Das schaffst, keine Frage


Was meinst du, warum ich dsmit angefangen habe, µCs zu programmieren...
Ähnlicher Traum.


Nur konnte ich eben vorher schon C, habe aber auch mit Bascom gestartet, es dann aber eine Woche später entnervt entfernt und angefangen, AVR-Assembler zu lernen. Den kann ich zwar komplett (doch, das kann man so behaupten ), bin jetzt aber wieder bei C da das unter Linux viel Spaß macht und da C einfach flexibler als Basic und Maschinensprache ist.

Also, ich will dir damit nur sagen, wie weit dich so ein Traum bringen kann
Das kann dann auch über µCs hinausschießen, so wie bei mir grade.

Achso, eines ist aber unabdingbar: du musst öfter ins Datenblatt schauen, Bascom bringt zwar vieles mit, aber ohne Datenblatt wirst du einiges einfach nicht verstehen bzw. hardwarenahe Sachen (und im Prinzip ist das alles seeehr hardwarenah, nur Bascom verschleiert das) laufen einfach mit mehr Kenntnis besser , auch wenn das Datenblatt auf englisch ist.

_________________

BID = 466333

PhyMaLehrer

Schriftsteller



Beiträge: 908
Wohnort: Leipzig

Ich habe noch einen kleinen Versuch gestartet und das "originale" Programmbeispiel aus der Hilfe ausprobiert, bei dem die Ausgabe über die serielle Schnittstelle vor sich geht. Wie man sieht, funktioniert es. Bei jedem Einrasten des Drehgebers wird eine neue Zeile geschrieben und diesmal immer richtig.
Was die wechselnde Zahl, das Ergebnis dieses Befehls, bedeutet, kann ich mir aber nicht denken.
Na egal, jedenfalls könnte man nun in die "rechts"- und "links"-Programmteile Befehle einbauen, die gewisse Variablen vergrößern oder verkleinern, so daß der gewünschte Effekt eintritt.

Aber warum das mit dem LCD nicht klappt... ??




      Nächste Seite
Gehe zu Seite ( 1 | 2 | 3 | 4 Nächste Seite )
Zurück zur Seite 0 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 23 Beiträge im Durchschnitt pro Tag       heute wurden bisher 10 Beiträge verfasst
© x sparkkelsputz        Besucher : 180689432   Heute : 5328    Gestern : 12674    Online : 459        29.3.2024    11:45
5 Besucher in den letzten 60 Sekunden        alle 12.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.050999879837