? 7-Segment Ausgabe eines Drehgebers (BASCOM) ?

Um einmal auf denMotor zu kommen ich weiss es jetzt nicht ganz genau aber
Umdrehung Max. 20 - 50 Pro Min. Drehgeber also da 1:1 Übersetzt ist gleiche Drehzahl.

Hallo!

Na, alle Achtung!

20-50 U/min und das 1:1 auf den Drehgeber. :eek:

Bei 50 U/min sind das 180.000 Impulse pro Minute.... bzw. 3000 Impulse pro Sekunde.
Na hossa!

Mal eine ganz andere und bescheidene Frage....
Wofür brauchst du eine derart hohe Impulszahl? :hmmmm:

Ich könnte mir vorstellen, dass dein Drehgeber nicht zur Erfassung von Drehzahlen gedacht ist sondern eher für Winkeleinstellungen.
Bei Biegemaschinen für die Stahlindustire kann man sie gut verwenden. Allerdings setzt z.B. selbst eine Firma Peddinghaus auf Initiatoren direkt am Getriebe, um die Fehler gering zu halten.

Ich komm da ehrlich noch nicht richtig mit. :hmmmm:

Ach so....
Ging es hier eigentlich nicht um die Ansteuerung einer 7-Seg-Anzeige?
Vielleicht sollten wir den Titel des Thread mal ändern bzw. erweitern. ;)

Gruß,
Cassio
 
Kann den mir mal jemand auf die schnelle Erklären wo der Unterschied zwischen einem Interupt und einem PinChangeInterrupt ist ??:stupido3: ?????


Hi, noch mal!

Mach dir über die Unterschiede nicht so viele Gedanken. ;)
Es gibt nur ein paar Dinge die du beachten solltest.....

