Forum: Mikrocontroller und Digitale Elektronik PIC 12F675 Tastendruckzeit auswerten


von Bernd K. (bernd_k74)



Lesenswert?

Hallo
Um einen Drehkondensator an einer Magnetantenne zu drehen, habe ich 
einen Schrittmotor eingesetzt.
Jetzt hatte ich das Problem, dass der Motor nicht über die beiden 
Endschalter fahren soll.
Mit einem PIC12F675 habe ich einen Impulsgeber "programmiert". War 
tagelange Arbeit und habe noch nicht so richtig verstanden, wie es 
funktioniert. Klappt aber, wie ich mir das vorstelle.
Jetzt möchte ich das ganze aber noch optimieren.

Assembler war bisher nicht meine Welt.
Hätte da ein paar Fragen.

Meine Schaltung gibt z.Zeit Impulse ab von etwa 25ms Abstand. Das reicht 
um den Schrittmotor fein zu verfahren.
Der Motor hat 200 Schritte und ist 1:5 untersetzt.
Um vor einem Ende zum andern zu kommen, benötige ich etwa 500 Schritte.
(Halbe Umdrehung)
Das dauert nun schon etwas lange mit der Feinverstellung.

Durch längeres halten der Taste würde ich gerne die Geschwindigkeit 
erhöhen.
Habe mir des so vorgestellt, dass mit dem ersten Tastendruck ein Timer 
anläuft, der nach etwa 2 Sekunden Taste halten, ein anderes 
Unterprogramm aufruft, um dort schnellere Takte zu erzeugen. (Wait)

Hat einer einen Vorschlag für mich?
Wie realisiere ich im Assembler:
Wenn Taste gedrückt call UP1, wenn Taste lange gedrückt call UP2?

;*******************************************************************
Noch eine Frage dazu:
Wie kann ich aus dem Datenblatt auslesen, welchen Datenbereich ich für 
Variablen nutzen kann?
loop EQU 0x20 war im einem Beispiel vorgegeben.
Finde aber die Adresse nicht im Datenblatt, weil ich nicht weiß, wie ich 
es lesen soll.

Jetzt bin ich über den Befehl RES gestolpert, der das Problem lösen 
würde, aber mein Verständnis für die Funktion nicht erweitern würde.

Weiß einer Rat für mich?
Ach ja, alle Suchmöglichkeiten via google habe ich bereits ausgeschöpft.

Assembler für DUMMYS, gibt leider nicht...... :-)

Danke, dass ihr bis hierher schon mal gelesen habt.
:-)

Gruß Bernd

von Jürgen D. (poster)


Lesenswert?

In jedem PIC Datenblatt gibt es ein Teil der nennt sich "MEMORY 
ORGANISATION"
Da steht der ganze Speicher drinne. Den normalen RAM kanst du komplett 
nutzen.

von Bernd K. (bernd_k74)


Lesenswert?

Jürgen D. schrieb:
> In jedem PIC Datenblatt gibt es ein Teil der nennt sich "MEMORY
> ORGANISATION"
> Da steht der ganze Speicher drinne. Den normalen RAM kanst du komplett
> nutzen.

Hallo Jürgen
Danke für die schnelle Antwort.
Ich habe "General Purpose Registers accesses 20h-5Fh 64 Bytes" gefunden.
Ist das der richtige Bereich?
Mein Problem immer noch: Wie liest man das?
HEX???
20h entspricht 0x20? Richtig?
5FH entspricht ????
Vielleicht war ich bei Hexadezimal vor 40 Jahren in der Schule mal 
gerade nicht da. :-)

Bedeutet die Angabe ich könnte 64 mal 8 Bit belegen?
64 Variablen die 8 Bit breit sind? (0 bis 255)

b'0001 0100' (0x20 oder 20h) wäre die erste Adresse im RAM?
Woher weiß der Compiler, dass ich das RAM adressieren will?
Z.B. loop equ 5xFh, oder 0x24
Wann oder muß ich überhaupt die Bank 0 oder Bank1 auswählen, oder 
funktioniert das selbstständig?

Vermute mal bei Assenbler funktioniert nichts selbstständig. :-))

Sorry, DUMMY halt noch, aber ich arbeite daran. :-)
Programmiere schon lange VBA und Codesys, das ist aber weit von der 
Hardware entfernt.

Gruß Bernd

von Stefan (Gast)


Lesenswert?

20h ist Dezimal 32
5Fh ist Dezimal 95

von Bernd K. (bernd_k74)


Lesenswert?

OK
Danke Stefan
Jetzt habe ich das zumindest verstanden.
Liegen die Adressen nun alle in einer Bank?

Gruß Bernd

von Chris B. (dekatz)


Lesenswert?

Bernd Kunz schrieb:
> Liegen die Adressen nun alle in einer Bank?

0x20...0x5f (64 Bytes) liegen in einer Bank (BANK 0).
Auf dieses RAM kann auch von BANK1 aus zuggriffen werden ohne das man 
die Bank umschalten muss da diese Adressen in den Bereich 0x0a...0xdf 
gespiegelt werden.

Bernd Kunz schrieb:
> Woher weiß der Compiler, dass ich das RAM adressieren will?

Weil nur auf das RAM direkt zugegriffen werden kann. Es gibt PIC welche 
auch auf den Flashspeicher zugreifen können, die geht allerdings nur 
über Umwege. Dies gilt auch für das EEPROM beim 16F675 - geht nur über 
diverse Controllerregister.

