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
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.
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
OK Danke Stefan Jetzt habe ich das zumindest verstanden. Liegen die Adressen nun alle in einer Bank? Gruß Bernd
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".
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
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.