Der PCINT wird nicht von allen AVRs unterstützt.
Die "echten" Interrupts, wie z.B. der INT0, haben höhere Prioritäten als die PCINTs (siehe Vector-Tabelle im Datenblatt)!
Wenn ein AVR z.B. INT0 und INT1 hat, dann kannst du beim Auslösen eines Interrupts zu verschiedenen ISR`s (Interrupt Service Routine) im Programm springen.

Bei den PCINT`s ist das etwas anders.
Wenn z.B. im Datenblatt steht, dass es an den Pins des AVRs alternativ PCINT0 bis PCINT11 gibt, dann kannst du damit nicht 11 verschiedene ISR`s anspringen.... sondern nur Zwei!
Du kannst also nur jeweils das Register PCINT0 bzw. PCINT1 überwachen.
Dies hat NICHTS mit den beiden Pins am AVR zu tun!
Das Register PCINT0 überwacht z.B. die Pins PCINT0 bis PCINT7
Das Register PCINT1 überwacht dann die Pins PCINT8 bis PCINT11
Nur die beiden Register können einen Interrupt auslösen.
Anschließend musst du dann im Programm selbst "heraus finden" welcher der Pins die Flanke gewechselt hat.


Vielleicht ist es einfacher, wenn ich hier mal ein paar Codezeilen eintippe. ;)
Bei INT0 wäre also so:
Code:
'INT0 reagiert auf fallende Flanke
Config Int0 = Falling

'Bei einem Interrupt springe zu INT0_ISR
On Int0 INT0_ISR

Enable Int0
Enable Interrupts


Beim PCINT sieht das aber z.B. so aus:
Code:
Enable Pcint0

' Bei einem Interrupt, springe zur ISR Aktiv
On Pcint0 Aktiv

' Überwache PCINT 3, 4, 5 und 7
Pcmsk0 = &B1011_1000

Siehst du den Unterschied?
Du überwachst zwar per PCINT die Pins 3,4,5,7 kannst aber immer nur zur ISR Aktiv springen.
In der ISR Aktiv musst du dann erst mal prüfen, welcher deiner Pins denn nun für einen Interrupt gesorgt hat.
Zum Beispiel:
Code:
Aktiv:

If Pina.3 = 0 Then....

Elseif Pina.4 = 0 Then...

Elseif Pina.5 = 0 Then...

Elseif Pina.7 = 0 Then....

Else
End if

Return


Ich hoffe, der "Crashkurs" war soweit verständlich. ;)

Gruß,
Cassio
 
Abfrage eines Drehendcoders mit hoher Impulszahl

Hallo Cassio

Ach so....
Ging es hier eigentlich nicht um die Ansteuerung einer 7-Seg-Anzeige?
Vielleicht sollten wir den Titel des Thread mal ändern bzw. erweitern.

Mir geht es Haupsächlich um die Auswertung des Drehgebers, wobei ich hier
die Hoffnung hatte mit 7Segment ein wenig schneller zu sein als bei LCD wiel meiner
Meinung nach BASCOM doch ein zeimlich Mächtigen Code Erzeugt für die Ansteuerung
von LCDs.
Währe vieleicht gar nicht so falsch den Titel des Thread zu ändern in z.B. abfrage
eines Drehendcoders mit hoher Impulszahl, wobei man den dann ja auch in einer
anderen Kategorie einordnen müsste ;) .

Es geht hier ja um die Erfassung eines Winkels, muss den Motor ja dann
sowieso mit unterschidlichen Drehzahlen am lufen haben, da könnte man ja mal
schauen das die Drehzahl nicht zu hoch wierd, um aber eine genaue aussage
über die Drehzahl zu machen muss ich mir den Motor noch einmal anschauen
den habe ich natürlich im Moment nicht vor Ort kann mal so zum Wochenende
danach schauen.

Mal eine andere Frage: Hat jemand Erfahrung mit unterschiedlichen
Ansteuerung von LCDs Betreffend 4- bzw 8Bit, macht das einen sehr grossen
Geschwiendigkeits Unterschied oder tut sich da nicht viel :stupido3: ???
Ich habe die LCDs bis her immer nur im 4Bit Modus Angesteuert, kann
mir aber Vorstellen das 8Bit zumindest einwenig schneller ist (doppelt so Schnell)???
 
Währe vieleicht gar nicht so falsch den Titel des Thread zu ändern in z.B. abfrage eines Drehendcoders mit hoher Impulszahl

Hallo Uwe!

Ich habe dann den Titel mal etwas angepasst.... und damit kann er auch in der Kategorie verbleiben. ;)



Mal eine andere Frage: Hat jemand Erfahrung mit unterschiedlichen
Ansteuerung von LCDs Betreffend 4- bzw 8Bit, macht das einen sehr grossen
Geschwiendigkeits Unterschied oder tut sich da nicht viel :stupido3: ???
Ich habe die LCDs bis her immer nur im 4Bit Modus Angesteuert, kann
mir aber Vorstellen das 8Bit zumindest einwenig schneller ist.

Einfache LCDs habe ich bis jetzt auch noch nicht im 8Bit-Modus betrieben..... nur eben die GLCDs.

Ich dachte aber, du wolltest lieber bei den 7-Segment-Anzeigen bleiben, weil du die besser ablesen kannst. :hmmmm:

Noch mal zurück zu den 3000 Imp./sek. !
WAS machst du mit der Angabe? Winkel bestimmen? :hmmmm:
Für mich klingt das nur nach Drahzahl und nicht nach Winkel. :rolleyes:

Irgendwie komme ich da immer noch nicht mit. Sorry! :stupido2:

Gruß,
Cassio
 
Hallo Cassio ;)

Werde mal Versuchen das Verständlich rüber zu bekommen !!
Der Motor ist an einem Drehbankfutter angeschlossen und soll nach einer Gradzahlangabe
diese Position Anfahren, wobei hier die Geschwiendigkeit nicht so wichtig ist.
Dient dafür z.B. um auf einem Selbsgedrehtem Handrad eine Strichteilung von
z.B. 200 Teilstrichen anzubringen oder z.B. um eine Flanschteilung mit xbeliebiger
Teilung Anzuvertigen wobei es ja darauf Ankommt das bei mehreren Flansche diese auch genau Passen.
 
Hi!

Also doch nur ein mitzählen der Winkel in 0,1Grad Schritten......
Die Drehzahlangabe ist dann also völlig uninteressant!

Hatte mich schon gewundert, warum du bis zu 50 mal in der Minute von 1,0 Grad bis 360,0 Grad zählen willst. ;)

Also können wir die Drehzahl erst mal völlig außer Acht lassen. Ist eine absolut sekundäre Angabe, die nichts mit dem Einstellen des Winkels zu tun hat.
Natürlich musst du heraus finden mit welcher maximalen Geschwindigkeit du deine Winkel anfahren kannst, um auch nicht einen einzigen 0,1Grad Schritt zu verschlucken. Das ist aber etwas anderes....

Nun mache ich mir gerade meine Gedanken um die Genauigkeit.
Wenn du nun am Positionsmotor direkt deine Erfassung machst kannst du aber nie sicher sein, ob das auch der Realität entspricht.
Wie ich oben schon erwähnt habe, werden bei Profimaschinen deswegen die Winkel extern erfasst.
Wenn nun aber eine feste Getriebeverbindung keine Differenzen zulässt, dann kannst du natürlich auch dein Drehgeber dort benutzen.
Trotzdem kann es dann immer noch zu Differenzen zwischen der Software und der Realität kommen. Dies musst du also ausschließen und immer wieder kontrollieren.
Wenn dein Drehgeber dem AVR mitteilt, dass er 900 Schritte rechts gezählt hat, dann muss das Werkstück auch genau 90Grad gedreht worden sein.....
und nicht 89,9 oder 90,1 !

Es muss also immer wieder ein Abgleich zwischen Realität und Software erfolgen. Keine Ahnung, ob alle 45 Grad dafür ausreichen würden? :hmmmm:


Bin ich gedanklich nun auf dem richtigen Weg, oder passt irgend etwas immer noch nicht?
Denke immer noch an die Drehzahlangabe, die ich in meinem Kopf nicht unter bekomme. ;)

Gruß,
Cassio
 
Habe hier mal ein Schaltungsbeispiel zum Ansteuern eins LCDs mit 8Bit,
hoffe mal das daß so richtig ist.:rolleyes:

Ist nicht von mir sondern aus dem Netz!!
 

Anhänge

  • 600px-Lcdmodul_8bit_schem.jpg
    600px-Lcdmodul_8bit_schem.jpg
    38,5 KB · Aufrufe: 10
Hallo !

Nun ja, ein LCD mit 8bit zu betreiben ist vom Anschluss her nicht anders als bei 4bit..... außer das diesmal DB0 - DB3 nicht auf GND sondern mit dem AVR verbunden werden.

Das Problem wird dann eher im Programmcode liegen.
Man kann zwar mit
Config LCDBUS = 8
auf einen 8bit Modus wechseln......
Ich bin aber der Meinung, dass dies etwas anderes ist.

Kannst es ja mal probieren. ;)


Allerdings.... was bringt es dir, die Anzeigegeschwindigkeit zu erhöhen?
Willst du immer noch alle 360Grad einer Umdrehung in Zehntelschritten am Display ausgeben? :hmmmm:

Ich gebe es bald auf...... verstehe es einfach wohl immer noch nicht!

Gruß,
Cassio
 
Hallo Cassio :D

Natürlich bleibt mir nichts anderes übrig als alle Impulse auszuwerten damit ich auch alle Positionen anfahren kann, muss ja hauptsächlich sehen das ich
mit der Drehzal zurechtkomme.

Hier mal eine Ide wie das aussehen könnte :

Init.

Meneu

1.Anfahren der Grundposition nach Tastendruck mit hilfe des Indexsignals was nur einmal Pro
Umdrehung kommt Stop des Motors bei erreichen des High-Pegels, bzw zurückfahren wenn Index
überfahren wurde.

2.Eingabe der Gradzahl und Anfahren der Position nach Aufforderung etw. eingabe einer weiteren
Gradzahl Berechnung ob links oder rechtsherum Gefahren werden soll (kürtzerer Weg)
bei überfahren der Position langsam zurück bis Position dann erreicht ist.

3.Anfahren einer Festgelegten Position bzw. einer Festen Teilung wobei bei einem weiteren
Tastendruck die nächste Position angefahren werden soll (Tastendruck da ja der Bearbeitung-
szeitraum unterschiedlich ist) bis Ende erreicht ist, bei einer 4er Teilung z.B. nach dem
5ten Schriett wieder Grundposition usw. je nach Teilung

4.Gleich wie 3.Punkt nur mit andere Teilung 4,6,8,10er Teilung sowie weitere Punkt im Meneu

5.......

6.......

?? Letzter Menuepunkt auswertung nur des Indexsignals zwecks einer Drehzahlangabe


Ich weiss zwar noch nicht was davon zu Realisieren ist werde aber alles versuchen
um zum Ziel zu kommen.
Habe mal geschaut, habe noch ein LCD 1*8 mit SPI Schniettstelle, Controller 2mal
COP472WM-3, vieleicht auch einwenig schneller Anzusprechen, wenns den
daran liegt.
 

Anhänge

  • COP472-3.pdf
    149,2 KB · Aufrufe: 3
  • Display1.jpg
    Display1.jpg
    11,8 KB · Aufrufe: 4
  • Display2.jpg
    Display2.jpg
    23,6 KB · Aufrufe: 7
Habe hier mal noch Bilder gemacht.:)

Weiss zwar auch noch nicht wie ich das Ansteuern kann wierd wohl auch noch
eine grosse Hürde sein aber ich glaube das daß machbar währe.:confused:

Pinbelegung Disply:

1 Serial data Input
2 Serial clock Input
3 Chip Select 1
4 Chip Select 2
5 Beleuchtung +
6 +5V
7 GND

Veileicht hat ja mal jemand so ein Display schon mal Angesteuert ??
 

Anhänge

  • Display3.jpg
    Display3.jpg
    88,6 KB · Aufrufe: 6
  • Display4.jpg
    Display4.jpg
    40 KB · Aufrufe: 4
  • Display6.jpg
    Display6.jpg
    58,5 KB · Aufrufe: 3
  • Display7.jpg
    Display7.jpg
    76 KB · Aufrufe: 2
Hallo zusammen,

um das Rätsel mal aufzulösen ...
Meiner Meinung nach wird das sowas ... http://www.youtube.com/watch?v=KiQ47kzC4K8

Also ein Drehtisch mit Futter drauf um bei einer Fräse mit einer 4ten Achse
auch zB Schnecken, Handräder, ... zu bearbeiten.
Das geht dann einfacher als im xyz-Koordinatensystem. Und da man natürlich
nicht bis zum Sanktnimmerleinstag auf das Werkstück warten will und auch eine
bestimmte Bearbeitungsgeschwindigkeit benötigt damit die Werkzeuge nicht
hinüber gehen (Kühlung über die abtransportierten Späne) benötigt man auch
eine gewisse Verfahrgeschwindigkeit.

@Uwe ... richtig so ?

Gruß
Dino
 
Danke Dino3 :pleasantry:

Nicht ganz so, Futter befindet sich noch auf der Drehbank und soll dort auch
verbleiben, wierd nur der orginale Antreib ausgekuppelt und der andere Motor
eingekuppelt. Eine 4te Achse für eine Fräse kann man ja auch über die Soft
ansteuern, da brauchte mann nicht soviel Aufwand für machen ausser einen
kräftigen Motor zum Drehen.

Verfahrgeschwindigkeit für mein Projekt nicht Relevand, solte halt nur nicht
10min. dauern bis Position erreicht ist.
 
Hallo zusammen!

Nun ja, dass es sich um eine Drehbank (oder ähnliches) geht, hatte ich mir schon gedacht.

Trotzdem frage ich mich immer noch, warum ihr an den Geschwindigkeiten der AVR`s, der Drehzahl, der Verarbeitungszeit und so weiter rumrätselt. :hmmmm:
In einem gewissen Sinne ist das dann doch alles Sekundär.

