PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Signalverlängerung Schalter / PIC



D. Johnson
23.05.2006, 15:25
Ich möchte eine Signalverlängerung in Assemblersprache realisieren nach folgendem Muster:

Drücke ich Schalter 1, passiert Ereignis A, Drücke ich Schalter 1 für beispielsweise 5 Sekunden, passiert Ereignis B.

Ich habe schon alles (mir) mögliche versucht. Entweder meine Matrixsteuerung zur Ansteuerung von 4 Stück 7-Segmentanzeigen funktioniert dann nicht mehr richtig, oder der PIC macht gar nichts mehr.

Bin für jeden Denkanstoß dankbar, D. Johnson :)

BigWumpus
23.05.2006, 21:21
Also in PicBASIC habe ich das so gelöst:
Mit Timer1 und einem CCP habe ich einen 1/2-Sekunden-Timer erstellt, der immer wieder selbst startet, aber ein IF setzt, der von der Software gelöscht werden muß.
Da kann man einfach die Zeit messen, die der Taster gedrückt ist, indem man bei gedrücktem Taster anfängt zu zählen und beim Loslassen nachsieht, wieviel Impulse (CCP1IF) gezählt wurden.

the_Ghost666
31.05.2006, 16:01
so hätt ichs auch gemacht, das ist auch in assembler leicht machbar. nur musst du die tasten dann per hardware entprellen, oder erst entprellen und dann die zeitnahme starten. sonst könnte es passieren, dass der CCP das prellen des tasters als zweites ereignis versteht und aufhört zu zählen, dann hättest du einen tastendruck von wenigen millisekunden.

was auch noch geht, und ohne CCP modul: du löst einen interrupt aus oder prüfst in einer schleife, wenn du die taste drückst, machst eine entprellung und prüfst in regelmäßigen abständen, ob die taste noch gedrückt ist. wenn es um einige sekunden geht, brauchst du es nicht auf 1ms genau, deswegen kannst du einfach deinen Prozessortakt nehmen, mit der Anzahl der Befehle berechnen wie lange du brauchst, bist du erneut abfragst, und dann einfach die abfragen zählen.
kurz: schleife basteln die den zustand abfragt, schleife so auslegen, dass alle mh 100ms oder wie es eben passt wieder nachgesehen wird. Bei gedrückter taste zählst du eine Variable um eins hoch. und lässt das ding weiterlaufen, ist im nächsten durchgang die taste immernoch gedrückt, weiter hochzählen. ist die taste dann irgendwann nichtmehr gedrückt, kannst du aus dem zählerstand ablesen, wie lang die taste für gedrückt war, eben zählerstand x 100ms.