Einfaches Assemblerprogramm für PIC16F627A

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: 26 10 2025  01:23:08      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Oszilloskop-Schirmbilder            


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

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


Autor
Einfaches Assemblerprogramm für PIC16F627A

    







BID = 561683

loetlack

Gerade angekommen


Beiträge: 4
Wohnort: Frankfurt Main
 

  


Hallo, als blutiger Anfänger in der Pic-Welt habe ich nach einer Lösung gesucht, mit einem PIC16F627A oder auch PIC16F628 folgende einfache Schaltung zu realisieren:
Ich möchte mit nur einem Taster 3 Ausgänge (LED´s) nacheinander schalten.
Also sobald die Betriebsspannung anliegt, sollte LED1 leuchten, LED2 und LED3 ausgeschaltet sein. Nach nächstem Betätigen des Tasters sollte dann LED2 leuchten und die anderen 2 LED erlöschen. Durch nochmaliges Drücken soll dann die LED3 leuchten und wiederum die anderen 2 ausgehen. Danach wieder LED1 an usw.
Das sichere Schalten sollte natürlich durch Entprellen gelöst werden und wenn möglich noch eine Überlappungszeit von 20ms zwischen den Schaltstufen eingebaut sein.
Ich habe versucht im Internet Schaltungen zu finden und für meine Bedürfnisse umzugestalten, bin aber nicht fündig geworden. Ich kann einen Eingang mit jeweils 2 Tastern ein- u. ausschalten. Das möchte ich aber nicht, da ich sonst 6 Taster bräuchte.
Kann mir da jemand weiterhelfen? Am besten mit einem asm.file welches ich mit meinem beschränkten Nichtwissen nachvollziehen kann.

BID = 561699

Her Masters Voice

Inventar


Avatar auf
fremdem Server !
Hochladen oder
per Mail an Admin

Beiträge: 5312
Wohnort: irgendwo südlich von Berlin

 

  

Taste per Hardware entprellen und an nen 4017 anschliessen? Überlappt zwar nicht aber dafür gehts sogar bis 10 LED.

_________________
Tschüüüüüüüs

Her Masters Voice
aka
Frank

***********************************
Der optimale Arbeitspunkt stellt sich bei minimaler Rauchentwicklung ein...
***********************************

BID = 561704

BjörnB

Stammposter

Beiträge: 242
Wohnort: Dortmund

Hallo,

ich bin zwar eher in der AVR-Welt zu Hause, aber das Programm sollte recht einfach sein. Idealerweise verwendest Du einen Timer, der z.B. alle 10 ms einen Interrupt aufrufst. In diesem Timer bringst Du die Abfrage des Tastereingangs und sein Entprellen unter. Bei jedem Timer-Interrupt erhöhst Du eine Zählvariable, sofern der Tastereingang logisch 1 ist. Ist z.B. 5 erreicht (logisch 1 liegt seit 50 ms an, also sicherlich kein Prellen mehr), werden die LEDs weitergeschaltet. Liegen die LEDs der Reihe nach auf einem Port, lässt sich das recht angenehm mit einer Multiplikation mit 2 erreichen.

Ohne Mikrocontroller sollte sich die Aufgabe aber auch mit einem 4017 und einigen weiteren Bauteilen lösen lassen.

Schöne Grüße,
Björn

BID = 561720

Racingsascha

Schreibmaschine



Beiträge: 2247
Wohnort: Gundelsheim
ICQ Status  

Für sowas simples brauch man keinen Interrupt, das kann man auch mit ner kleinen Warteroutine machen. Der Prozessor hat ja eigentlich nichts zu tun.

Quick and Dirty würde das bei mir so aussehen (Pseudocode):
TRISA = 0x01 ;RA0 als Tastereigang
TRISB = 0x00
PORTB = 0x01 ;erste led an

Main
Taster abfragen
wenn gedrückt, rlf PORTB
wenn RB3 = 1, Rb = 0x01
call warteschleife ;so etwa 50ms lang
goto Main

Was meinst du mit der Überlappungszeit? Dass beim Weiterschalten kurz zwei LEDn leuchten?



_________________
Fnord ist die Quelle aller Nullbits in deinem Computer.
Fnord ist die Angst, die Erleichterung, und ist die Angst.
Fnord schläft nie.

BID = 561725

BjörnB

Stammposter

Beiträge: 242
Wohnort: Dortmund

Hallo,