Ich würde daher sagen.... fang erst mal an und dann sehen wir weiter. ;)

Grüße,
Cassio
 
Hallo Uwe,
ich habe dir gerade mal eine etwas schräge Version zusammengeschustert.
Probier doch mal aus, was die macht.
Es wird nur ein ext. Interrupt benutzt, der zweite geht über die Abfrage des Pin-Wertes ein. Dadurch wird die Drehrichtung bestimmt.
Es werden keine Strings benutzt, weil die viel zu langsam sind.
Du musst die Ausgänge noch überprüfen, ich habe jetzt einfach einmal irgendwelche genommen.

Code:
$hwstack = 48                                               ' default use 32 for the hardware stack
$swstack = 10                                               ' default use 10 for the SW stack
$framesize = 40

'-------------------------------------------------------------------------------
'
$regfile = "m8def.dat"
$crystal = 16000000
$LIB "mcsbyte.lbx"
Config Pind.2 = Input                                       'Phase_a auf INT0
Config Pind.3 = Input                                       'Phase_b
Config Pind.4 = Output                                      'einer
Config Pind.5 = Output                                      'zehner
Config Pind.6 = Output                                      'hunderter
Config Pind.7 = Output                                      'tausender
Config PortB = Output                                      'Segmente

Portd.2 = 1                                                 'enable Portd pullup's
Portd.3 = 1
Phase_a Alias Pind.2                                        'INT0 also connected to Pind.2 = INT0
Phase_b Alias Pind.3

