Touchpanel und Touchscreen mit PIC
Transcrição
Touchpanel und Touchscreen mit PIC
Touchpanel und Touchscreen mit PIC-Mikrocontroller Stefan Buchgeher 14. September 2009 www.stefan-buchgeher.info [email protected] Großambergstraße 106/3, A-4040 Linz (Österreich) ++43/699/11 29 63 38 INHALTSVERZEICHNIS 1 Inhaltsverzeichnis 1 Einleitung 1 2 Grundlagen zum Touchpanel 2 3 Hardware 2 4 Software 4.1 Portdefinition . . . . . . . . . . . . . . . . . . . . . . 4.2 X-Koordinate ermitteln (Unterprogramm TP GetX) . 4.3 Y-Koordinate ermitteln (Unterprogramm TP GetY) . 4.4 Unterprogramm zur Analog-Digital-Wandlung (ADC8) 4.5 Koordinatenursprung . . . . . . . . . . . . . . . . . . . . . . . 3 3 4 5 5 6 5 Demonstrationsbeispiel 1 (Touchpanel) 5.1 Schaltung (Hardware) . . . . . . . . . 5.2 Stückliste . . . . . . . . . . . . . . . . 5.3 Layout und Bestückungsplan . . . . . . 5.4 Software . . . . . . . . . . . . . . . . . 5.5 Anmerkungen zur Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 7 8 8 10 21 6 Demonstrationsbeispiel 2 (Touchscreen) 6.1 Schaltung (Hardware) . . . . . . . . . . 6.2 Stückliste . . . . . . . . . . . . . . . . . 6.3 Layout und Bestückungsplan . . . . . . . 6.4 Software . . . . . . . . . . . . . . . . . . 6.5 Anmerkungen zur Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 25 26 26 28 35 1 Einleitung Beim Durchblättern der Elektronik-Monatszeitschrift Elektor [1] entdeckte ich einen Werbeartikel von der Firma mikroElektronika [2] zur Realisierung eines einfachen Touchscreen mit einem resistiven Touchpanel. Das brachte mich auf die Idee mich mit den Themen Touchpanel und Touchscreen zu beschäftigen. Ein geeignetes Touchpanel und ein dazu passendes Grafikdisplay sind sehr günstig bei Tigal [3] erhältlich. Die Software ist hier in der Programmiersprache C verfasst. Als C-Compiler wird hier mikroC von mikroElektronika [4] verwendet. Für das erste Demonstrationsbeispiel (ab Seite 6) ist die kostenlose Demoversion ausreichend. Das zweite Demonstrationsbeispiel (ab Seite 24) ist, bedingt durch das Grafik-Display, für die Demoversion des C-Compilers leider schon zu umfangreich, so dass für das zweite Demonstrationsbeispiel die kostenpflichtige Vollversion des C-Cpmpilers notwendig ist. 2 GRUNDLAGEN ZUM TOUCHPANEL 2 2 Grundlagen zum Touchpanel Eine sehr gute Erklärung über das hier verwendete Touchpanel ist in [2] zu finden. Ein Touchpanel ist ein dünnes, transparentes und selbstklebendes Tastenfeld. Es ist sehr druckempfindlich, so dass bereits ein leichter Druck eine Änderung des Ausgangssignals bewirkt. Es gibt verschiedene Touchpanel-Typen. Am einfachsten und am preiswertesten sind analoge, resistive Touchpanels (Widerstands-Touchpanel). Dieses wird auch hier verwendet. Ein Widerstands-Touchpanel besteht aus zwei übereinander liegenden, steifen und leitfähigen Schichten (Indiumzinnoxid, engl. indium tin oxide, ITO), deren Innenseiten mit einer Widerstandsschicht überzogen sind. Die beiden Schichten sind durch zahlreiche isolierte Abstandshalter, so genannte Spacer-Dots“ voneinander getrennt. Die gegenüberliegenden ” Seiten der Schichten sind mit Kontakten versehen (siehe Abbildung 1). Abbildung 1: Touchpanel-Struktur Beim Berühren des Touchpanels entsteht beim Druckpunkt ein Kontakt zwischen den beiden Schichten. Die Aufgabe besteht nun darin die Koordinaten des Druckpunktes zu bestimmen. Dazu werden zwei gegenüberliegende Kontakte mit fixen, aber unterschiedliche Spannungen (z.B +5V und 0V) verbunden. Dadurch ergibt sich ein Spannungsteiler, deren Widerstände von der Position des Druckpunktes abhängen. Diese Spannung ist direkt proportional zur Position des Druckpunktes und kann daher mit einem Analog-Digital-Wandler (kurz: ADC) in einen digitalen Wert umgewandelt werden. Um den Schaltungsaufwand gering zu halten sollte für die Ansteuerung eines resistiven Touchpanels ein Mikrocontroller verwendet werden, der zumindest zwei ADC-Kanäle beinhaltet. 3 Hardware In [2] wird die Schaltung nach Abbildung 2 vorgeschlagen, die auch bei mir einwandfrei funktioniert. Die Aufgabe dieser Schaltung ist die vier Anschlüsse des Touchpanels (Oben, Unten, Links und Rechts) so mit Masse und mit der Spannungsversorgung (hier +5V ) zu verbinden, das 4 SOFTWARE 3 Abbildung 2: Schaltung (Touchpanel) am Druckpunkt ein Spannungsteiler für die X-Koordinate entsteht, diese Spannung kann dann vom Mikrocontroller digitalisiert werden, und gibt die X-Koordinate des Druckpunktes an. Das gleiche gilt für die Y-Koordinate. Für die Ansteuerung der Transistorschaltung kann ein beliebiger Mikrocontroller verwendet werden, er muss nur 2 digitale Ausgänge und 2 analoge Eingänge besitzen. 4 Software Die Aufgabe der Software ist es also, ständig (regelmäßig) die X-Koordinate und die YKoordinate zu bestimmen. Was mit dieser Information dann geschehen soll hängt von der jeweiligen Aufgabenstellung ab. Meist wird ein Touchpanel zur Wert- und Dateneingabe verwendet. Doch dass soll uns hier noch nicht kümmern. Hier geht es nur um die Erfassung der X- und der Y-Koordinate. Der Quellcode welcher diese Aufgabe erfüllt befindet sich in den Dateien TOUCHPANEL.H und TOUCHPANEL.C 4.1 Portdefinition Im Allgemeinen wird bei jeder Anwendung das Touchpanel an anderen Portpins angeschlossen. Damit diese in den Unterprogrammen, die mit dem Touchpanel kommunizieren, nicht ständig geändert werden muss, befindet sich in der Software eine Portdefinition für das Touchpanel. Diese besteht hier aus den zwei digitalen Ausgangspins und den zwei analogen Eingangskanälen. Listing 1 zeigt eine mögliche Portdefinition für einen PICMikrocontroller aus der PIC16xx-Familie. 17 18 19 20 21 22 23 24 25 /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ P o r t b e l e g u n g ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ #define TP PORT DRIVEA PORTA. F1 #define TP PORT DRIVEB PORTA. F0 /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ Analoge Kanaele ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ #define TP CHAN READX 3 #define TP CHAN READY 2 Listing 1: Portdefinitionen für das Touchpanel (Auszug aus TOUCHPANEL.H) 4 SOFTWARE 4 Achtung: Beim Initialisieren des PIC-Mikrocontroller (bei mir im Unterprogramm Init) müssen diese Portpins als Ausgänge bzw. Eingänge konfiguriert werden. Siehe Demonstrationsbeispiele. 4.2 X-Koordinate ermitteln (Unterprogramm TP GetX) Zur Bestimmung der X-Koordinate muss DRIVEA mit V cc (hier: +5V ) und DRIVEB mit V ss (hier: 0V ) verbunden werden. Nach einer kurzen Warteteit (hier: 5ms) kann die X-Koordinate gelesen werden. Der Wertebereich für die X-Koordinate liegt zwischen 0 (ganz links) und 255 (ganz rechts). Listing 2 zeigt dieses sehr einfache Unterprogramm zur Bestimmung der X-Koordinate. Abbildung 3 zeigt den Zustand der Schalttransistoren der Hardware für das Lesen der X-Koordinate. 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 char TP GetX ( void ) { char x K o o r d i n a t e ; // P o r t p i n DRIVEA = 1 und P o r t p i n DRIVEB = 0 ( Rechts : +Vcc , L i n k s : Vss , // Oben : hochohmig , Unten : x−K o o r d i n a te ) TP PORT DRIVEA = 1 ; TP PORT DRIVEB = 0 ; // 5ms warten Delay ms ( 5 ) ; // x−Wert ( Unten ) l e s e n x K o o r d i n a t e = ADC8(TP CHAN READX) ; return ( x K o o r d i n a t e ) ; } Listing 2: X-Koordinate lesen (Auszug aus TOUCHPANEL.C) Abbildung 3: X-Koordinate lesen (Zustand der Schalttransistoren) 4 SOFTWARE 4.3 5 Y-Koordinate ermitteln (Unterprogramm TP GetY) Für die Bestimmung der Y-Koordinate müssen an DRIVEA und DRIVEB die gegenteiligen Zustände wie für die Bestimmung der X-Koordinate angelegt werden. An DRIVEA daher V ss (hier: 0V ) und an DRIVEB V cc (hier: +5V ). Nach 5ms kann die Y-Koordinate gelesen werden. Der Wertebereich für die Y-Koordinate liegt zwischen 0 (ganz unten) und 255 (ganz oben). Listing 3 zeigt dieses sehr einfache Unterprogramm zur Bestimmung der Y-Koordinate. Abbildung 4 zeigt den Zustand der Schalttransistoren der Hardware für das Lesen der Y-Koordinate. 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 char TP GetY ( void ) { char y K o o r d i n a t e ; // P o r t p i n DRIVEA = 0 und P o r t p i n DRIVEB = 1 ( Oben : +Vcc , Unten : Vss , // Rechts : hochohmig , L i n k s : y−K o o r d i n a te ) TP PORT DRIVEA = 0 ; TP PORT DRIVEB = 1 ; // 5ms warten Delay ms ( 5 ) ; // y−Wert ( L i n k s ) l e s e n y K o o r d i n a t e = ADC8(TP CHAN READY) ; return ( y K o o r d i n a t e ) ; } Listing 3: Y-Koordinate lesen (Auszug aus TOUCHPANEL.C) Abbildung 4: Y-Koordinate lesen (Zustand der Schalttransistoren) 4.4 Unterprogramm zur Analog-Digital-Wandlung (ADC8) Die Analog-Digital-Wandlung erfolgt mit einem eigenen kurzen Unterprogramm. Dieses Unterprogramm befindet sich in der Datei myPIC ADC.C. 5 DEMONSTRATIONSBEISPIEL 1 (TOUCHPANEL) 4.5 6 Koordinatenursprung Aufgrund der gewählten Hardware und der Software ergibt sich für den Koordinatenursprung des Touchpanel die linke untere Ecke, so wie es auch in der Mathematik üblich ist. Der Wertebereich ist für beide Achsen von 0 bis 255 (also jeweils 8 Bit, Abbildung 5). Abbildung 5: Koordinatenursprung des Touchpanel 5 Demonstrationsbeispiel 1 (Touchpanel) Das folgende Beispiel dient nur zur Demonstration. Es zeigt eine mögliche Einbindung der zuvor beschriebenen Unterprogramme. Bei diesem Demonstrationsbeispiel soll das Touchpanel in vier Bereiche aufgeteilt werden. Diese vier Bereiche sind virtuelle Tasten. Der Zustand dieser vier virtuellen Tasten wird mit je einer grünen 5mm Leuchtdiode angezeigt. Ein Druck auf diese virtuelle Taste soll die dazugehörige Leuchtdiode ein bzw. ausschalten. Jede dieser vier Tasten ist unabhängig von den anderen. Die Abbildung 6 zeigt ein Foto von diesem Demonstrationsbeispiel (Siehe auch Titelbild). Abbildung 6: Demonstrationsbeispiel 1 (Foto) 5 DEMONSTRATIONSBEISPIEL 1 (TOUCHPANEL) 7 Die Abbildung 7 zeigt die Koordinaten der vier virtuellen Tasten am Touchpanel. Abbildung 7: Demonstrationsbeispiel 1 (Koordinaten der virtuellen Tasten) 5.1 Schaltung (Hardware) Die Abbildung 8 zeigt die sehr einfache Schaltung für das erste Demonstrationsbeispiel. Abbildung 8: Demonstrationsbeispiel 1 (Touchpanel, Schaltung) Die Schaltung besteht im Wesentlichen aus dem resistiven Touchpanel (TP1), der im Abschnitt 3 besprochenen Schaltung zur Ansteuerung des Touchpanels, dem Mikrocontroller (IC1), vier Leuchtdioden (D1 bis D4) mit den dazugehörigen Vorwiderständen (R11 bis R14) und einer einfachen Spannungsversorgung mit einem 5-V-Fixspannungsregler (IC2) vom Typ 7805. Als Mikrocontroller (IC1) dient hier ein PIC16F88. Auffällig beim Mikrocontroller ist die fehlende Oszillatorschaltung sowie die fehlende Resetschaltung. Die Oszillatorschaltung 5 DEMONSTRATIONSBEISPIEL 1 (TOUCHPANEL) 8 ist hier auch nicht notwendig, da diese Anwendung nicht zeitkritisch ist und daher der interne 4-MHz-Oszillator verwendet werden kann. Wichtig: Bei der Konfiguration des Mikrocontrollers müssen die entsprechenden Bits für die Verwendung des internen Oszillators und des internen Reset gesetzt werden! Siehe Anmerkungen zur Software (ab Seite 21). Der Kondensator C3 dient zur Entkoppelung der Betriebsspannung für den Mikrocontroller IC1. Für diesen Koppelkondensator sollte ein Keramiktyp verwendet werden. Dieser muss möglichst nahe beim Mikrocontroller angebracht werden. Die Leuchtdioden D1 bis D4 mit den Vorwiderständen R11 bis R13 zeigen den Zustand der vier virtuellen Tasten am Touchpanel an. Die Stromversorgung besteht hier aus einer sehr einfachen Standardlösung. Ein Festspannungsregler (IC2) vom Typ 7805 übernimmt mit den Kondensatoren C4 bis C7 die Spannungsregelung. Die Diode D5 dient hier als Verpolungsschutz, und die Leuchtdiode D6 dient zusammen mit dem Strombegrenzungswiderstand R15 als Spannungskontrolle. 5.2 Stückliste Nr. R1 - R6, R8, R9, R11 - R15 R7, R10 C1 - C3, C5, C6 C4 C7 D1 - D4 D5 D6 T1, T3 T2, T4, T5 IC1 IC2 TP1 IC1 K1 TP1 Bezeichnung Widerstand 1k Widerstand 47k Keramikkondensator 100nF RM5.08 Mini-Elko 10µF/25V Tantal 1µF/35V Low-current-LED 5mm grün Diode 1N4001 Low-current-LED 3mm grün Transistor BC557B Transistor BC547B Mikrocontroller PIC16F88 Spannungsregler 7805 Touch-Panel IC-Präzisionssockel 18polig Anschlussklemme 2polig Touch-Panel-Connector Platine Basismaterial (160 x 100mm) Abstandsbolzen M3x10 Mutter M3 St. 13 2 5 1 1 4 1 1 2 3 1 1 1 1 1 1 1 4 4 Lief. Conrad Conrad Conrad Conrad Conrad Conrad Conrad Conrad Conrad Conrad Farnell Conrad Tigal Conrad Conrad Tigal Conrad Bestell-Nr. 40 81 66 40 83 60 45 33 58 46 05 24 48 16 70 14 60 30 16 22 13 14 59 71 15 50 98 15 50 12 976-1500 17 92 05 Alt. Lief. Bestell-Nr. Conrad 16 52 33 18 96 34 18 96 34 52 92 49 Tabelle 1: Demonstrationsbeispiel 1 (Touchpanel, Stückliste, Stand: September 2009) 5.3 Layout und Bestückungsplan Die Abbildung 9 zeigt das Layout für dieses Demonstrationsbeispiel. Es ist im Maßstab 1:1 und wie üblich spiegelverkehrt. Der Bestückungsplan ist in Abbildung 10 zu sehen. Der Nachbau sollte keine Probleme bereiten. Bei der Bestückung beginnt man üblicherweise mit den niedrigen Bauteilen. 5 DEMONSTRATIONSBEISPIEL 1 (TOUCHPANEL) Abbildung 9: Demonstrationsbeispiel 1 (Touchpanel, Layout) Abbildung 10: Demonstrationsbeispiel 1 (Touchpanel, Bestückungsplan) 9 5 DEMONSTRATIONSBEISPIEL 1 (TOUCHPANEL) 5.4 10 Software Der Quellcode ist zur besseren Übersicht in mehrere Dateien aufgeteilt: • TouchPanel Demo.c beinhaltet das Hauptprogramm, die Interrupt-Service-Routine (ISR) und die Unterprogramme zur Initialisierung des Mikrocontrollers (PIC16F88) und zur Abfrage der virtuellen Tasten am Touchpanel. • TOUCHPANEL.C beinhaltet die Unterprogramme zum Lesen der X- und Y-Koordinate des Touchpanel gemäß Abschnitt 4. • TOUCHPANEL.H ist die Headerdatei zu TOUCHPANEL.C und beinhaltet die Portdefinitionen, die bei jeder Anwendung überprüft und ggf. angepasst werden müssen. • myPIC ADC.C beinhaltet das Hilfsunterprogramm zur Analog-Digital-Wandlung. • myPIC ADC.H ist die Headerdatei zu myPIC ADC.C. Datei TouchPanel Demo.c: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ Touchpanel − D e m o n s t r a t i o n s b e i s p i e l ∗/ /∗ ∗/ /∗ 255 +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ ∗/ /∗ 235 | +−−−−−−−−−−+ +−−−−−−−−−−+ | ∗/ /∗ | | Taste 1 | | Taste 3 | | ∗/ /∗ | | | | | | ∗/ /∗ 148 | +−−−−−−−−−−+ +−−−−−−−−−−+ | ∗/ /∗ 108 | +−−−−−−−−−−+ +−−−−−−−−−−+ | ∗/ /∗ | | Taste 2 | | Taste 4 | | ∗/ /∗ | | | | | | ∗/ /∗ 20 | +−−−−−−−−−−+ +−−−−−−−−−−+ | ∗/ /∗ 0 +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ ∗/ /∗ 0 20 108 148 235 255 ∗/ /∗ ∗/ /∗ i n t e r n e r Takt (4 MHz) ∗/ /∗ ∗/ /∗ Compiler : mikroC ∗/ /∗ ∗/ /∗ E n t w i c k l e r : S t e f a n Buchgeher ∗/ /∗ E n t w i c k l u n g s b e g i n n d er S o f t w a r e : 1 5 . August 2009 ∗/ /∗ F u n k t i o n s f a e h i g s e i t : 1 5 . August 2009 ∗/ /∗ L e t z t e B e a r b e i t u n g : 1 6 . August 2009 ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ I n c l u d e −D a tei en ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ #include ”TOUCHPANEL.H” /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ S t r u k t u r e n ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ k e i n e S t r u k t u r e n v er w en d et ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ E x ter n e R e g i s t e r ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ k e i n e e x t e r n e n R e g i s t e r ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ B i t s i n den e x t e r n e n R e g i s t e r n ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ k e i n e e x t e r n e n R e g i s t e r ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ G l o b a l e R e g i s t e r ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ char FlagISRHP ; char ZaehlerZeitbasis100ms ; 5 DEMONSTRATIONSBEISPIEL 1 (TOUCHPANEL) 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 11 /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ B i t s i n den g l o b a l e n R e g i s t e r n ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ R e g i s t e r FlagISRHP ∗/ #define F l a g Z e i t b a s i s 1 0 0 m s FlagISRHP . F0 /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ P o r t b e l e g u n g ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ S i e h e TOUCHPANEL.H ∗/ /∗ L eu ch td i o d en ∗/ #define LED Taste1 #define LED Taste2 #define LED Taste3 #define LED Taste4 PORTB. F7 PORTB. F5 PORTB. F6 PORTB. F4 /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ Konstanten ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ // Konstanten f u e r d i e Z e i t b a s e n #define KONSTZEITBASIS100MS 12 // Konstanten f u e r d i e T a s t e n k o o r d i n a t e n (Demo) // Taste 1 #define KONSTTASTE1X1 20 #define KONSTTASTE1X2 108 #define KONSTTASTE1Y1 148 #define KONSTTASTE1Y2 235 // Taste 2 #define KONSTTASTE2X1 20 #define KONSTTASTE2X2 108 #define KONSTTASTE2Y1 20 #define KONSTTASTE2Y2 108 // Taste 3 #define KONSTTASTE3X1 148 #define KONSTTASTE3X2 235 #define KONSTTASTE3Y1 148 #define KONSTTASTE3Y2 235 // Taste 4 #define KONSTTASTE4X1 148 #define KONSTTASTE4X2 235 #define KONSTTASTE4Y1 20 #define KONSTTASTE4Y2 108 /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ T a b e l l e n ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ k e i n e T a b e l l e n ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ F u n k t i o n s p r o t o t y p e n ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ void I n i t ( void ) ; void TouchPanelTastenRoutine ( void ) ; /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ISR − Timer0 ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ I n t e r r u p t S e r v i c e R o u ti n e : ∗/ /∗ ∗/ /∗ A u f r u f : ∗/ /∗ a l l e 8 . 2 ms ( u n g e f a e h r ) ∗/ /∗ ∗/ /∗ Aufgaben : ∗/ /∗ + Z e i t b a s i s f u e r 100 M i l l i s e k u n d e e r z e u g e n ∗/ /∗ + Das Timer−I n t e r r u p t −F l a g T0IF w i e d e r l o e s c h e n ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ void i n t e r r u p t ( void ) // I n t e r r u p t r o u t i n e { Z a e h l e r Z e i t b a s i s 1 0 0 m s −−; i f ( Z a e h l e r Z e i t b a s i s 1 0 0 m s == 0 ) // B o t s c h a f t s f l a g f u e r 100 ms−Z e i t b a s i s s e t z e n { FlagZeitbasis100ms = 1; 5 DEMONSTRATIONSBEISPIEL 1 (TOUCHPANEL) 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 12 Z a e h l e r Z e i t b a s i s 1 0 0 m s = KONSTZEITBASIS100MS ; // Z a e h l r e g i s t e r f u e r 100−ms− // Z e i t b a s i s neu l a d e n } INTCON . T0IF = 0 ; // Timer−I n t e r r u p t −F l a g T0IF w i e d e r l o e s c h e n } /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ Unterprogramme und Funktionen ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ I n i t : ∗/ /∗ ∗/ /∗ Aufgabe : ∗/ /∗ I n i t i a l i s i e r u n g d es P r o z e s s o r : ∗/ /∗ + Timer 0 (TMR0) l o e s c h e n ∗/ /∗ + Timer 0−ISR s o l l ca . a l l e 8 , 2ms a u f g e r u f e n werden , d a h er den V o r t e i l e r mit ∗/ /∗ 1 : 3 2 l a d e n ( b e i einem 4−MHz−Takt ) ∗/ /∗ 4 ∗ 256 ∗ VT 4 ∗ 256 ∗ 32 ∗/ /∗ ISR−A u f r u f [ us ] = −−−−−−−−−−−−− = −−−−−−−−−−−− = 8192 us = 8 , 2 ms ∗/ /∗ f [MHz] 4 ∗/ /∗ + i n t e r n e n O s z i l l a t o r k o n f i g u r i e r e n ( h i e r : 4MHz) ∗/ /∗ + Port A f u e r das Touchpanel a l s Eingang ( f u e r ADC) bzw . a l s Ausgang d e f i n i e r e n ∗/ /∗ + Port B f u e r d i e L eu ch td i o d en a l s Ausgang d e f i n i e r e n und I n h a l t l o e s c h e n ∗/ /∗ + ADC k o n f i g u r i e r e n ∗/ /∗ + Zaehlregister fuer Zeitbasis i n i t i a l i s i e r e n ∗/ /∗ + I n t e r r u p t f r e i g e b e n ( Timer0 f r e i g e b e n durch S e t z e n von GIE und T0IE im ∗/ /∗ INTCON−R e g i s t e r ) ∗/ /∗ ∗/ /∗ U eb er g a b ep a r a m eter : ∗/ /∗ keiner ∗/ /∗ ∗/ /∗ Rueckgabeparameter : ∗/ /∗ keiner ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ void I n i t ( void ) { // Timer−0− I n t e r r u p t k o n f i g u r i e r e n TMR0 = 0 ; // Timer 0 a u f 0 v o r e i n s t e l l e n OPTION REG = 0 b10000100 ; // Option−R e g i s t e r ( Bank 1 ) /∗ +−−−−−−−−−−−−−−−− B i t 7 (nRBPU) : P u l l −Up−Wi d er s ta en d e am Port B ||||||| 0 : P u l l −Up a k t i v i e r t ||||||| −> 1 : P u l l −Up d e a k t i v i e r t +−−−−−−−−−−−−−−−− B i t 6 (INTEDG) : I n t e r r u p t Edge S e l e c t B i t |||||| −> 0 : I n t e r r u p t on f a l l i n g edge o f RB0/INT p i n |||||| 1 : I n t e r r u p t on r i s i n g edge o f RB0/INT p i n +−−−−−−−−−−−−−−− B i t 5 (T0CS) : Timer 0 Clock s o u r c e S e l e c t B i t ||||| −> 0 : T r a n s i t i o n on RA4/T0CKI p i n ||||| 1 : I n t e r n a l i n s t r u c t i o n c y c l e c l o c k (CLKOUT) +−−−−−−−−−−−−−− B i t 4 (T0SE ) : TMR0 S o u r ce Edge S e l e c t b i t |||| −> 0 : In cr em en t on low−to−h i g h t r a n i t i o n |||| 1 : In cr em en t on high −to −low t r a n i t i o n +−−−−−−−−−−−− B i t 3 (PSA) : P r e s c a l e r Assignment b i t ||| −> 0 : P r e s c a l e r i s a s s i g n e d to th e TIMER0 module ||| 1 : P r e s c a l e r i s a s s i g n e d to th e WDT +++−−−−−−−−− B i t 2−0 ( PS2 : PS0 ) : P r e s c a l e r Rate S e l e c t b i t s B i t Value TMR0 Rate WDT Rate 000 : 1:2 1:1 001 : 1:4 1:2 010 : 1:8 1:4 011 : 1:16 1:8 −> 100 : 1:32 1:16 101 : 1:64 1:32 110 : 1:128 1:64 111 : 1:256 1:128 ∗/ // i n t e r n e n O s z i l l a t o r k o n f i g u r i e r e n OSCCON = 0 b01101010 ; // O s z i l l a t o r −C o n tr o l −R e g i s t e r ( Bank 1 ) /∗ +−−−−−−−−−−−−−−−−−−−− B i t 7 R es er v e +++−−−−−−−−−−−−−−−−− B i t 6−4 ( IRCF2 : IRCF0 ) : I n t e r n a l RC−O s c i l l a t o r |||| Frequency S e l e c t b i t s |||| 0 0 0 : 3 1 . 2 5 kHz (INTRC s o u r c e d r i v e s c l o c k ) 5 DEMONSTRATIONSBEISPIEL 1 (TOUCHPANEL) 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 |||| |||| |||| |||| |||| |||| |||| +−−−−−−−−−−−−−−−− ||| ||| ||| ||| ||| +−−−−−−−−−−−−−−− || || ++−−−−−−−−−−−−− 13 0 0 1 : 125 kHz 0 1 0 : 250 kHz 0 1 1 : 500 kHz 1 0 0 : 1 MHz 1 0 1 : 2 MHz −> 1 1 0 : 4 MHz 1 1 1 : 8 MHz B i t 3 (OSTS) : O s c i l l a t o r S t a r t −up Time−out Status bi t 0 : D ev i ce i s r u n n i n g from T1OSC o r INTRC a s a s e c o n d a r y system c l o c k −> 1 : D ev i ce i s r u n n i n g from th e primary system c l o c k B i t 2 ( IOFS ) : INTOSC Frequency S t a b l e b i t −> 0 : Frequency i s not s t a b l e 1 : Frequency i s s t a b l e B i t 1 , 0 ( SCS1 : SCS0 ) : O s c i l l a t o r Mode S e l e c t b i t s 0 0 : O s c i l l a t o r mode d e f i n e d by Fosc <2:0> 0 1 : T1OSC i s used f o r system c l o c k −> 1 0 : i n t e r n a l RC i s used f o r system c l o c k 1 1 : R es er v ed ∗/ /∗ // P o r t s k o n f i g u r i e r e n TRISA = 0 b00111100 ; ++−−−−−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−− +−−−−−−−−−−−−−− // R i c h t u n g s r e g i s t e r B i t 7−6 R es er v e B i t 5 Port RA5 : h i e r B i t 4 Port RA4 : h i e r B i t 3 Port RA3 : h i e r B i t 2 Port RA2 : h i e r B i t 1 Port RA1 : h i e r B i t 0 Port RA0 : h i e r Port A ( 0 : Ausgang , 1 : Eingang ) TRISB = 0 b00000000 ; +−−−−−−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−− +−−−−−−−−−−−−−− // R i c h t u n g s r e g i s t e r B i t 7 Port RB7 : h i e r B i t 6 Port RB6 : h i e r B i t 5 Port RB5 : h i e r B i t 4 Port RB4 : h i e r B i t 3 Port RB3 : h i e r B i t 2 Port RB2 : h i e r B i t 1 Port RB1 : h i e r B i t 0 Port RB0 : h i e r Port B ( 0 : Ausgang Ausgang (LED Taste Ausgang (LED Taste Ausgang (LED Taste Ausgang (LED Taste u n b en u tzt u n b en u tzt u n b en u tzt u n b en u tzt u n b en u tzt u n b en u tzt a n a l o g e r Eingang ( Touchpanel ) a n a l o g e r Eingang ( Touchpanel ) h i e r Ausgang ( Touchpanel ) h i e r Ausgang ( Touchpanel ) ∗/ /∗ , 1 : Eingang ) 1) 3) 2) 4) ∗/ PORTB = 0 ; /∗ // ADC k o n f i g u r i e r e n ANSEL = 0 b00001100 ; +−−−−−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−− +−−−−−−−−−−−−−− // ANSEL−R e g i s t e r ( 0 : D i g i t a l I /O, 1 : Analog I /O) B i t 7 R es er v e B i t 6 Port RB7/AN6: h i e r D i g i t a l I /O B i t 5 Port RB6/AN5: h i e r D i g i t a l I /O B i t 4 Port RA4/AN4: h i e r u n b en u tzt B i t 3 Port RA3/AN3: h i e r Analog I /O B i t 2 Port RA2/AN2: h i e r Analog I /O B i t 1 Port RA1/AN1: h i e r D i g i t a l I /O B i t 0 Port RA0/AN0: h i e r D i g i t a l I /O ∗/ /∗ ADCON0 = 0 b01000001 ; // ADC−C o n tr o l−R e g i s t e r 0 ( Bank 1 ) ++−−−−−−−−−−−−−−−−−−− B i t 7−6 (ADCS1: ADCS0) : A/D C o n er s i o n Clock S e l e c t |||||| bits |||||| IF ADSC2 = 0 : |||||| 00 : Fosc /2 ( b e i f o s z : 0 − 1 . 2 5 MHz) |||||| −> 01 : Fosc /8 ( b e i f o s z : 1 . 2 5 − 5 MHz) |||||| 10 : Fosc /32 ( b e i f o s z : 5 − 20 MHz) |||||| 11 : Frc ( b e i RC−O s z i l l a t o r ) |||||| IF ADSC2 = 1 : |||||| 00 : Fosc /4 ( b e i f o s z : 0 − 1 . 2 5 MHz) |||||| 01 : Fosc /16 ( b e i f o s z : 1 . 2 5 − 5 MHz) |||||| 10 : Fosc /64 ( b e i f o s z : 5 − 20 MHz) 5 DEMONSTRATIONSBEISPIEL 1 (TOUCHPANEL) 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 |||||| +++−−−−−−−−−−−−−−−− ||| ||| ||| ||| ||| ||| ||| +−−−−−−−−−−−−−−− || || || +−−−−−−−−−−−−−− +−−−−−−−−−−−−− 11 : Frc ( b e i RC−O s z i l l a t o r ) B i t 5−3 (CHS2 : CHS0 ) : Analog Channel S e l e c t b i t s −> 0 0 0 : c h a n n e l 0 (RA0/AN0) 0 0 1 : c h a n n e l 1 (RA1/AN1) 0 1 0 : c h a n n e l 2 (RA2/AN2) 0 1 1 : c h a n n e l 3 (RA3/AN3) 1 0 0 : c h a n n e l 4 (RA4/AN4) 1 0 1 : c h a n n e l 5 (RB6/AN5) 1 1 0 : c h a n n e l 6 (RB7/AN6) B i t 2 (GO/DONE) : A/D C o n v er s i o n S t a t u s B i t IF ADON = 1 : −> 0 : A/D c o n v e r s i o n not i n p r o g r e s s 1 : A/D c o n v e r s i o n i n p r o g r e s s B i t 1 R es er v e B i t 0 (ADON) : A/D On B i t 0 : A/D c o n v e r t e r module i s shut−o f f −> 1 : A/D c o n v e r t e r module i s o p e r a t i n g ADCON1 = 0 b00000010 ; +−−−−−−−−−−−−−−−−−−−− ||||||| ||||||| ||||||| ||||||| ||||||| ||||||| +−−−−−−−−−−−−−−−−−−− |||||| |||||| |||||| ++−−−−−−−−−−−−−−−−− |||| |||| |||| |||| |||| ++++−−−−−−−−−−−−− // ADC−C o n tr o l−R e g i s t e r 1 ( Bank 1 ) B i t 7 (ADFM) : A/D R e s u l t Formated S e l e c t b i t s −> 0 : Left j u s t i f i e d : i n ADRESH: Bit 9 bis Bit 2 i n ADRESL: B i t 1 , B i t 0 , Rest 0 1 : Right j u s t i f i e d : i n ADRESH: 0 0 0 0 0 0 Bit 9 Bit 8 i n ADRESL: Bit 7 bis Bit 0 B i t 6 (ADCS2) : A/D Clock D i v i d e by 2 S e l e c t b i t −> 0 : Disabled 1 : A/D c l o c k s o u r c e i s d i v i d e by 2 when system c l o c k i s used B i t 5 , 4 (VCFG1 :VCFG0) : A/D V o l ta g e R e f e r e n c e V r ef+ Vref− 00 : AVdd AVss 01 : AVdd Vref− 10 : V r ef+ AVss 11 : V r ef+ Vref− B i t 3−0 R es er v e 14 ∗/ /∗ ∗/ // Z a e h l r e g i s t e r f u e r Z e i t b a s i s i n i t i a l i s i e r e n Z a e h l e r Z e i t b a s i s 1 0 0 m s = KONSTZEITBASIS100MS ; // Z a e h l r e g i s t e r f u e r 100−ms−Z e i t b a s i s // i n i t i a l i s i e r e n /∗ ∗/ // I n t e r r u p t f r e i g e b e n INTCON = 0 b10100000 ; // I n t e r r u p t −C o n tr o l −R e g i s t e r ( Bank 1 ) +−−−−−−−−−−−−−−−−−−−− B i t 7 ( GIE) : Gl o b a l I n t e r r u p t Enable b i t ||||||| 0 : Disables a l l i nter r upts ||||||| −> 1 : E n a b l es a l l unmasked i n t e r r u p t s +−−−−−−−−−−−−−−−−−−− B i t 6 ( PEIE ) : P e r i p h e r a l I n t e r r u p t Enable b i t |||||| −> 0 : Disables a l l peripheral i nter r upts |||||| 1 : E n a b l es a l l unmasked p e r i p h e r a l i n t e r r u p t s +−−−−−−−−−−−−−−−−−− B i t 5 ( T0IE ) : Timer 0 O v er f l o w I n t e r r u p t Enable B i t ||||| 0 : Disabled ||||| −> 1 : Enabled +−−−−−−−−−−−−−−−−− B i t 4 (INTE ) : RB0/INT E x t e r n a l I n t e r r u p t Enable B i t |||| −> 0 : Disabled |||| 1 : Enabled +−−−−−−−−−−−−−−−− B i t 3 (RPIE ) : RB Port Change I n t e r r u p t Enable B i t ||| −> 0 : Disabled ||| 1 : Enabled +−−−−−−−−−−−−−−− B i t 2 ( T0IF ) : Timer 0 O v er f l o w I n t e r r u p t F l a g b i t || −> 0 : TMR0 r e g i s t e r d i d not o v e r f l o w || 1 : TMR0 r e g i s t e r has o v e r f l o w e d +−−−−−−−−−−−−−− B i t 1 (INTF) : RB0/INT E x t e r n a l I n t e r r u p t F l a g b i t | −> 0 : RB0/INT e x t e r n a l i n t e r r u p t d i d not o c c u r | 1 : RB0/INT e x t e r n a l i n t e r r u p t o c c u r r e d +−−−−−−−−−−−−− B i t 0 (RBIF ) : RB Port Change I n t e r r u p t F l a g b i t −> 0 : None o f RB7 : RB4 p i n s have changed s t a t e 1 : One o f th e RB7 : RB4 p i n s changed s t a t e 5 DEMONSTRATIONSBEISPIEL 1 (TOUCHPANEL) 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 15 } /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ TouchPanelTastenRou tine : ∗/ /∗ ∗/ /∗ A u f r u f : ∗/ /∗ ca . a l l e 100 ms ( vom Hauptprogramm ) ∗/ /∗ ∗/ /∗ Aufgabe : ∗/ /∗ E r m i ttel n , ob und w el ch e d er v i e r ” v i r t u e l l e n ” Tasten am Touch−Panel g e d r u e c k t ∗/ /∗ wurde , und den ” v i r t u e l l e n ” T a s ten zu s ta n d t o g g e l n und den S t a t u s mit den LEucht− ∗/ /∗ d i o d en a n z e i g e n . ∗/ /∗ ∗/ /∗ Zuordnung d er ” v i r t u e l l e n ” Tasten am Touch−Panel : ∗/ /∗ 255 +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ ∗/ /∗ 235 | +−−−−−−−−−−+ +−−−−−−−−−−+ | ∗/ /∗ | | Taste 1 | | Taste 3 | | ∗/ /∗ | | | | | | ∗/ /∗ 148 | +−−−−−−−−−−+ +−−−−−−−−−−+ | ∗/ /∗ 108 | +−−−−−−−−−−+ +−−−−−−−−−−+ | ∗/ /∗ | | Taste 2 | | Taste 4 | | ∗/ /∗ | | | | | | ∗/ /∗ 20 | +−−−−−−−−−−+ +−−−−−−−−−−+ | ∗/ /∗ 0 +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ ∗/ /∗ 0 20 108 148 235 255 ∗/ /∗ ∗/ /∗ V o r g eh en s w e i s e : ∗/ /∗ + x− und y−K o o r d i n a ten von Touchpanel l e s e n ∗/ /∗ + Pruefen , ob d i e x− und y−K o o r d i n a te im B e r e i c h von Taste 1 l i e g t , wenn j a , den ∗/ /∗ Zustand d er Taste 1 b e i einem Uebergang von ” n i c h t g e d r u e c k t ” zu ” g e d r u e c k t ” ∗/ /∗ i n v e r t i e r e n ( t o g g e l n ) und j e nach Aufgabe d er Taste d i e s e a u s f ü h r e n ( h i e r : den ∗/ /∗ S t a t u s d er Taste mit e i n e r L eu ch td i o d e a n z e i g e n ∗/ /∗ + Das s e l b e nun f u e r d i e a n d er en d r e i Tasten ∗/ /∗ ∗/ /∗ U eb er g a b ep a r a m eter : ∗/ /∗ keiner ∗/ /∗ ∗/ /∗ Rueckgabeparameter : ∗/ /∗ keiner ∗/ /∗ ∗/ /∗ Anmerkungen : ∗/ /∗ + B ei dem h i e r v er w en d eten r e s i s t i v e n Touch−Panel kann immer nur e i n e Taste ge− ∗/ /∗ d r u e c k t werden . Mehrere Tasten g l e i c h z e i t i g ( a l s o e i n e T a s ten k o m b i n a ti o n ) i s t ∗/ /∗ b e i r e s i s t i v e n Touchpanels n i c h t m ö g l i ch ! ∗/ /∗ + das s t a t i s c h e R e g i s t e r b u t t o n s t a t u s d i e h n t h i e r a l s H i l f s r e g i s t e r , wobei d i e ∗/ /∗ B i t s f o l g e n d e Bedeutung haben : ∗/ /∗ B i t 0 : Zustand von Taste 1 (0 = Taste n i c h t g ed r u eck t , 1 = Taste g e d r u e c k t ) ∗/ /∗ B i t 1 : H i l f s f l a g zu r Erkennung e i n e r ” n i c h t g ed r u eck t −g ed r u eck t −Flanke ” von ∗/ /∗ Taste 1 ∗/ /∗ B i t 2 : Zustand von Taste 2 (0 = Taste n i c h t g ed r u eck t , 1 = Taste g e d r u e c k t ) ∗/ /∗ B i t 3 : H i l f s f l a g zu r Erkennung e i n e r ” n i c h t g ed r u eck t −g ed r u eck t −Flanke ” von ∗/ /∗ Taste 2 ∗/ /∗ B i t 4 : Zustand von Taste 3 (0 = Taste n i c h t g ed r u eck t , 1 = Taste g e d r u e c k t ) ∗/ /∗ B i t 5 : H i l f s f l a g zu r Erkennung e i n e r ” n i c h t g ed r u eck t −g ed r u eck t −Flanke ” von ∗/ /∗ Taste 3 ∗/ /∗ B i t 6 : Zustand von Taste 4 (0 = Taste n i c h t g ed r u eck t , 1 = Taste g e d r u e c k t ) ∗/ /∗ B i t 7 : H i l f s f l a g zu r Erkennung e i n e r ” n i c h t g ed r u eck t −g ed r u eck t −Flanke ” von ∗/ /∗ Taste 4 ∗/ /∗ + Die z u l a e s s i g e n B e r e i c h e d er Tasten am Touch−Panel s i n d durch d i e Konstanten ∗/ /∗ KONSTTASTExXx und KONSTTASTExYx b e g r e n z t . ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ void TouchPanelTastenRoutine ( void ) { char x , y ; s t a t i c char b u t t o n s t a t u s = 0 ; // S c h r i t t 1 : x− und y−K o o r d i n a ten von Touchpanel l e s e n x = TP GetX ( ) ; y = TP GetY ( ) ; 5 DEMONSTRATIONSBEISPIEL 1 (TOUCHPANEL) 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 // S c h r i t t 2 : Taste 1 i f ( ( x >= KONSTTASTE1X1) && ( x <= KONSTTASTE1X2) && ( y >= KONSTTASTE1Y1) && ( y <= KONSTTASTE1Y2) ) { i f ( b u t t o n s t a t u s . F1 == 0 ) { b u t t o n s t a t u s . F1 = 1 ; i f ( button status { button status LED Taste1 = } else { button status LED Taste1 = } . F0 == 0 ) . F0 = 1 ; 1; . F0 = 0 ; 0; } } else { b u t t o n s t a t u s . F1 = 0 ; } // S c h r i t t 3 : Taste 2 i f ( ( x >= KONSTTASTE2X1) && ( x <= KONSTTASTE2X2) && ( y >= KONSTTASTE2Y1) && ( y <= KONSTTASTE2Y2) ) { i f ( b u t t o n s t a t u s . F2 == 0 ) { b u t t o n s t a t u s . F2 = 1 ; i f ( button status { button status LED Taste2 = } else { button status LED Taste2 = } . F3 == 0 ) . F3 = 1 ; 1; . F3 = 0 ; 0; } } else { b u t t o n s t a t u s . F2 = 0 ; } // S c h r i t t 4 : Taste 3 i f ( ( x >= KONSTTASTE3X1) && ( x <= KONSTTASTE3X2) && ( y >= KONSTTASTE3Y1) && ( y <= KONSTTASTE3Y2) ) { i f ( b u t t o n s t a t u s . F4 == 0 ) { b u t t o n s t a t u s . F4 = 1 ; i f ( button status { button status LED Taste3 = } else { button status LED Taste3 = } } } . F5 == 0 ) . F5 = 1 ; 1; . F5 = 0 ; 0; 16 5 DEMONSTRATIONSBEISPIEL 1 (TOUCHPANEL) 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 17 else { b u t t o n s t a t u s . F4 = 0 ; } // S c h r i t t 5 : Taste 4 i f ( ( x >= KONSTTASTE4X1) && ( x <= KONSTTASTE4X2) && ( y >= KONSTTASTE4Y1) && ( y <= KONSTTASTE4Y2) ) { i f ( b u t t o n s t a t u s . F6 == 0 ) { b u t t o n s t a t u s . F6 = 1 ; i f ( button status { button status LED Taste4 = } else { button status LED Taste4 = } . F7 == 0 ) . F7 = 1 ; 1; . F7 = 0 ; 0; } } else { b u t t o n s t a t u s . F6 = 0 ; } } /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ Hauptprogramm ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ Aufgaben d es Hauptprogramms : ∗/ /∗ + C o n t r o l l e r i n i t i a l i s i e r e n ( Unterprogramm INIT ) ∗/ /∗ + T a e t i g k e i t e n / Unterprogramme , d i e a l l e z y k l i s c h d u r c h g e f u e h r t werden muessen : ∗/ /∗ + a l l e 100 ms : Touchpanel a b f r a g en , ob e i n e ” v i r t u e l l e ” Taste g e d r u e c k t wurde ∗/ /∗ ( Unterprogramm TouchPanelTastenRoutine ) ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ void main ( void ) { // C o n t r o l l e r i n i t i a l i s i e r e n Init () ; // E n d l o s s c h l e i f e while ( 1 ) { i f ( FlagZeitbasis100ms) { // Touchpanel a b f r a g en , ob e i n e ” v i r t u e l l e ” Taste g e d r u e c k t wurde TouchPanelTastenRou tine ( ) ; // B o t s c h a f t s f l a g ( f u e r 100 ms−Z e i t b a s i s ) z u r u e c k s e t z e n FlagZeitbasis100ms = 0; } } } Datei TOUCHPANEL.C: 1 2 3 4 5 6 7 8 9 /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ Unterprogramme zum Lesen d er x− und y−K o o r d i n a te von einem r e s i s t i v e n Touchpanel ∗/ /∗ ∗/ /∗ 255 +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ ∗/ /∗ | | ∗/ /∗ | | ∗/ /∗ | | ∗/ /∗ | | ∗/ /∗ | | ∗/ 5 DEMONSTRATIONSBEISPIEL 1 (TOUCHPANEL) 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 18 /∗ | | ∗/ /∗ 0 +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ ∗/ /∗ 0 255 ∗/ /∗ ∗/ /∗ Compiler : mikroC ∗/ /∗ ∗/ /∗ E n t w i c k l e r : S t e f a n Buchgeher ∗/ /∗ E n t w i c k l u n g s b e g i n n d er S o f t w a r e : 2 4 . J u l i 2009 ∗/ /∗ F u n k t i o n s f a e h i g s e i t : 2 4 . J u l i 2009 ∗/ /∗ L e t z t e B e a r b e i t u n g : 1 6 . August 2009 ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ I n c l u d e −D a tei en ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ #include ”TOUCHPANEL.H” #include ”myPIC ADC.H” /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ Unterprogramme zum Lesen d er x− und y−K o o r d i n a te ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ TP GetX : ∗/ /∗ ∗/ /∗ Aufgabe : ∗/ /∗ x−K o o r d i n a te von Touchpanel l e s e n : ∗/ /∗ ∗/ /∗ V o r g eh en s w e i s e : ∗/ /∗ + P o r t p i n DRIVEA = 1 und P o r t p i n DRIVEB = 0 ( Rechts : +Vcc , L i n k s : Vss , ∗/ /∗ Oben : hochohmig , Unten : x−K o o r d i n a te ) ∗/ /∗ + 5ms warten ∗/ /∗ + x−Wert ( Unten ) l e s e n ∗/ /∗ ∗/ /∗ U eb er g a b ep a r a m eter : ∗/ /∗ keine ∗/ /∗ ∗/ /∗ Rueckgabeparameter : ∗/ /∗ x−K o o r d i n a te ( 0 . . . 2 5 5 ) ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ char TP GetX ( void ) { char x K o o r d i n a t e ; // P o r t p i n DRIVEA = 1 und P o r t p i n DRIVEB = 0 ( Rechts : +Vcc , L i n k s : Vss , // Oben : hochohmig , Unten : x−K o o r d i n a te ) TP PORT DRIVEA = 1 ; TP PORT DRIVEB = 0 ; // 5ms warten Delay ms ( 5 ) ; // x−Wert ( Unten ) l e s e n x K o o r d i n a t e = ADC8(TP CHAN READX) ; return ( x K o o r d i n a t e ) ; } /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ TP GetY : ∗/ /∗ ∗/ /∗ Aufgabe : ∗/ /∗ y−K o o r d i n a te von Touchpanel l e s e n : ∗/ /∗ ∗/ /∗ V o r g eh en s w e i s e : ∗/ /∗ + P o r t p i n DRIVEA = 0 und P o r t p i n DRIVEB = 1 ( Oben : +Vcc , Unten : Vss , ∗/ /∗ Rechts : hochohmig , L i n k s : y−K o o r d i n a te ) ∗/ /∗ + 5ms warten ∗/ /∗ + y−Wert ( L i n k s ) l e s e n ∗/ /∗ ∗/ /∗ U eb er g a b ep a r a m eter : ∗/ /∗ keine ∗/ 5 DEMONSTRATIONSBEISPIEL 1 (TOUCHPANEL) 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 19 /∗ ∗/ /∗ Rueckgabeparameter : ∗/ /∗ y−K o o r d i n a te ( 0 . . . 2 5 5 ) ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ char TP GetY ( void ) { char y K o o r d i n a t e ; // P o r t p i n DRIVEA = 0 und P o r t p i n DRIVEB = 1 ( Oben : +Vcc , Unten : Vss , // Rechts : hochohmig , L i n k s : y−K o o r d i n a te ) TP PORT DRIVEA = 0 ; TP PORT DRIVEB = 1 ; // 5ms warten Delay ms ( 5 ) ; // y−Wert ( L i n k s ) l e s e n y K o o r d i n a t e = ADC8(TP CHAN READY) ; return ( y K o o r d i n a t e ) ; } Datei TOUCHPANEL.H: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ Header f u e r d i e Unterprogramme zum Lesen d er x− und y−K o o r d i n a te von einem ∗/ /∗ r e s i s t i v e n Touchpanel ∗/ /∗ ∗/ /∗ Compiler : mikroC ∗/ /∗ ∗/ /∗ E n t w i c k l e r : S t e f a n Buchgeher ∗/ /∗ E n t w i c k l u n g s b e g i n n d er S o f t w a r e : 2 4 . J u l i 2009 ∗/ /∗ F u n k t i o n s f a e h i g s e i t : 2 4 . J u l i 2009 ∗/ /∗ L e t z t e B e a r b e i t u n g : 1 6 . August 2009 ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ G l o b a l e R e g i s t e r ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ k e i n e g l o b a l e n R e g i s t e r ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ P o r t b e l e g u n g ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ #define TP PORT DRIVEA PORTA. F1 #define TP PORT DRIVEB PORTA. F0 /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ Analoge Kanaele ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ #define TP CHAN READX 3 #define TP CHAN READY 2 /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ F u n k t i o n s p r o t o t y p e n ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ char TP GetX ( void ) ; char TP GetY ( void ) ; Datei myPIC ADC.C: 1 2 3 4 5 6 7 8 9 10 11 /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ Unterprogramme zum Lesen d es PIC−i n t e r n e n ADC−Moduls ∗/ /∗ ∗/ /∗ Compiler : mikroC ∗/ /∗ ∗/ /∗ E n t w i c k l e r : S t e f a n Buchgeher ∗/ /∗ E n t w i c k l u n g s b e g i n n d er S o f t w a r e : 2 4 . J u l i 2009 ∗/ /∗ F u n k t i o n s f a e h i g s e i t : 2 4 . J u l i 2009 ∗/ /∗ L e t z t e B e a r b e i t u n g : 2 4 . J u l i 2009 ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ 5 DEMONSTRATIONSBEISPIEL 1 (TOUCHPANEL) 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 20 /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ I n c l u d e −D a tei en ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ #include ”myPIC ADC.H” /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ Unterprogramm zu r Analog−D i g i t a l −Wandlung ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ ADC8 : ∗/ /∗ ∗/ /∗ Aufgabe : ∗/ /∗ Analog−D i g i t a l −Wandlung mit dem PIC−i n t e r n e ADC f u e r den a u s g e w a e h l t e n ADC−Kanal ∗/ /∗ s t a r t e n , a u f das Wa n d l u n g s er g eb n i s warten und d i e s e s dem a u f r u f e n d e n Programm ∗/ /∗ zu r u eck g eb en . ∗/ /∗ ∗/ /∗ U eb er g a b ep a r a m eter : ∗/ /∗ kanal : ∗/ /∗ ∗/ /∗ Rueckgabeparameter : ∗/ /∗ 8 h o e h e r w e r t i g e n B i t s d er AD−Wandlung ( PIC−R e g i s t e r : ADRESH) ∗/ /∗ ∗/ /∗ V o r g eh en s w e i s e : ∗/ /∗ + ADC−Kanal a u s w a eh l en ( B i t s <3:5> im R e g i s t e r ADCON0) . Dazu muss d i e Kanal−Nummer∗/ /∗ an d i e s e P o s i t i o n g es ch o b en werden und mit dem R e g i s t e r ADCON0 v e r k n u e p f t werden ∗/ /∗ + ca . 50 Mikrosekunden ( us ) warten . D i e s e Z e i t b e n o e t i g t d er PIC um den i n t e r n e n ∗/ /∗ Kondensator mit d er zu messenden Analogspannung zu l a d e n . ∗/ /∗ + Analog−D i g i t a l −Wandlung s t a r t e n . Dazu das F l a g GO ( im R e g i s t e r ADCON0) s e t z e n . ∗/ /∗ + Warten , b i s d er PIC mit d er Wandlung f e r t i g i s t . Der PIC s e t z t das F l a g GO auto −∗/ /∗ m a ti s ch zu r u eck , wenn e r mit d er Analog−D i g i t a l −Wandlung f e r t i g i s t . ∗/ /∗ + Aus den R e g i s t e r n ADRESL und ADRESH das E r g e b n i s zusammensetzen und an das auf − ∗/ /∗ r u f e n d e Unterprogramm ( o d er Hauptprogramm ) zu r u eck g eb en ∗/ /∗ ∗/ /∗ Anmerkung : ∗/ /∗ Das Ausgabeformat d er ADC−Wandlung , a l s o wie d i e 10 E r g e b n i s b i t s i n den R e g i s t e r n ∗/ /∗ ADRESL und ADRESH a b g e l e g t werden wird an a n d e r e r S t e l l e ( z . B . im Unterprogramm ∗/ /∗ INIT ) k o n f i g u r i e r t . ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ char ADC8( char k a n a l ) { ADCON0 = ADCON0 & 0 b11000111 ; k a n a l = k a n a l << 3 ; ADCON0 = ADCON0 | k a n a l ; Delay us (50) ; ADCON0.GO = 1 ; while (ADCON0.GO) ; return (ADRESH) ; } Datei myPIC ADC.H: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ Header f u e r d i e Unterprogramme zum Lesen d es PIC−i n t e r n e n ADC−Moduls ∗/ /∗ ∗/ /∗ Compiler : mikroC ∗/ /∗ ∗/ /∗ E n t w i c k l e r : S t e f a n Buchgeher ∗/ /∗ E n t w i c k l u n g s b e g i n n d er S o f t w a r e : 2 4 . J u l i 2009 ∗/ /∗ F u n k t i o n s f a e h i g s e i t : 2 4 . J u l i 2009 ∗/ /∗ L e t z t e B e a r b e i t u n g : 2 4 . J u l i 2009 ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ F u n k t i o n s p r o t o t y p e n ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ char ADC8( char k a n a l ) ; 5 DEMONSTRATIONSBEISPIEL 1 (TOUCHPANEL) 5.5 21 Anmerkungen zur Software Der Quellcode für dieses erste Demonstrationsbeispiel wurde in C mit der freien Demoversion des mikroC-Compilers erstellt. Die Software besteht im Wesentlichen aus den folgenden Programmteilen: • kurzes Hauptprogramm am Ende des Quellcodes von TouchPanel Demo.c, Zeilen 507 bis 524 • kurze Interrupt-Service-Routine (kurz: ISR), in der Datei TouchPanel Demo.c, Zeilen 110 bis 120 • 1 Unterprogramm zur Initialisierung des PIC16F88 (Unterprogramm Init in der Datei TouchPanel Demo.c, Zeilen 150 bis 329). • 1 Unterprogramm zur Abfrage der virtuellen Tasten am Touchpanel (Unterprogramm TouchPanelTastenRoutine in der Datei TouchPanel Demo.c, Zeilen 391 bis 496). • 2 Unterprogramme zur Bestimmung der Koordinaten am Touchpanel (Unterprogramme TP GetX und TP GetY in der Datei TOUCHPANEL.C, Zeilen 47 bis 64 bzw. Zeilen 85 bis 102). • 1 Hilfs-Unterprogramm zur Analog-Digital-Wandlung mit dem PIC-internen ADCHardware-Modul (Unterprogramm ADC8 in der Datei myPIC ADC.C, Zeilen 47 bis 59). Interrupt-Service-Routine (kurz: ISR): Die ISR (in der Datei TouchPanel Demo.c, Zeilen 110 bis 120) wird alle 8,2ms aufgerufen und besitzt hier nur die Aufgabe eine 100-ms-Zeitbasis zu erzeugen, indem sie ein Botschaftsflag für das Hauptprogramm erzeugt. Das Hauptprogramm reagiert auf dieses Botschaftsflag, indem es das Unterprogramm zur Ermittlung, ob eine virtuelle Taste am Touchpanel gedrückt wurde aufruft. Durch diesen Mechanismus wird dieses Unterprogramm zyklisch, alle 100ms aufgerufen. Damit eine Zeit von ca. 100ms entsteht, muss die ISR 12-mal aufgerufen werden (12 x 8,2ms = ca. 98ms also ca. 100ms). Bei jedem ISR-Aufruf muss also ein Zählregister um 1 vermindert werden. Besitzt es danach den Wert 0, so sind 100ms (genauer: 98ms) vergangen. Nun wird das Botschaftsflag FlagZeitbasis100ms im Register FlagISRHP gesetzt, und das Zählregister muss mit dem Wert 12 neu geladen werden. Der Wert 12 wird hier durch die Konstante KONSTZEITBASIS100MS ersetzt. Die Zeit von 8,2ms ergibt sich, weil als Takt der interne 4-MHz-Takt verwendet wird (Register OSCCON, Zeile 182) und weil der Vorteiler (VT) im Register OPTION REG mit dem Wert 1:32 geladen wird (Zeile 154). ISRAUF RUF [µs] = 4 · 256 · V T 4 · 256 · 32 = = 8192µs = 8.2ms fT akt [MHz] 4 5 DEMONSTRATIONSBEISPIEL 1 (TOUCHPANEL) 22 Hauptprogramm: Das Hauptprogramm (main, Datei: TouchPanel Demo.c, Zeilen 507 bis 524) befindet sich nach der Initialisierung (mit dem Unterprogramm Init) in einer Endlosschleife. Diese Schleife besitzt nur die Aufgabe ständig das Botschaftsflag FlagZeitbasis100ms zu prüfen. Ist dieses Botschaftsflag gesetzt, so muss vom Hauptprogramm eine bestimmte Aufgabe ausgeführt werden. Diese Aufgaben sind in Form von Unterprogrammen vorhanden. Hier hat es die Aufgabe das Unterprogramm zur Abfrage des Touchpanels aufzurufen (Zeile 518). Wichtig ist, dass das Botschaftsflag wieder gelöscht werden muss (Zeile 521). Unterprogramm Init: Das Unterprogramm Init (Datei: TouchPanel Demo.c, Zeilen 150 bis 329) dient zur Initialisierung des Mikrocontrollers. Hier werden unter anderem die Ports konfiguriert (Port dient als Eingang oder als Ausgang), der oder die Timer eingestellt usw. Dieses Unterprogramm ist vom Controllertyp abhängig und je nach Anwendung mehr oder weniger umfangreich. In diesem Unterprogramm werden auch die globalen Register initialisiert. Hier, bei diesem Demonstrationsbeispiel das Zählregister für die 100-ms-Zeitbasis (Zeile 299). Unterprogramm TouchPanelTastenRoutine: Das Unterprogramm TouchPanelTastenRoutine (Datei: TouchPanel Demo.c, Zeilen 391 bis 496) ist das wesentliche Unterprogramm für dieses Demonstrationsbeispiel. Es überprüft regelmäßig, ob am Touchpanel eine der vier virtuellen“ Tasten gedrückt wurde. ” Dazu muss es zunächst die X- und die Y-Koordinate mit den im Abschnitt 4 (ab Seite 3) beschriebenen Unterprogrammen TP GetX und TP GetY ermitteln (Zeilen 398 und 399). Danach wird überprüft, ob diese Koordinaten im Bereich der ersten virtuellen“ Taste lie” gen (Zeile 402). Nur wenn diese Koordinaten im Bereich der ersten Taste liegen, und wenn diese Taste vor dem Aufruf des Unterprogramms noch nicht gedrückt wurde (Zeile 404) so erfolgt nun das Toggeln des Tastenzustandes und der Leuchtdiode (Zeilen 408 bis 417). Beachte: Damit bei einem längeren“ Drücken auf das Touchpanel der Tastenzustand ” und die Leuchtdiode nicht ständig toggeln ist ein Hilfsbit notwendig. Dieses Hilfsbit wird gesetzt, sobald die Taste gedückt wurde (Zeilen 404 und 406), und wird wieder gelöscht, wenn die Koordinaten außerhalb dieser Taste sind (Zeile 422). Dieser Vorgang muss nun für die weiteren drei virtuellen“ Tasten wiederholt werden. ” Wichtig: Dieses Unterprogramm muss im Hauptprogramm regelmäßig (zyklisch) aufgerufen werden (Siehe Hauptprogramm, Datei: TouchPanel Demo.c, Zeile 518). Unterprogramme TP GetX und TP GetY: Diese beiden Unterprogramme wurden bereits im Abschnitt 4 (ab Seite 3) sehr ausführlich behandelt, so dass sie hier nicht mehr näher erläutert werden müssen. 5 DEMONSTRATIONSBEISPIEL 1 (TOUCHPANEL) 23 Wichtig: In der Datei TOUCHPANEL.H müssen die Portpins und die analogen Kanäle gemäß der Demonstrationsschaltung nach Abbildung 8 (Seite 8) definiert werden, Zeilen 19, 20, 24 und 25. Unterprogramm ADC8: Das Unterprogramm ADC8 (Datei: myPIC ADC.C, Zeilen 47 bis 59) dient zur Analog-DigitalWandlung mit dem PIC-internen-Hardwaremodul und entspricht der Vorgabe im Datenblatt zum PIC16F88 [5]. Sonstiges: Am Beginn des Quellcodes (in der Datei TouchPanel Demo.c) befinden sich die folgenden Definitionen und Einstellungen: • Einbinden externer Codeteile (Zeile 27) • Definition der globalen Register für die ISR (Zeilen 43 und 44) • Portdefinition (hier für die vier Leuchtdioden, Zeilen 56 bis 59) • Konstanten für die Erzeugung der 100-ms-Zeitbasis (Zeile 64) und für die Erkennung der vier virtuellen“ Tasten (Zeilen 68 bis 86) ” • Die Funktionsprototypen für die hier verwendeten Unterprogramme (Zeilen 94 und 95) • Ab Zeile 110 beginnt der Quellcode der ausreichend mit Kommentaren versehen ist Ein kleiner Nachteil beim mikroC-Compiler ist, dass die Konfigurationsbits für den PICMikrocontroller in der IDE gesetzt werden müssen. Ich persönlich würde diese lieber im Quellcode mit einer geeigneten Anweisung setzen. Hier sind die notwendigen Einstellungen für den PIC16F88 für dieses Demonstrationsbeispiel: ! ! ! ! ! ! ! ! CP OFF DEBUG OFF WRT ENABLE OFF CPD OFF LVP OFF BODEN OFF MCLR OFF PWRTE ON 6 DEMONSTRATIONSBEISPIEL 2 (TOUCHSCREEN) ! ! ! ! 6 24 WDT OFF INTRC IO IESO OFF CFG2 FCMEN OFF CFG2 Demonstrationsbeispiel 2 (Touchscreen) Eine typische Anwendung für ein Touchpanel ist das Touchscreen. Bei einem Touchscreen wird das Touchpanel über einem Grafik-Display befestigt. Dadurch ergibt sich eine sehr kompakte Bedien- und Anzeigeeinheit. Das Grafik-Display zeigt Tasten in Form von Rechtecken an, und ein Druck auf das darüberliegende, durchsichtige Touchpanel löst die gewünschte Reaktion aus. Das zweite Demonstrationsbeispiel zeigt dies an einem einfachen Besipiel mit zwei Tasten (Abbildung 11). Abbildung 11: Demonstrationsbeispiel 2 (Foto) 6 DEMONSTRATIONSBEISPIEL 2 (TOUCHSCREEN) 25 Die Abbildung 12 zeigt die Koordinaten der beiden virtuellen Tasten am Touchpanel. Abbildung 12: Demonstrationsbeispiel 2 (Koordinaten der virtuellen Tasten) 6.1 Schaltung (Hardware) Die Abbildung 13 zeigt die Schaltung für das zweite Demonstrationsbeispiel. Abbildung 13: Demonstrationsbeispiel 2 (Touchscreen, Schaltung) Der Wesentliche Unterschied zum ersten Demonstrationsbeispiel ist das Grafik-Display (LCD1) mit einer Auflösung von 128 x 64 Pixel. Dadurch ist auch ein größerer“ Mikro” controller (IC1) mit zusätzlichen Portpins notwendig. Für dieses Demonstrationsbeispiel wird daher der PIC16F877 verwendet, der mit einem externen 20-MHz-Takt versorgt wird (X1, C5, C6 und R14). Der PIC16F877 lässt sich sehr gut in der Schaltung programmieren. Diese Methode wird ICSP genannt. ICSP steht für In-Circuit-Serial-Programming. 6 DEMONSTRATIONSBEISPIEL 2 (TOUCHSCREEN) 26 Der Reset wird hier mit einem RC-Glied bestehend aus R13 und C3 erzeugt. Zusätzlich kann ein Reset jederzeit mit dem Taster S1 ausgelöst werden. Da der Reseteingang des Mikrocontrollers (MCLR, Pin 1) auch gleichzeitig die Programmierspannung (ca. 13V) bei der ICSP-Programmierung ist, darf während einer Programmierung kein Reset ausgelöst werden. Durch die Diode D1 ist ein Reset durch das RC-Glied (R13 und C3) während einer Programmierung via ICSP nicht möglich. Für die Beschaltung des Touchpanel (TP1), für den Koppelkondensator (hier: C4) und für die Stromversorgung gilt das gleiche wie beim ersten Demonstrationsbeispiel. 6.2 Stückliste Nr. R1 - R6, R8, R9, R15 R7, R10 R11 R12 R13 R14 C1, C2, C4, C8, C9 C3, C7 C5, C6 C10 D1 D2 D3 T1, T3 T2, T4, T5 IC1 IC2 X1 LCD1 TP1 IC1 K1 K2 LCD1 JP1 TP1 JP1 S1 Bezeichnung Widerstand 0 Ohm SMD 1206 Widerstand 1k Widerstand 47k Trimmer 10k Widerstand 10 Ohm Widerstand 10k Widerstand 270 Ohm Keramikkondensator 100nF RM5.08 Mini-Elko 10µF/25V Keramikkondensator 22pF RM2.54 Tantal 1µF/35V Diode 1N5711 Diode 1N4001 Low-current-LED 3mm grün Transistor BC557B Transistor BC547B Mikrocontroller PIC16F877(A) Spannungsregler 7805 Quarz 20 MHz Grafik-Display 128 x 64 Pixel Touch-Panel IC-Präzisionssockel 40polig Buchsenleiste 5polig Anschlussklemme 2polig Stiftleiste 20polig Stiftleiste 2polig Touch-Panel-Connector Jumper, schwarz Taster Platine Basismaterial (160 x 100mm) Abstandsbolzen M3x10 Mutter M3 Abstandsbolzen M2.5x10 Beilagscheibe M2.5 Zylinderkopfschraube M2.5x6 St. 3 9 2 1 1 1 1 5 2 2 1 1 1 1 2 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 4 4 4 4 Lief. Conrad Conrad Conrad Conrad Conrad Conrad Conrad Conrad Conrad Conrad Conrad Conrad Conrad Conrad Conrad Conrad Farnell Conrad Conrad Tigal Tigal Conrad Conrad Conrad Conrad Conrad Tigal Conrad Conrad Conrad Bestell-Nr. 40 22 22 40 81 66 40 83 60 43 08 62 40 79 25 40 82 80 40 80 93 45 33 58 46 05 24 45 71 67 48 16 70 15 54 59 16 22 13 14 59 71 15 50 98 15 50 12 976-1373 17 92 05 16 87 69 18 74 18 73 73 96 04 96 24 24 Alt. Lief. Bestell-Nr. Conrad 16 51 44 77 38 34 78 78 73 41 52 70 04 60 52 92 49 Tabelle 2: Demonstrationsbeispiel 2 (Touchscreen, Stückliste, Stand: September 2009) 6.3 Layout und Bestückungsplan Die Abbildung 14 zeigt das Layout für dieses Demonstrationsbeispiel. Es ist im Maßstab 1:1 und wie üblich spiegelverkehrt. Der Bestückungsplan ist in Abbildung 15 zu sehen. Der Nachbau sollte auch bei diesem Demonstrationsbeispiel keine Probleme bereiten. Bei der Bestückung beginnt man auch hier üblicherweise mit den niedrigen Bauteilen. 6 DEMONSTRATIONSBEISPIEL 2 (TOUCHSCREEN) Abbildung 14: Demonstrationsbeispiel 2 (Touchscreen, Layout) Abbildung 15: Demonstrationsbeispiel 2 (Touchscreen, Bestückungsplan) 27 6 DEMONSTRATIONSBEISPIEL 2 (TOUCHSCREEN) 28 Achtung: Die Drahtbrücken“ in Form von SMD-Widerständen (0 Ohm) auf der Lötseite ” nicht vergessen! 6.4 Software Auch bei diesem Demonstrationsbeispiel ist der Quellcode zur besseren Übersicht in mehrere Dateien aufgeteilt: • TouchScreen Demo.c beinhaltet das Hauptprogramm, die Interrupt-Service-Routine (ISR) und die Unterprogramme zur Initialisierung des Mikrocontrollers (PIC16F877) und zur Abfrage der virtuellen Tasten am Touchpanel. • TOUCHPANEL.C beinhaltet die Unterprogramme zum Lesen der X- und Y-Koordinate des Touchpanel gemäß Abschnitt 4. • TOUCHPANEL.H ist die Headerdatei zu TOUCHPANEL.C und beinhaltet die Portdefinitionen, die bei jeder Anwendung überprüft und ggf. angepasst werden müssen. • myPIC ADC.C beinhaltet das Hilfsunterprogramm zur Analog-Digital-Wandlung. • myPIC ADC.H ist die Headerdatei zu myPIC ADC.C. Achtung: Für dieses zweite Demonstrationsbeispiel ist die kostenpflichtige Vollversion des C-Compilers mikroC notwendig! Datei TouchScreen Demo.c: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ T o u ch s cr een − D e m o n s t r a t i o n s b e i s p i e l ∗/ /∗ ∗/ /∗ 255 +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ ∗/ /∗ | | ∗/ /∗ 184 | +−−−−−−−−−−+ +−−−−−−−−−−+ | ∗/ /∗ | | | | | | ∗/ /∗ | | Taste 1 | | Taste 2 | | ∗/ /∗ | | | | | | ∗/ /∗ 72 | +−−−−−−−−−−+ +−−−−−−−−−−+ | ∗/ /∗ | | ∗/ /∗ 0 +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ ∗/ /∗ 0 20 116 140 236 255 ∗/ /∗ ∗/ /∗ e x t e r n e r Takt (2 0 MHz) ∗/ /∗ ∗/ /∗ Compiler : mikroC ∗/ /∗ ∗/ /∗ E n t w i c k l e r : S t e f a n Buchgeher ∗/ /∗ E n t w i c k l u n g s b e g i n n d er S o f t w a r e : 2 4 . J u l i 2009 ∗/ /∗ F u n k t i o n s f a e h i g s e i t : 2 4 . J u l i 2009 ∗/ /∗ L e t z t e B e a r b e i t u n g : 1 6 . August 2009 ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ I n c l u d e −D a tei en ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ #include ”TOUCHPANEL.H” 6 DEMONSTRATIONSBEISPIEL 2 (TOUCHSCREEN) 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 29 /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ S t r u k t u r e n ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ k e i n e S t r u k t u r e n v er w en d et ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ E x ter n e R e g i s t e r ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ k e i n e e x t e r n e n R e g i s t e r ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ B i t s i n den e x t e r n e n R e g i s t e r n ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ k e i n e e x t e r n e n R e g i s t e r ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ G l o b a l e R e g i s t e r ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ char FlagISRHP ; char ZaehlerZeitbasis100ms ; /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ B i t s i n den g l o b a l e n R e g i s t e r n ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ R e g i s t e r FlagISRHP ∗/ #define F l a g Z e i t b a s i s 1 0 0 m s FlagISRHP . F0 /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ P o r t b e l e g u n g ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ S i e h e TOUCHPANEL.H ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ Konstanten ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ // Konstanten f u e r d i e Z e i t b a s e n #define KONSTZEITBASIS100MS 15 // Konstanten f u e r d i e T a s t e n k o o r d i n a t e n (Demo) // Taste 1 #define KONSTTASTE1X1 20 #define KONSTTASTE1X2 116 #define KONSTTASTE1Y1 72 #define KONSTTASTE1Y2 184 // Taste 2 #define KONSTTASTE2X1 140 #define KONSTTASTE2X2 236 #define KONSTTASTE2Y1 72 #define KONSTTASTE2Y2 184 /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ T a b e l l e n ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ k e i n e T a b e l l e n ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ F u n k t i o n s p r o t o t y p e n ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ void I n i t ( void ) ; void TouchPanelTastenRoutine ( void ) ; /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ISR − Timer0 ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ I n t e r r u p t S e r v i c e R o u ti n e : ∗/ /∗ ∗/ /∗ A u f r u f : ∗/ /∗ a l l e 6 . 5 ms ( u n g e f a e h r ) ∗/ /∗ ∗/ /∗ Aufgaben : ∗/ /∗ + Z e i t b a s i s f u e r 100 M i l l i s e k u n d e e r z e u g e n ∗/ /∗ + Das Timer−I n t e r r u p t −F l a g T0IF w i e d e r l o e s c h e n ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ void i n t e r r u p t ( void ) // I n t e r r u p t r o u t i n e { Z a e h l e r Z e i t b a s i s 1 0 0 m s −−; i f ( Z a e h l e r Z e i t b a s i s 1 0 0 m s == 0 ) // B o t s c h a f t s f l a g f u e r 100 ms−Z e i t b a s i s s e t z e n { 6 DEMONSTRATIONSBEISPIEL 2 (TOUCHSCREEN) 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 30 FlagZeitbasis100ms = 1; Z a e h l e r Z e i t b a s i s 1 0 0 m s = KONSTZEITBASIS100MS ; // Z a e h l r e g i s t e r f u e r 100−ms− // Z e i t b a s i s neu l a d e n } INTCON . T0IF = 0 ; // Timer−I n t e r r u p t −F l a g T0IF w i e d e r l o e s c h e n } /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ Unterprogramme und Funktionen ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ I n i t : ∗/ /∗ ∗/ /∗ Aufgabe : ∗/ /∗ I n i t i a l i s i e r u n g d es P r o z e s s o r : ∗/ /∗ + Timer 0 (TMR0) l o e s c h e n ∗/ /∗ + Timer 0−ISR s o l l ca . a l l e 6 , 5ms a u f g e r u f e n werden , d a h er den V o r t e i l e r mit ∗/ /∗ 1 : 1 2 8 l a d e n ( b e i einem 20−MHz−Takt ) ∗/ /∗ 4 ∗ 256 ∗ VT 4 ∗ 256 ∗ 128 ∗/ /∗ ISR−A u f r u f [ us ] = −−−−−−−−−−−−− = −−−−−−−−−−−−− = 6 5 5 3 . 6 us = 6 . 5 5 ms ∗/ /∗ f [MHz] 20 ∗/ /∗ + Port A und C f u e r das Touchpanel a l s Eingang ( f u e r ADC) bzw . a l s Ausgang ∗/ /∗ d e f i n i e r e n ( Anmerkung : Port B und Port D werden f u e r das Gr a f i k −D i s p l a y im ∗/ /∗ Hauptprogramm d e f i n i e r t ! ) ∗/ /∗ + ADC k o n f i g u r i e r e n ∗/ /∗ + Zaehlregister fuer Zeitbasis i n i t i a l i s i e r e n ∗/ /∗ + I n t e r r u p t f r e i g e b e n ( Timer0 f r e i g e b e n durch S e t z e n von GIE und T0IE im ∗/ /∗ INTCON−R e g i s t e r ) ∗/ /∗ ∗/ /∗ U eb er g a b ep a r a m eter : ∗/ /∗ keiner ∗/ /∗ ∗/ /∗ Rueckgabeparameter : ∗/ /∗ keiner ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ void INIT ( void ) { // Timer−0− I n t e r r u p t k o n f i g u r i e r e n TMR0 = 0 ; // Timer 0 a u f 0 v o r e i n s t e l l e n OPTION REG = 0 b10000110 ; // Option−R e g i s t e r ( Bank 1 ) /∗ +−−−−−−−−−−−−−−−− B i t 7 (nRBPU) : P u l l −Up−Wi d er s ta en d e am Port B ||||||| 0 : P u l l −Up a k t i v i e r t ||||||| −> 1 : P u l l −Up d e a k t i v i e r t +−−−−−−−−−−−−−−−− B i t 6 (INTEDG) : I n t e r r u p t Edge S e l e c t B i t |||||| −> 0 : I n t e r r u p t on f a l l i n g edge o f RB0/INT p i n |||||| 1 : I n t e r r u p t on r i s i n g edge o f RB0/INT p i n +−−−−−−−−−−−−−−− B i t 5 (T0CS) : Timer 0 Clock s o u r c e S e l e c t B i t ||||| −> 0 : T r a n s i t i o n on RA4/T0CKI p i n ||||| 1 : I n t e r n a l i n s t r u c t i o n c y c l e c l o c k (CLKOUT) +−−−−−−−−−−−−−− B i t 4 (T0SE ) : TMR0 S o u r ce Edge S e l e c t b i t |||| −> 0 : In cr em en t on low−to−h i g h t r a n i t i o n |||| 1 : In cr em en t on high −to −low t r a n i t i o n +−−−−−−−−−−−− B i t 3 (PSA) : P r e s c a l e r Assignment b i t ||| −> 0 : P r e s c a l e r i s a s s i g n e d to th e TIMER0 module ||| 1 : P r e s c a l e r i s a s s i g n e d to th e WDT +++−−−−−−−−− B i t 2−0 ( PS2 : PS0 ) : P r e s c a l e r Rate S e l e c t b i t s B i t Value TMR0 Rate WDT Rate 000 : 1:2 1:1 001 : 1:4 1:2 010 : 1:8 1:4 011 : 1:16 1:8 100 : 1:32 1:16 101 : 1:64 1:32 −> 110 : 1:128 1:64 111 : 1:256 1:128 ∗/ /∗ // P o r t s k o n f i g u r i e r e n TRISA = 0 b00111111 ; // R i c h t u n g s r e g i s t e r Port A ( 0 : Ausgang , 1 : Eingang ) ++−−−−−−−−−−−−−−−−−−−− B i t 7−6 R es er v e +−−−−−−−−−−−−−−−−−−− B i t 5 Port RA5 : h i e r u n b en u tzt 6 DEMONSTRATIONSBEISPIEL 2 (TOUCHSCREEN) 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 +−−−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−− +−−−−−−−−−−−−−− Bit Bit Bit Bit Bit 4 3 2 1 0 Port Port Port Port Port RA4 : RA3 : RA2 : RA1 : RA0 : hier hier hier hier hier 31 u n b en u tzt u n b en u tzt u n b en u tzt a n a l o g e r Eingang ( Touchpanel ) a n a l o g e r Eingang ( Touchpanel ) ∗/ /∗ TRISB und TRISD ( f u e r Gr a f i k −D i s p l a y ) : S i e h e Hauptprogramm ∗/ /∗ ( I n i t i a l i s i e r u n g d es D i s p l a y ) ∗/ /∗ TRISC = 0 b00000000 ; +−−−−−−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−−− +−−−−−−−−−−−−−−− +−−−−−−−−−−−−−− // R i c h t u n g s r e g i s t e r B i t 7 Port RC7 : h i e r B i t 6 Port RC6 : h i e r B i t 5 Port RC5 : h i e r B i t 4 Port RC4 : h i e r B i t 3 Port RC3 : h i e r B i t 2 Port RC2 : h i e r B i t 1 Port RC1 : h i e r B i t 0 Port RC0 : h i e r Port C ( 0 : Ausgang , 1 : Eingang ) u n b en u tzt u n b en u tzt u n b en u tzt u n b en u tzt u n b en u tzt u n b en u tzt Ausgang ( Touchpanel ) Ausgang ( Touchpanel ) ∗/ /∗ // ADC k o n f i g u r i e r e n ADCON0 = 0 b10000001 ; ++−−−−−−−−−−−−−−−−−−− |||||| |||||| |||||| |||||| |||||| +++−−−−−−−−−−−−−−−− ||| ||| ||| ||| ||| ||| ||| ||| +−−−−−−−−−−−−−−− || || || +−−−−−−−−−−−−−− +−−−−−−−−−−−−− // ADC−C o n tr o l−R e g i s t e r 0 ( Bank 1 ) B i t 7−6 (ADCS1: ADCS0) : A/D C o n er s i o n Clock S e l e c t bits 00 : Fosc /2 ( b e i f o s z : 0 − 1 . 2 5 MHz) 01 : Fosc /8 ( b e i f o s z : 1 . 2 5 − 5 MHz) −> 10 : Fosc / 3 2 . . ( b e i f o s z : 5 − 20 MHz) 11 : Frc ( b e i RC−O s z i l l a t o r ) B i t 5−3 (CHS2 : CHS0 ) : Analog Channel S e l e c t b i t s −> 0 0 0 : c h a n n e l 0 (RA0/AN0) 0 0 1 : c h a n n e l 1 (RA1/AN1) 0 1 0 : c h a n n e l 2 (RA2/AN2) 0 1 1 : c h a n n e l 3 (RA3/AN3) 1 0 0 : c h a n n e l 4 (RA5/AN4) 1 0 1 : c h a n n e l 5 (RE0/AN5) 1 1 0 : c h a n n e l 6 (RE1/AN6) 1 1 1 : c h a n n e l 7 (RE2/AN7) B i t 2 (GO/DONE) : A/D C o n v er s i o n S t a t u s B i t IF ADON = 1 : −> 0 : A/D c o n v e r s i o n not i n p r o g r e s s 1 : A/D c o n v e r s i o n i n p r o g r e s s B i t 1 R es er v e B i t 0 (ADON) : A/D On B i t 0 : A/D c o n v e r t e r module i s shut−o f f −> 1 : A/D c o n v e r t e r module i s o p e r a t i n g ∗/ /∗ ADCON1 = 0 b00000010 ; +−−−−−−−−−−−−−−−−−−−− ||||||| ||||||| ||||||| ||||||| ||||||| ||||||| +++−−−−−−−−−−−−−−−−− ++++−−−−−−−−−−−−− // ADC−C o n tr o l−R e g i s t e r 1 ( Bank 1 ) B i t 7 (ADFM) : A/D R e s u l t Formated S e l e c t b i t s −> 0 : Left j u s t i f i e d : i n ADRESH: Bit 9 bis Bit 2 i n ADRESL: B i t 1 , B i t 0 , Rest 0 1 : Right j u s t i f i e d : i n ADRESH: 0 0 0 0 0 0 Bit 9 Bit 8 i n ADRESL: Bit 7 bis Bit 0 B i t 6−4 R es er v e B i t 3−0 (PCFG3 : PCFG0) : A/D Port C o n f i g u r a t i o n Control b i t s RE2 RE1 RE0 RA5 RA3 RA2 RA1 RA0 V r ef+ Vref− 0000: A A A A A A A A Vdd Vss 0001: A A A A V r ef+ A A A RA3 Vss −> 0 0 1 0 : D D D A A A A A Vdd Vss 0011: D D D A V r ef+ A A A RA3 Vss 0100: D D D D A D A A Vdd Vss 0101: D D D D V r ef+ D A A RA3 Vss 011 x : D D D D D D D D Vdd Vss 1000: A A A A V r ef+ Vref− A A RA3 RA2 1001: D D A A A A A A Vdd Vss 6 DEMONSTRATIONSBEISPIEL 2 (TOUCHSCREEN) 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 1010: 1011: 1100: 1101: 1110: 1111: D D D D D D D D D D D D A A D D D D A A A D D D V r ef+ V r ef+ V r ef+ V r ef+ D V r ef+ 32 A Vref− Vref− Vref− D Vref− A A A A D D A A A A A A RA3 RA3 RA3 RA3 Vdd RA3 Vss RA2 RA2 RA2 Vss RA2 ∗/ // Z a e h l r e g i s t e r f u e r Z e i t b a s i s i n i t i a l i s i e r e n Z a e h l e r Z e i t b a s i s 1 0 0 m s = KONSTZEITBASIS100MS ; // Z a e h l r e g i s t e r f u e r 100−ms−Z e i t b a s i s // i n i t i a l i s i e r e n /∗ // I n t e r r u p t f r e i g e b e n INTCON = 0 b10100000 ; // I n t e r r u p t −C o n tr o l −R e g i s t e r ( Bank 1 ) +−−−−−−−−−−−−−−−−−−−− B i t 7 ( GIE) : Gl o b a l I n t e r r u p t Enable b i t ||||||| 0 : Disables a l l i nter r upts ||||||| −> 1 : E n a b l es a l l unmasked i n t e r r u p t s +−−−−−−−−−−−−−−−−−−− B i t 6 ( PEIE ) : P e r i p h e r a l I n t e r r u p t Enable b i t |||||| −> 0 : Disables a l l peripheral i nter r upts |||||| 1 : E n a b l es a l l unmasked p e r i p h e r a l i n t e r r u p t s +−−−−−−−−−−−−−−−−−− B i t 5 ( T0IE ) : Timer 0 O v er f l o w I n t e r r u p t Enable B i t ||||| 0 : Disabled ||||| −> 1 : Enabled +−−−−−−−−−−−−−−−−− B i t 4 (INTE ) : RB0/INT E x t e r n a l I n t e r r u p t Enable B i t |||| −> 0 : Disabled |||| 1 : Enabled +−−−−−−−−−−−−−−−− B i t 3 (RPIE ) : RB Port Change I n t e r r u p t Enable B i t ||| −> 0 : Disabled ||| 1 : Enabled +−−−−−−−−−−−−−−− B i t 2 ( T0IF ) : Timer 0 O v er f l o w I n t e r r u p t F l a g b i t || −> 0 : TMR0 r e g i s t e r d i d not o v e r f l o w || 1 : TMR0 r e g i s t e r has o v e r f l o w e d +−−−−−−−−−−−−−− B i t 1 (INTF) : RB0/INT E x t e r n a l I n t e r r u p t F l a g b i t | −> 0 : RB0/INT e x t e r n a l i n t e r r u p t d i d not o c c u r | 1 : RB0/INT e x t e r n a l i n t e r r u p t o c c u r r e d +−−−−−−−−−−−−− B i t 0 (RBIF ) : RB Port Change I n t e r r u p t F l a g b i t −> 0 : None o f RB7 : RB4 p i n s have changed s t a t e 1 : One o f th e RB7 : RB4 p i n s changed s t a t e ∗/ } /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ TouchPanelTastenRou tine : ∗/ /∗ ∗/ /∗ A u f r u f : ∗/ /∗ ca . a l l e 100 ms ( vom Hauptprogramm ) ∗/ /∗ ∗/ /∗ Aufgabe : ∗/ /∗ E r m i ttel n , ob und w el ch e d er b e i d e n ” v i r t u e l l e n ” Tasten am Touch−Panel g e d r u e c k t ∗/ /∗ wurde , und den ” v i r t u e l l e n ” T a s ten zu s ta n d t o g g e l n und den S t a t u s am Gr a f i k − ∗/ /∗ Display anzeigen . ∗/ /∗ ∗/ /∗ Zuordnung d er ” v i r t u e l l e n ” Tasten am Touch−Panel : ∗/ /∗ 255 +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ ∗/ /∗ | | ∗/ /∗ 184 | +−−−−−−−−−−+ +−−−−−−−−−−+ | ∗/ /∗ | | | | | | ∗/ /∗ | | Taste 1 | | Taste 2 | | ∗/ /∗ | | | | | | ∗/ /∗ 72 | +−−−−−−−−−−+ +−−−−−−−−−−+ | ∗/ /∗ | | ∗/ /∗ 0 +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ ∗/ /∗ 0 20 116 140 236 255 ∗/ /∗ ∗/ /∗ V o r g eh en s w e i s e : ∗/ /∗ + x− und y−K o o r d i n a ten von Touchpanel l e s e n ∗/ /∗ + Pruefen , ob d i e x− und y−K o o r d i n a te im B e r e i c h von Taste 1 l i e g t , wenn j a , den ∗/ /∗ Zustand d er Taste 1 b e i einem Uebergang von ” n i c h t g e d r u e c k t ” zu ” g e d r u e c k t ” ∗/ /∗ i n v e r t i e r e n ( t o g g e l n ) und j e nach Aufgabe d er Taste d i e s e a u s f ü h r e n ( h i e r : den ∗/ /∗ S t a t u s d er Taste am Gr a f i k −D i s p l a y a l s Text a n z e i g e n ∗/ /∗ + Das s e l b e nun f u e r d i e z w e i t e Taste ∗/ 6 DEMONSTRATIONSBEISPIEL 2 (TOUCHSCREEN) 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 33 /∗ ∗/ /∗ U eb er g a b ep a r a m eter : ∗/ /∗ keiner ∗/ /∗ ∗/ /∗ Rueckgabeparameter : ∗/ /∗ keiner ∗/ /∗ ∗/ /∗ Anmerkungen : ∗/ /∗ + B ei dem h i e r v er w en d eten r e s i s t i v e n Touch−Panel kann immer nur e i n e Taste ge− ∗/ /∗ d r u e c k t werden . Mehrere Tasten g l e i c h z e i t i g ( a l s o e i n e T a s ten k o m b i n a ti o n ) i s t ∗/ /∗ b e i r e s i s t i v e n Touchpanels n i c h t m ö g l i ch ! ∗/ /∗ + das s t a t i s c h e R e g i s t e r b u t t o n s t a t u s d i e h n t h i e r a l s H i l f s r e g i s t e r , wobei d i e ∗/ /∗ B i t s 0 b i s 4 f o l g e n d e Bedeutung haben : ∗/ /∗ B i t 0 : Zustand von Taste 1 (0 = Taste n i c h t g ed r u eck t , 1 = Taste g e d r u e c k t ) ∗/ /∗ B i t 1 : H i l f s f l a g zu r Erkennung e i n e r ” n i c h t g ed r u eck t −g ed r u eck t −Flanke ” von ∗/ /∗ Taste 1 ∗/ /∗ B i t 2 : Zustand von Taste 2 (0 = Taste n i c h t g ed r u eck t , 1 = Taste g e d r u e c k t ) ∗/ /∗ B i t 3 : H i l f s f l a g zu r Erkennung e i n e r ” n i c h t g ed r u eck t −g ed r u eck t −Flanke ” von ∗/ /∗ Taste 2 ∗/ /∗ + Die z u l a e s s i g e n B e r e i c h e d er Tasten am Touch−Panel s i n d durch d i e Konstanten ∗/ /∗ KONSTTASTExXx und KONSTTASTExYx b e g r e n z t . ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ void TouchPanelTastenRoutine ( void ) { char x , y ; s t a t i c char b u t t o n s t a t u s = 0 ; // S c h r i t t 1 : x− und y−K o o r d i n a ten von Touchpanel l e s e n x = TP GetX ( ) ; y = TP GetY ( ) ; // S c h r i t t 2 : Taste 1 i f ( ( x >= KONSTTASTE1X1) && ( x <= KONSTTASTE1X2) && ( y >= KONSTTASTE1Y1) && ( y <= KONSTTASTE1Y2) ) { i f ( b u t t o n s t a t u s . F1 == 0 ) { b u t t o n s t a t u s . F1 = 1 ; i f ( b u t t o n s t a t u s . F0 == 0 ) { b u t t o n s t a t u s . F0 = 1 ; Gl cd Wr i te T ex t ( ”EIN ” , 2 6 , 4 , 0 ) ; } else { b u t t o n s t a t u s . F0 = 0 ; Gl cd Wr i te T ex t ( ”AUS” , 2 6 , 4 , 0 ) ; } } } else { b u t t o n s t a t u s . F1 = 0 ; } // S c h r i t t 3 : Taste 2 i f ( ( x >= KONSTTASTE2X1) && ( x <= KONSTTASTE2X2) && ( y >= KONSTTASTE2Y1) && ( y <= KONSTTASTE2Y2) ) { i f ( b u t t o n s t a t u s . F2 == 0 ) { b u t t o n s t a t u s . F2 = 1 ; i f ( b u t t o n s t a t u s . F3 == 0 ) { b u t t o n s t a t u s . F3 = 1 ; Gl cd Wr i te T ex t ( ”EIN ” , 8 6 , 4 , 0 ) ; } else 6 DEMONSTRATIONSBEISPIEL 2 (TOUCHSCREEN) 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 34 { b u t t o n s t a t u s . F3 = 0 ; Gl cd Wr i te T ex t ( ”AUS” , 8 6 , 4 , 0 ) ; } } } else { b u t t o n s t a t u s . F2 = 0 ; } } /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ Hauptprogramm ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ Aufgaben d es Hauptprogramms : ∗/ /∗ + C o n t r o l l e r i n i t i a l i s i e r e n ( Unterprogramm INIT ) ∗/ /∗ + Gr a f i k −D i s p l a y i n i t i a l i s i e r e n und l o e s c h e n ∗/ /∗ + 2 Tasten am D i s p l a y d a r s t e l l e n ∗/ /∗ + T a e t i g k e i t e n / Unterprogramme , d i e a l l e z y k l i s c h d u r c h g e f u e h r t werden muessen : ∗/ /∗ + a l l e 100 ms : Touchpanel a b f r a g en , ob e i n e ” v i r t u e l l e ” Taste g e d r u e c k t wurde ∗/ /∗ ( Unterprogramm TouchPanelTastenRoutine ) ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ void main ( void ) { // C o n t r o l l e r i n i t i a l i s i e r e n Init () ; // Gr a f i k −D i s p l a y i n i t i a l i s i e r e n G l c d I n i t (&PORTB, 5 , 4 , 3 , 2 , 0 , 1 , &PORTD) ; Gl cd Fi l l (0) ; // D i s p l a y l o e s c h e n G l c d S e t F o n t ( f o n t5 x 7 , 5 , 7 , 3 2 ) ; Gl cd Fi l l (0) ; // Button 1 Glcd Rectangle (8 ,16 ,60 ,48 ,1) ; Glcd Box ( 1 0 , 1 8 , 5 8 , 4 6 , 1 ) ; Gl cd Wr i te T ex t ( ”TASTE 1” , 1 4 , 3 , 0 ) ; Gl cd Wr i te T ex t ( ”AUS” , 2 6 , 4 , 0 ) ; // Button 2 Glcd Rectangle (68 ,16 ,120 ,48 ,1) ; Glcd Box ( 7 0 , 1 8 , 1 1 8 , 4 6 , 1 ) ; Gl cd Wr i te T ex t ( ”TASTE 2” , 7 4 , 3 , 0 ) ; Gl cd Wr i te T ex t ( ”AUS” , 8 6 , 4 , 0 ) ; // E n d l o s s c h l e i f e while ( 1 ) { i f ( FlagZeitbasis100ms) { // Touchpanel a b f r a g en , ob e i n e ” v i r t u e l l e ” Taste g e d r u e c k t wurde TouchPanelTastenRou tine ( ) ; // B o t s c h a f t s f l a g ( f u e r 100 ms−Z e i t b a s i s ) z u r u e c k s e t z e n FlagZeitbasis100ms = 0; } } } Datei TOUCHPANEL.H: 1 2 3 4 5 6 7 8 /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ Header f u e r d i e Unterprogramme zum Lesen d er x− und y−K o o r d i n a te von einem ∗/ /∗ r e s i s t i v e n Touchpanel ∗/ /∗ ∗/ /∗ Compiler : mikroC ∗/ /∗ ∗/ /∗ E n t w i c k l e r : S t e f a n Buchgeher ∗/ /∗ E n t w i c k l u n g s b e g i n n d er S o f t w a r e : 2 4 . J u l i 2009 ∗/ 6 DEMONSTRATIONSBEISPIEL 2 (TOUCHSCREEN) 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 35 /∗ F u n k t i o n s f a e h i g s e i t : 2 4 . J u l i 2009 ∗/ /∗ L e t z t e B e a r b e i t u n g : 1 6 . August 2009 ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ G l o b a l e R e g i s t e r ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ /∗ k e i n e g l o b a l e n R e g i s t e r ∗/ /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ P o r t b e l e g u n g ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ #define TP PORT DRIVEA PORTC. F0 #define TP PORT DRIVEB PORTC. F1 /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ Analoge Kanaele ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ #define TP CHAN READX 0 #define TP CHAN READY 1 /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ F u n k t i o n s p r o t o t y p e n ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗/ char TP GetX ( void ) ; char TP GetY ( void ) ; Datei TOUCHPANEL.C: ⇒ Siehe Demo 1 Datei myPIC ADC.H: ⇒ Siehe Demo 1 Datei myPIC ADC.C: ⇒ Siehe Demo 1 6.5 Anmerkungen zur Software Auch bei diesem Demonstrationsbeispiel besteht die Software aus mehreren Programmteilen, die denen vom ersten Demonstrationsbeispiel sehr ähnlich sind: • kurzes Hauptprogramm am Ende des Quellcodes von TouchScreen Demo.c, Zeilen 403 bis 438 • kurze Interrupt-Service-Routine (kurz: ISR), in der Datei TouchScreen Demo.c, Zeilen 93 bis 103 • 1 Unterprogramm zur Initialisierung des PIC16F877 (Unterprogramm Init in der Datei TouchScreen Demo.c, Zeilen 133 bis 278). • 1 Unterprogramm zur Abfrage der virtuellen Tasten am Touchpanel (Unterprogramm TouchPanelTastenRoutine in der Datei TouchScreen Demo.c, Zeilen 333 bis 390). • 2 Unterprogramme zur Bestimmung der Koordinaten am Touchpanel (Unterprogramme TP GetX und TP GetY in der Datei TOUCHPANEL.C, Zeilen 47 bis 64 bzw. Zeilen 85 bis 102). 6 DEMONSTRATIONSBEISPIEL 2 (TOUCHSCREEN) 36 • 1 Hilfs-Unterprogramm zur Analog-Digital-Wandlung mit dem PIC-internen ADCHardware-Modul (Unterprogramm ADC8 in der Datei myPIC ADC.C, Zeilen 47 bis 59). Interrupt-Service-Routine (kurz: ISR): Für die ISR (in der Datei TouchScreen Demo.c, Zeilen 93 bis 103) gilt im Wesentlichen das gleiche wie beim ersten Demonstrationsbeispiel. Auch hier hat die ISR die Aufgabe eine 100-ms-Zeitbasis zu erzeugen. Im Gegensatz zum ersten Demonstrationsbeispiel wird hier als Taktquelle für den Mikrocontroller ein externer 20 MHz-Quarz verwendet, dadurch ergeben sich Änderungen in den Zeiten. Mit einem Vorteiler (VT) von 1:128 ergibt sich, dass die ISR hier ca. alle 6.5ms aufgerufen wird. ISRAUF RUF [µs] = 4 · 256 · V T 4 · 256 · 128 = = 6553.6µs = 6.5ms fT akt [MHz] 20 Wird diese ISR 15 mal aufgerufen so vergeht eine Zeit von 15 x 6.5ms = ca 97ms). Die Konstante KONSTZEITBASIS100MS beinhaltet daher den Wert 15. Hauptprogramm: Das Hauptprogramm (main, Datei: TouchScreen Demo.c, Zeilen 403 bis 438) ist hier etwas länger. Zuerst muss der Mikrocontroller initialisiert werden (mit dem Unterprogramm Init, Zeile 406). Neu ist die Initialisierung des Grafik-Displays mit den Unterprogrammen Glcd Init, Glcd Fill und Glcd Set Font (Zeilen 409 bis 412). Anmerkung: Diese Unterprogramme werden vom mikroC-Compiler automatisch zur Verfügung gestellt, und müssen daher nicht ausprogrammiert werden. Als nächstes müssen noch zwei Tasten mit passenden Texten am Grafik-Display dargestellt werden. Die Zeilen 415 bis 424 übernehmen diese Aufgaben. Nun befindet sich das Hauptprogramm in einer Endlosschleife. Diese Schleife besitzt nur die Aufgabe ständig das Botschaftsflag FlagZeitbasis100ms zu prüfen. Ist dieses Botschaftsflag gesetzt, so muss vom Hauptprogramm eine bestimmte Aufgabe ausgeführt werden. Diese Aufgaben sind in Form von Unterprogrammen vorhanden. Hier hat es die Aufgabe das Unterprogramm zur Abfrage des Touchpanels aufzurufen (Zeile 432). Wichtig ist, dass das Botschaftsflag wieder gelöscht werden muss (Zeile 435). Unterprogramm Init: Das Unterprogramm Init (Datei: TouchScreen Demo.c, Zeilen 133 bis 278) dient auch hier zur Initialisierung des Mikrocontrollers. Es gilt im Wesentlichen das Gleiche wie beim ersten Demonstrationsbeispiel. Nur mit dem Unterschied, dass eben hier ein anderer Mikrocontroller verwendet wird. Unterprogramm TouchPanelTastenRoutine: Das Unterprogramm TouchPanelTastenRoutine (Datei: TouchScreen Demo.c, Zeilen 333 bis 390) ist auch hier das wesentliche Unterprogramm für dieses Demonstrationsbeispiel. Auch hier gilt im Wesentlichen das gleiche wie beim ersten Demonstrationsbeispiel. Der 6 DEMONSTRATIONSBEISPIEL 2 (TOUCHSCREEN) 37 einzige Unterschied ist, dass hier nicht die Zustände der Leuchtdioden verändert werden, sondern die Texte am Grafik-Display, und dass hier nur zwei Tasten zu bearbeiten sind. Wichtig: Auch dieses Unterprogramm muss im Hauptprogramm regelmäßig (zyklisch) aufgerufen werden (Siehe Hauptprogramm, Datei: TouchScreen Demo.c, Zeile 432). Unterprogramme TP GetX und TP GetY: Diese beiden Unterprogramme wurden bereits im Abschnitt 4 (ab Seite 3) sehr ausführlich behandelt, so dass sie hier nicht mehr näher erläutert werden müssen. Wichtig: In der Datei TOUCHPANEL.H müssen die Portpins und die analogen Kanäle gemäß der Demonstrationsschaltung nach Abbildung 13 (Seite 13) definiert werden, Zeilen 19, 20, 24 und 25. Unterprogramm ADC8: Das Unterprogramm ADC8 (Datei: myPIC ADC.C, Zeilen 47 bis 59) dient zur Analog-DigitalWandlung mit dem PIC-internen-Hardwaremodul und entspricht der Vorgabe im Datenblatt zum PIC16F877 [6]. Sonstiges: Am Beginn des Quellcodes (in der Datei TouchScreen Demo.c) befinden sich die folgenden Definitionen und Einstellungen: • Einbinden externer Codeteile (Zeile 26) • Definition der globalen Register für die ISR (Zeilen 42 und 43) • Konstanten für die Erzeugung der 100-ms-Zeitbasis (Zeile 57) und für die Erkennung der beiden virtuellen“ Tasten (Zeilen 61 bis 69) ” • Die Funktionsprototypen für die hier verwendeten Unterprogramme (Zeilen 77 und 78) • Ab Zeile 93 beginnt der Quellcode der ausreichend mit Kommentaren versehen ist Hier, zum Abschluss, die notwendigen Einstellungen für den PIC16F877 für dieses Demonstrationsbeispiel: ! ! ! ! CP OFF DEBUG OFF WRT OFF CPD OFF LITERATUR ! ! ! ! ! 38 LVP OFF BODEN OFF PWRTE ON WDT OFF HS OSC Literatur [1] Elektor electronics worldwide. Ausgabe Februar 2009. http://www.elektor.de. [2] mikroElekronika. Werbeartikel über Touchscreens. article/, Juli 2009. http://www.mikroe.com/en/ [3] TIGAL. Smart Solutions for Electronics. http://www.tigal.com/, Juli 2009. [4] mikroElekronika. mikroc user’s manual. http://www.mikroe.com/, 2009. [5] Microchip. Datenblatt des PIC16F87/88. http://ww1.microchip.com/downloads/en/ DeviceDoc/30487c.pdf, 2005. [6] Microchip. Datenblatt des PIC16F877. http://ww1.microchip.com/downloads/en/ Device/Doc/30292c.pdf, 2001.