Bernd Kunz schrieb:
> Wann oder muß ich überhaupt die Bank 0 oder Bank1 auswählen, oder
> funktioniert das selbstständig?

Bei den Controllerregister MUSST du die richtige Bank auswählen, sonst 
landest du im oft/meist im "Grünen".

von Bernd K. (bernd_k74)


Lesenswert?

Hallo Chris
Danke
OK, so langsam glaube ich manches zu verstehen.
Kontrollregister werden während der Laufzeit des Programms normal nicht 
mehr verändert. Oder?
Sind einfach Konfigurationen, die vorher vereinbart werden.

Der Flashspeicher nimmt die eigentliche Programmierung auf und nicht die 
während der Laufzeit veränderlichen Daten. Dort wären z.B. auch 
Konstanten angesiedelt.

Das hier sind dann die flüchtigen Daten.
Habe gerade gelesen, dass ich Variablen auch mit:
CBLOCK 0x20
       Variable1
       Variable2
       .......
EndC


Dann muss ich die genauen Adressen nicht unbedingt kennen.
Nur die Anfangsadresse.
Werde ich mal in mein Programm einbauen und testen.

Gruß  Bernd

von Ottmar K. (wil1)


Angehängte Dateien:

Lesenswert?

Bernd Kunz schrieb:
> Mein Problem immer noch: Wie liest man das?
> HEX???
> 20h entspricht 0x20? Richtig?

Hallo Bernd
Lade einfach die Seite runter, der Rechner funktioniert auch als "stand 
allone" [http://www.edv-beratung-thomas.de/ag-umrechner.htm]

mfG Ottmar

von Bernd K. (bernd_k74)


Lesenswert?

Hallo Ottmar
Danke.
Der Windowsrechner lässt sich auf Programmierer umstellen.
Habe nur zu wenig damit zu tun gehabt.
Wenn man verstanden hat worum es geht kann man es auch berechnen.

Jetzt kann ich mich dem eigentlichen Problem, der Taste widmen.

Der MPLAB-Simulator funktioniert jetzt auch.
So viele kleine Probleme, die einen den Überblick verlieren lassen.

Danke, noch für eure Antworten zum Thema RAM-Adressen.

Keiner eine Idee zum Thema Taste und Betätigungszeit?
Eine Taste, zwei Unterprogramme?

MfG Bernd

von Ottmar K. (wil1)


Lesenswert?

Hallo Bernd
als einfachstes Modell habe ich das mal skizziert. Der Schritt wird bei 
kurzeum Tastendruck um 1 erhöht, bei anhaltendem Tastendruck in 
5erschritten. Must halt auch noch ein bisserl überlegen, weil ganz 
perfekt ist die Routine noch nicht. Delay50ms oder eine sonst passende 
Zeitverzögerung musst Du Dir noch selbst erstellen.

SetSteps             ;Unterprogramm zur Tastenabfrage

;Pull Ups sind aktiviert
;Taste am Eingang GPIO,0
;Tastendruck zieht GPIO,0 nach GND

clrf Steps

SetSteps_Warten:
btfsc   GPIO,0           ;Taster gedrückt?
  GOTO   SetSteps_Warten  ;Nein weiter warten
  CALL   Delay50ms        ;Ja, kurze Verzögerung zum Entprellen
  incf   Steps,f          ;Schrittweite  = 1
  CALL   Delay50ms       ;Zeit zum Loslassen der Taste
  btfsc  GPIO,0          ;Taste immer noch gedrückt?
  GOTO   SetSteps_Ende   ;Nein, aktuelle Schrittweite ist zugewiesen
                         ;   und Sub verlassen
SetSteps_plus5:          ;JA, Steps bei anhaltendem Tastendruck
                         ;   alle 50ms +5
  clrf  Steps            ;Start mit 0+5
  movlw d'5'
  addwf Steps,f
  CALL  Delay50ms       ;Zeit zum Loslassen der Taste
  btfss  GPIO,0         ;Taste immer noch gedrückt?
  GOTO  SetSteps_plus5  ;Ja, nochmals Steps + 5
SetSteps_Ende:          ;Nein Steps wurde fertig Wert zugewiesen
 RETURN

mfG Ottmar

von Ottmar K. (wil1)


Lesenswert?

Korrektur, clrf  Steps war am falschen Platz!

  clrf  Steps          ;JA Start mit 0+5 (so stimt's)
SetSteps_plus5:
  movlw d'5'           ;Wert um Steps zu erhöhen
  addwf Steps,f         ;Steps bei anhaltendem Tastendruck
  CALL  Delay50ms       ;Zeit zum Loslassen der Taste
  btfss  GPIO,0         ;Taste immer noch gedrückt?
  GOTO  SetSteps_plus5  ;Ja, nochmals Steps + 5
SetSteps_Ende:          ;Nein, mit Steps = Wert Sub verlassen
 RETURN

mfG Ottmar

von Bernd K. (bernd_k74)


Lesenswert?

Hi
Danke Ottmar
Ich sehe mir das mal genauer an um zu verstehen wie das funktioniert.
Kann etwas dauern. :-)
Habe Nachtschicht, da bin ich etwas schwer von Begriff. ;-)

MfG Bernd

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.