Dim X_0 As Byte , X(11) As Byte
Dim I As Byte
Dim Einer As Byte , Zehner As Byte , Hunderter As Byte , Tausender As Byte

Config Int0 = Rising
On Int0 Phase_a_edge                                        'ISR on rising edge
Enable Int0
Enable Interrupts

Restore Segmente
Read X_0
For I = 1 To 10
   Read X(i)
Next I

Do
   Portb = 0
   Portd.7 = 0
   Portd.4 = 1
   Portb = X(einer)
   Waitus 1
   Portb = 0
   Portd.4 = 0
   Portd.5 = 1
   Portb = X(zehner)
   Waitus 1
   Portb = 0
   Portd.5 = 0
   Portd.6 = 1
   Portb = X(hunderter)
   Waitus 1
   Portb = 0
   Portd.6 = 0
   Portd.7 = 1
   Portb = X(tausender)
   Waitus 1
Loop
End

Phase_a_edge:                                               'Interrupt on rising and falling edge
   If Phase_b = 0 Then                                      'Uhrzeigersinn
      If Einer = 0 Then
         Einer = 10
         If Zehner = 0 Then
            Zehner = 10
            If Hunderter = 0 Then
               Hunderter = 10
               If Tausender = 0 Then
                  Hunderter = 6
                  Tausender = 4
               End If
               Decr Tausender
            End If
            Decr Hunderter
         End If
         Decr Zehner
      End If
      Decr Einer
   Else
      Incr Einer
      If Einer = 10 Then
         Einer = 0
         Incr Zehner
         If Zehner = 10 Then
            Zehner = 0
            Incr Hunderter
            If Hunderter = 6 And Tausender = 3 Then
               Hunderter = 0
               Tausender = 0
            End If
            If Hunderter = 10 Then
               Hunderter = 0
               Incr Tausender
            End If
         End If
      End If
   End If