klar reicht hier eine Warteroutine, aber es wäre doch nicht verkehrt, wenn unser loetlack von vornherein lernt, wie man sowas bei komplexeren Projekten sauber mit Interrupt löst

Außerdem ergäbe Dein Programm ein nettes Lauflicht, wenn der Benutzer den Taster länger als 50 ms drückt

Schöne Grüße,
Björn

BID = 561755

Ltof

Inventar



Beiträge: 9386
Wohnort: Hommingberg


Zitat :
BjörnB hat am  6 Nov 2008 01:39 geschrieben :

...wenn unser loetlack von vornherein lernt, wie man sowas bei komplexeren Projekten sauber mit Interrupt löst...

So eine blödsinnige Argumentation!

Das Kind will Radfahren lernen und bekommt eine Anleitung für ein Motorrad in die Hand gedrückt...

Viel wichtiger ist es, wenn man von vorneherein lernt, den Interrupt möglichst nicht zu benutzen. Auch komplexe Anwendungen gehen meist ohne Interrupt.

Ich mach sowas in einer Endlosschleife ungefähr so:
***
warte auf Tastendruck

call Prellzeit

call naechsteLED

warte auf Taste wieder Loslassen

call Prellzeit

zurück zum Anfang
***

Die Prellzeit macht man so lang wie nötig und so kurz wie möglich. Das muss man auspropieren oder mit einem Oszilloskop messen. Je nach Taster reicht weit weniger als eine Millisekunde.

Die "Edelvariante" der Programmschleife prüft nach der Prellzeit nochmal, ob wirklich der Taster noch gedrückt, bzw. losgelassen ist und springt gegebenenfalls wieder zurück in die zugehörige Warteschleife. Dadurch reagiert das nicht so leicht auf Störungen. Besser ist natürlich, solche Störungen erst garnicht "in" den µC gelangen zu lassen.

Gruß,
Ltof





_________________
„Schreibe nichts der Böswilligkeit zu, was durch Dummheit hinreichend erklärbar ist.“
(Hanlon’s Razor)

BID = 561762

Her Masters Voice

Inventar


Avatar auf
fremdem Server !
Hochladen oder
per Mail an Admin

Beiträge: 5312
Wohnort: irgendwo südlich von Berlin

wenn man es mit Interrupt macht, dann kann man das "überlappen" sogar noch schicker gestalten indem man die eine LED ausblendet während man die Nächste einblendet. Schon wenige Stufen ergeben ein lustigen Effekt.

_________________
Tschüüüüüüüs

Her Masters Voice
aka
Frank

***********************************
Der optimale Arbeitspunkt stellt sich bei minimaler Rauchentwicklung ein...
***********************************

BID = 561766

Ltof

Inventar



Beiträge: 9386
Wohnort: Hommingberg

Auch für den Übergang wird kein Interrupt gebraucht. Das kann nach belieben im Unterprogramm "naechsteLED" gestaltet werden.

_________________
„Schreibe nichts der Böswilligkeit zu, was durch Dummheit hinreichend erklärbar ist.“
(Hanlon’s Razor)

BID = 561768

hajos118

Schreibmaschine



Beiträge: 2453
Wohnort: Untermaiselstein

Wenn feste Zeiten gebraucht werden sind timer (und damit Interrupts) wohl nicht zu umgehen, sobald "nebenbei" auch noch andere Aufgaben zu erledigen sind.
imho sind µC Aufgaben nur sinnvoll mit Interrupts zu lösen, sobald auf externe Ereignisse reagiert werden muss.


_________________
Interpunktion und Orthographie dieses Beitrags sind frei erfunden.
Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.
Wer einen Fehler findet, darf ihn behalten!

BID = 561775

Ltof

Inventar



Beiträge: 9386
Wohnort: Hommingberg


Zitat :
hajos118 hat am  6 Nov 2008 09:23 geschrieben :

Wenn feste Zeiten gebraucht werden sind timer (und damit Interrupts) wohl nicht zu umgehen, sobald "nebenbei" auch noch andere Aufgaben zu erledigen sind.

Auch das geht ohne Interrupts. Sogar mehrere ineinander verschachtelte Zeitschleifen gehen ohne Interrupts. Oft benutze ich bei solchen Programmen anfangs einen Interrupt, der dann im Laufe der Programmentwicklung wieder rausfliegt.

