Hier ein kleines Beispiel für einen Kurzzeittimer, den ich mir für ein Belichtungsgerät geschrieben habe. Zur Anwendung kommt ein PIC16F876(A) oder ein PIC16F873(A). Eine genaue Zeitbasis von 10ms wird durch Timer1 und das CCP-Modul erzeugt. Die Zeit wird auf einem LCD-Display 8x2 dargestellt. Bedient wird die Uhr über 4 Tasten. MfG Steffen
Durch eine andere Diskussion ist mir aufgefallen, das bei dem Beispiel in der ISR das Status-Register mit movf gesichert wird (das Programm ist schon etwas älter, ich habs nur noch etwas kommentiert) und nicht mit swapf. Movf beeinflusst das Z-Flag. Daraus folgt, das STATUS,Z falsch wieder hergestellt wird (wenn es gesetzt war wird es zurückgesetzt). Das Programm läuft zwar bei mir schon eine ganze Weile fehlerfrei aber es könnte doch irgendwann ein Fehler auftreten. Als Anhang die korrigierte Version. MfG Steffen
Hallo Steffen, beim Ansehen des Programms ist mir folgendes aufgefallen: Die Tastenpins werden ja schön definiert mit #define BT_Set Taste,0 Das könnte dazu verleiten, diese umzudefinieren. Jedoch wird man damit auf die Nase fallen, da ja an anderer Stelle doch wieder eine feste Zahl verwendet wird: andlw 00010111b ; nur Tasteneingänge Ich kenne den PIC nicht so gut, aber beim AVR kann man das so machen: .equ BT_Set = 0 .equ BT_Up = 1 .equ BT_Down = 2 .equ BT_Start = 4 und dann im Programm: andi r16, 1<<BT_Set ^ 1<<BT_Up ^ 1<<BT_Down ^ 1<<BT_Start Dann kann man die Tasten ohne Gefahr zumindest am gleichen 8Bit-Port umdefinieren. Gibts da beim PIC nicht was ähnlich komfortables ? Ich versuche ja auch immer möglichst viel mit Definitionen variabel zu halten und nur selten feste Zahlen mitten im Programm zu verwenden. Peter
Hallo Peter, die Kritik ist angebracht. Bei MPLAB geht das genauso. Die Implementierung könnte dann so aussehen: ; Tastenzuordnung zu PORTB, bei Umbelegung nur diese Werte ändern Taste_Set = 0 Taste_Up = 1 Taste_Down = 2 Taste_Start = 4 ; ab hier braucht dann nichts mehr geändert zu werden ; Maske für Feststellung ob Taste gedrückt bzw. Up Down gedrückt und TRISB Tasten_Mask = 1<<Taste_Set ^ 1<<Taste_Up ^ 1<<Taste_Down ^ 1<<Taste_Start UpDown_Mask = 1<<Taste_Up ^ 1<<Taste_Down Im Programm müssten dann alle 00010111b-Werte in der Tastenauswertung durch Tasten_Mask und beim Test, ob Up und Down gleichzeitig gedrückt sind 00000110b durch UpDown_Mask ersetzt werden. MfG Steffen
Bin ich froh, daß es endlich mal einer nicht persönlich nimmt :-) Aber man muß doch auch mal Tips geben können, wie es besser ist oder auch nur eine andere Meinung vertreten, sonst lernt doch keiner was. Ich machs doch auch nicht immer richtig (bin auch nur ein Mensch). Kritik sollte immer willkommen sein. Peter
Hi! @Peter Wahre Worte! Hoffentlich reagierst du bei Kritiken deiner Progr.auch so wie Steffen und setzt auch um was du gerade geschrieben hast. MFG Uwe
@Uwe, aber selbstverständlich, ich will ja auch meine Programme verbessern. Wenns aber einer gar nicht erst ausprobiert oder nur weit entfernt ähnlich oder nur etwas vermutet, dann kann ich natürlich nicht überprüfen, ob wirklich mein Programm Probleme macht oder nicht. Peter
Aufgrund einer Nachfrage habe ich die HEx-Dezimal(ASCII)-Umwandlung und die Ausgabe an das LCD-Display noch etwas kommentiert. Die Quellen findet ihr im Anhang. MfG Steffen
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.