Return

Segmente:
' DP dummy 0 1 2 3 4 5
Data &B00111111                                             '0
Data &B00000110                                             '1
Data &B01011011                                             '2
Data &B01001111                                             '3
Data &B01100110                                             '4
Data &B01101101                                             '5
Data &B01111100                                             '6
Data &B00000111                                             '7
Data &B01111111                                             '8
Data &B01100111                                             '9
Data &B00000000                                             ': aber eigentlich ein Leerzeichen

HBA
 
Hi HBA,

Hallo Uwe,
ich habe dir gerade mal eine etwas schräge Version zusammengeschustert.
Probier doch mal aus, was die macht.
Es wird nur ein ext. Interrupt benutzt, der zweite geht über die Abfrage des Pin-Wertes ein. Dadurch wird die Drehrichtung bestimmt.
Es werden keine Strings benutzt, weil die viel zu langsam sind.
Du musst die Ausgänge noch überprüfen, ich habe jetzt einfach einmal irgendwelche genommen.
Das heißt doch das du nur auf die Flanken von einem der beiden Signale
triggerst. Damit halbiert man allerdings dann die 3600 Impulse/Umdrehung
auf 1800 wenn man das Diagramm im Beitrag #8 im Thread zugrunde
legt. Es geht also kein Weg an 2 Interrupts drum herum. Und am besten
INT0 und INT1 und nicht die PCINTs weil die die höchste Priorität besitzen
und man damit sichergehen kann das einem keine Impulse durch die Lappen
gehen. Eventuell könnte ich meine Assembler-Routinen dafür anpassen.
Allerdings bin ich die nächsten paar Tage ziemlich "Land unter" :eek: :eek:
Zu finden sind sie allerdings beim Projekt-Beitrag vom Mega32-Bastelboard
von mir. Allerdings dort noch mit Entprellung. Die müßte man rausnehmen
und die Routine für die beiden ISRs aufteilen.