Ein Trick ist beispielsweise, Interrupt-Flags auszuwerten, ohne den Interrupt selbst freizugeben. Also beispielsweise auch den Timer-Überlauf. Solange ein Timerdurchlauf nicht kürzer ist als bis zum nächsten "Nachsehen", geht das wunderbar.

Einen Interrupt benutze ich nur noch, wenn sofort auf irgendwas reagiert werden muss.

Das ist natürlich Geschmackssache, ob man etwas mit dem Interrupt macht oder nicht.

Gruß,
Ltof

_________________
„Schreibe nichts der Böswilligkeit zu, was durch Dummheit hinreichend erklärbar ist.“
(Hanlon’s Razor)

BID = 561779

hajos118

Schreibmaschine



Beiträge: 2453
Wohnort: Untermaiselstein

Ist richtig, wenn ich nicht auch noch Strom paren muss (bei div. µC Projekten notwendig).
Da kann ich nicht ständig die Flags pollen, da leg' ich den Controller einfach schlafen und bekomme mit einem Interrupt das Signal zum Arbeiten - egal ob es sich um einen Timer oder ein externes Signal handelt.


_________________
Interpunktion und Orthographie dieses Beitrags sind frei erfunden.
Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.
Wer einen Fehler findet, darf ihn behalten!

BID = 561785

loetlack

Gerade angekommen


Beiträge: 4
Wohnort: Frankfurt Main

Danke euch schon mal für die Vorschläge mit 2 verschiedenen Ansätzen.
Ich bin wirklich noch Laie, deshalb habe ich mich wenigstens über den Pseudocode gefreut. Lösung mit Interrupts bringt mich ohne Assemblerschreibweise als Laie leider nicht weiter, da bin ich noch zu weit entfernt. Daher habe ich meine Schaltung als .jpg angehängt.
Ich möchte auch keinen 4017 nehmen, dafür habe ich schon zuviel investiert und mir einen Sprut-Brenner gebaut. Es soll ja auch irgendwann weitergehen. Ich habe folgendes .asm gefunden, welches leider nur alle RB 0-7 an- oder ausschaltet. Wie könnte man da meinen Wunsch einbauen? Nacheinander mit einem Taster immer eine LED weiterschalten, sodass immer nur eine leuchtet. Bitte ein bischen mehr Code zum Benutzen.
Ja mit Überlappung ist gemeint, die vorhergehende noch 20ms brennt während die nächste schon an ist. Ich weiss, dass man das nicht sehen kann. Muss auch nicht unbedingt sein.



BID = 561786

Ltof

Inventar



Beiträge: 9386
Wohnort: Hommingberg

Ja - die Schlafgeschichte ist so ein Fall, in dem der Interrupt seine Berechtigung hat. Da kommt es auch auf den µC an, wie der auf einen Interrupt während des Schlafens reagiert. PICs haben die freundliche Eigenschaft, dass sie mit einem Interrupt-Ereignis geweckt werden können, ohne dass in eine Interrupt-Service-Routine gesprungen werden muss (INTCON, GIE nicht gesetzt).

edit:
Wieso ist denn da in der Skizze jetzt ein 16F84 gezeichnet, aber im Betreff steht was vom 16F627?

Der 16F627 hat Vorteile. Er braucht z.B. keinen Quarz, weil er einen internen Oszillator hat. Für diese Aufgabe reicht der interne Oszialltor aus.

edit2:
Es fehlt der Block-Kondensator!

_________________
„Schreibe nichts der Böswilligkeit zu, was durch Dummheit hinreichend erklärbar ist.“
(Hanlon’s Razor)

[ Diese Nachricht wurde geändert von: Ltof am  6 Nov 2008 10:29 ]

BID = 561815

loetlack

Gerade angekommen


Beiträge: 4
Wohnort: Frankfurt Main

Oh ja Entschuldigung, soll natürlich der 16F627 sein. Hat aber ja die gleiche Pinbelegung. Welcher Kondensator fehlt und wo genau?

danke

BID = 561820

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach

100nF oder etwas mehr zwischen Vdd und Vss. Kurze Drähte!


      Nächste Seite
Gehe zu Seite ( 1 | 2 Nächste Seite )
Zurück zur Seite 1 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 12 Beiträge im Durchschnitt pro Tag       heute wurden bisher 0 Beiträge verfasst
© x sparkkelsputz        Besucher : 186010564   Heute : 903    Gestern : 16912    Online : 333        26.10.2025    1:23
12 Besucher in den letzten 60 Sekunden        alle 5.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0963649749756