| 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
|
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.
| |