Gruß
Dino
 
Hi Dino!

Teilen sich die Impulse nicht sowieso auf? :hmmmm:

Um die Drehrichtung richtig zu erfassen und einen Stritt weiter zu zählen, benötigt er ja vier Takte.
Ergo werden aus den 3600 Impulsen im Programmcode später sowieso nur 900 verwertbare........ oder bin ich nun gedanklich falsch abgebogen?

Gruß,
Cassio
 
Hi Cassio,

Teilen sich die Impulse nicht sowieso auf? :hmmmm:
reine Definitionssache ...

Um die Drehrichtung richtig zu erfassen und einen Stritt weiter zu zählen, benötigt er ja vier Takte.
Ergo werden aus den 3600 Impulsen im Programmcode später sowieso nur 900 verwertbare........ oder bin ich nun gedanklich falsch abgebogen?
nicht unbedingt ...

die beiden Phasensignale bilden zusammen einen Graycode. Die Richtung
erkennt man durch den Vergleich der letzten Stellung mit der aktuellen.

Also so als ob man immer 1-2-3-4-1-2-3-4-1-2-3-4 zählt.
Man kann ja auch zB 1-2-3-4-1-2-3-4-3-2-3-4-1-2-3-4 zählen ...
An der rot markierten Stelle wechselt die Richtung zwischendurch ein wenig.

Wenn man natürlich nur auf die Einsen in der Zahlenkolonne achtet dann hat
man nur noch ein Viertel der Impulse übrig. Wenn man aber alle Codes nimmt
dann hat man volle 3600 Impulse.

Gruß
Dino
 
Hi Dino!

Ja klar.... der Drehgeber gibt die vollen 3600 Impulse raus.
Ich muss aber ja eine gewisse Zahlenfolge "beobachten" um die Richtung zu definieren.

Also zum Beispiel:
Rechts= 3-2-0-1
Links= 3-1-0-2

Wenn ich nun im Programm auf die Null achte, dann habe ich die eindeutige Richtung.... aber auch nur ein Impuls von Vier.

Frage mich aber sowieso immer mehr, warum man dafür einen Drehgeber benutzen muss.
Letztlich muss ich mindestens eine definierte Stelle haben (z.B. 0 Grad) und dann kann man doch mit einer Filterscheibe und einer Lichtschranke die Impulse zählen.

Egal..... wird schon passen. ;)

Gruß,
Cassio
 
Wenn ihr euch nur den Zustand der beiden bits anseht, dann kann man natürlich daraus nicht die Drehrichtung ableiten. Wenn aber einer gerade den Wechsel macht, dann kann man aus dem Wert des anderen einfach die Drehrichtung ableiten.
Der Geber hat nach meiner Kenntnis übrigens 3600 Impulse pro Umdrehung für jeden Kanal. Deshalb werden es 3600 steigende Flanken pro Umdrehung sein.

HBA
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)