Micro 150 - 205

Description

Flashcards on Micro 150 - 205, created by karl_herber on 20/06/2016.
karl_herber
Flashcards by karl_herber, updated more than 1 year ago
karl_herber
Created by karl_herber over 8 years ago
32
1

Resource summary

Question Answer
150. Sie verwenden den 12-Bit ADC auf dem C8051F020/21 und erhalten bei einer Messung den Wert 0400hex. – Welche Spannung in Bezug auf die Referenzspannung VREF haben Sie gemessen? maximal=4095;gemessen 〖0400〗_hex=4⋅〖16〗^2=〖1024〗_dec→U_gem=1024/4095⋅V_REF=0,25⋅V_REF
151. Sie verwenden den 12-Bit ADC auf dem C8051F020/21 und erhalten bei einer Messung den Wert 4095. – Welche Spannung in Bezug auf die Referenzspannung VREF haben Sie gemessen? U_REF⋅4095/2^(12-1) =4095/4095=U_REF
152. Sie verwenden den 12-Bit ADC auf dem C8051F020/21 und schließen den ADC-Eingang gegen Masse kurz. Welchen Wert erwarten Sie beim Auslesen des ADCs? Es wird null ausgegeben.
153. Bei dem 12-Bit ADC des C8051F020/21 errechnet sich der ausgelesen ADC-Wert nach der folgenden Beziehung: ADCCODE=V_in⋅Gain/V_REF ⋅2^16 (a) Wofür steht Gain in obiger Formel? Welchen Schaltungsteil kann ich mit Gain beeinflussen? (b) Warum wird der Wert 216 in obiger Formel angegeben, obwohl es sich doch um einen 12-Bit ADC handelt? Gain steht für den Verstärkungsfaktor des Verstärkers zwischen multiplexer und ADC. Es wird 2^16verwendet, da der Code in 2 byte gespeichert wird, die hier zur linken Seite ausgerichtet sind.
154. Auf dem C8051F020/21 befindet sich ein interner Temperatur-Sensor, der mit dem 12-Bit ADC abgefragt werden kann. Zur Umrechnung der Temperatur in eine äquivalente Spannung wird im Datenblatt der nachfolgende Ausdruck angegeben: V_temp=(2,86 mV/(°C))⋅Temp[°C]+776 mV Müssen Sie eine Linearisierung vornehmen, um eine möglichst genaue Temperatur zu erhalten? Begründen Sie Ihre Antwort! Nein, es ist keine Linearisierung erforderlich, die Gleichung entspricht bereits einem linearen Zusammenhang
155. Beschreiben Sie Funktion des analogen Multiplexers vor dem ADC auf dem C8051F020/21. – Wozu und für welche Anwendungen wird er benötigt? der analoge Multiplexer wird benötigt um mehrere Eingänge mit nur einem ADC verarbeiten zu können. Somit ist es z.B. möglich mehrere Temperatursensoren nacheinander mit einem ADC zu bearbeiten.
156. Sie möchten mit dem 12-Bit ADC des C8051F020/21 zwei analoge Spannungen erfassen. Die erste Spannung liegt in einem Bereich von 0 – 1 Volt, die zweite Spannung im Bereich 0 – 5 Volt. – Was können Sie unternehmen, um beide Spannungen mit bestmöglicher Auflösung zu messen? lsg1: zwei ADC benutzen. 1 Ureff= 1V und 2. Ureff =5V. lsg2: ein ADC benutzen. Ureff = 5 V und 0-1 V Signal durch gain verstärken
157. Mikrocontroller enthalten ein oder mehrere Zeitgeber/Zähler (Timer/Counter). Nennen Sie drei typische Anwendungen, bei denen Timer/Counter verwendet werden. 1. durch Timer ISR sicherstellen einer definierten Frequenz für einen Melodiengenerator 2. Programmierung einer Eieruhr; 3. periodisches Abfragen einer Matrixtastatur durch Timer ISR
158. Verzögerungen in Mikrocontroller-Programmen lassen sich auch durch sogenannte delay-loops realisieren. Warum ist aber in vielen Fällen besser, die Timer eines Mikrocontrollers für Verzögerungen zu verwenden? Während der uC die delay-loop bearbeitet kann er keine weiteren Aktionen ausführen. Es ist somit z.B. nicht möglich auf Tastendrücke zu reagieren. Ein Timer vermeidet dieses Problem.
159. Erklären Sie mit wenigen Worten, wie ein Timer innerhalb eines Programms verwendet werden kann. Es ist entweder möglich das Timerflag abzufragen, welches bei Timerüberlauf gesetzt wird. Dieses muss dann im Programm wieder rückgesetzt werden. Oder man löst bei Überlauf einen interrupt aus, in dem dann die weiteren Befehle platziert werden.
160. Erklären Sie den Unterschied zwischen den beiden Betriebsarten Zeitgeber (Timer) und Zähler (Counter). bei einem Counter wird ein Port verwendet, um den Zählwert bei einem Ereignis zu erhöhen. Die Erhöhung eines Timers ist nur vom Systemtakt abhängig.
161. Gegeben ist das nachfolgenden Prinzipschaltbild einer Zeitgeber-/Zähler-Einheit. Sie haben die Aufgabe bekommen, Pulsdauern von einem externen unbekannten Digitalsignal präzise auszumessen. Wie würden Sie diese Aufgabe lösen und wie müssten dazu die beiden Umschalter im Schaltbild gesetzt werden? Der Zähler wird bei Anliegen der High-Phase erhöht. Aus dem Oszillatorstakt und dem Zählerstand lässt sich dann die Pulsdauer berechnen: T=Zählerstand/Oszillatortakt
162. Timer/Counter können für verschiedene Aufgaben konfiguriert werden. Beschreiben Sie den Modus auto-reload und erörtern Sie, wozu dieser Mode eingesetzt werden kann. Bei dem auto-reload Modus wird der Timer wieder auf seinen Startwert gesetzt. Dieser Modus eignet sich z.B. für periodische Intervalle einer bestimmten Zeitbasis
163. Ihr Mikrocontroller besitzt einen 16-Bit Zeitgeber/Zähler mit auto-reload Funktion, der mit 10 kHz getaktet wird. Auf welchen Wert müssen Sie das Reload-Register setzen, damit Ihr Timer alle 5 Sekunden das Overflow-Flag setzt? 16 Bit=2^16=65536 Überlaufwert; 10⋅〖10〗^3 Hz=Zähler wird um 10000 pro Sekunde erhöht ;65536-5⋅10000=15536
164. Viele Timer/Counter unterstützen auch einen Capture-Mode. Erklären Sie, wie dieser Mode funktioniert. Für welche Anwendung kann der Capture-Mode sinnvoll eingesetzt werden? Bei einer fallenden Flanke am Timereingang T2EX wird der aktuelle Zählerstand abgespeichert. Dies kann (durch Differenzenbildung) zum ausmessen externer Ereignisse verwendet werden.
165. In vielen Anwendungen werden Timer verwendet, um PWM-Signale zu generieren. Was sind PWM-Signale? Nennen Sie eine type Anwendung! Pulsweitenmoduliertes Signal. Ansteuern eines DC-Motors
166. Sie möchten die Drehzahl von einem DC-Motor mittels PWM-Ansteuerung regeln. Damit der DC-Motor „sauber“ dreht, muss Ihr PWM-Signal eine Frequenz von ca. 1 kHz haben. Ihnen steht ein 8-Bit Timer mit PWM-Funktion zur Verfügung. (a) Mit welcher Taktfrequenz lassen Sie Ihren Timer laufen? (b) Der DC-Motor soll mit ca. 80% seiner maximalen Drehzahl arbeiten. Welchen Wert tragen Sie dazu in dem Compare-Register ein? (Annahme: Drehzahl und Tastverhältnis verhalten sich linear!) (a) 1 kHz (b) 0,2⋅2^8=51,2≈51
167. Abgebildet ist das Diagramm einer PWM-Erzeugung. Ersetzen Sie die blauen Fragezeichen durch sinnvolle Bezeichnungen!
168. Mit der Hilfe von Zeitgebern/Zählern ist es möglich Programmunterbrechungen (Interrupts) auszulösen. Wie und in welcher Situation kann ein Timer einen Interrupt erzeugen? bei Überlauf. Dazu ist die timerinterrupt Freigabe im entsprechenden register ETn freizugeben
169. Erklären Sie den Begriff „Interrupt“ bei Mikroprozessoren / Mikrocontrollern! Bei einem Interruptereignis beendet der μC sofort nach dem laufenden Assemberbefehl die Programmabarbeitung und springt in die ISR. Nachdem diese abgearbeitet ist, springt er wieder an die Stelle wo er die normale Programmbearbeitung beendet hat und setzt sie fort.
170. Für welche Aufgaben kann ein Interrupt bei der Programmierung von Mikrocontrollern genutzt werden? Geben Sie ein Anwendungsbeispiel! Er kann z.B. dazu genutzt werden um periodische Ereignisse auszulösen. Durch die Verwendung eines Interrupts ist sichergestellt, dass alle Intervalle nahezu die gleiche Länge haben. Bsp. periodisches Abfragen einer Matrixtastatur
171. Erklären Sie den Begriff „Polling“ im Rahmen der Mikrocontroller-Programmierung und diskutieren Sie die Nachteile dieser Methode in Programmen. periodische Abfragen von eingängen. Wenig effizient
172. Erklären Sie, was eine „Interrupt-Service-Routine“ (ISR) ist. Diskutieren Sie den Unterschied zwischen einem Funktionsaufruf und einer ISR. Eine ISR wird nur bei einem Interruptereignis abgearbeitet. Dabei hat sie Vorrang vor dem normalen Programm. Eine Funktion hingegen wird während des normalen Programmablaufs aufgerufen und hat keine besondere Priorisierung.
173. Zu den „besonderen Betriebsarten“ von Mikroprozessoren und vielen Mikrocontrollern zählen Interrupts und Exceptions (auch oft als Traps bezeichnet). Erklären Sie den Unterschied zwischen Interrupt und Trap und führen Sie für beide Begriffe ein Beispiel auf! Ein Interrupt arbeitet asynchron zum laufenden Programm. Sein Aufruf ist von Diesem unabhängig. Bsp.: Ein periodisches Abfragen einer Matrixtastatur. Ein „trap“ wird vom Programm bei bestimmten Ereignissen ausgelöst und arbeitet somit synchron. Er lässt sich beispielsweise durch die Division durch die 0 auszulösen und ermöglicht so eine Fehlerbehandlung.
174. Sie verwenden in Ihrem Programm einen der beiden ADCs des C8051F02x. Weil ein ADC nicht beliebig schnell in der Umsetzung ist, müssen Sie auf das Ergebnis warten. Welche Möglichkeiten gibt es dazu? Skizzieren Sie Ihre Lösung durch ein geeignetes Flussdiagramm! Es lässt sich z.B. das Busy-Flag abfragen. Ist dieses wieder 0 ist die Berechnung beendet. (siehe Bild rechts) *Je nach Programm ließen sich während der Wartezeit noch unabhängige Aktionen umsetzen
175. Erklären Sie den Begriff „Seiteneffekt“ im Rahmen der Interrupt-Programmierung. Würden durch die ISR Register verändert, könnte die dazu führen, dass das normale Programm nicht mehr ordnungsgemäß arbeiten kann. Dies wird als Seiteneffekt bezeichnet. Um dies zu vermeiden muss die ISR vor Beginn der Bearbeitung Register usw. sichern und nach der Bearbeitung wiederherstellen.
176. Im Rahmen der Interrupt-Programmierung wird auch gerne der Begriff „Nebenläufigkeit“ verwendet. Was ist damit gemeint? Laufen Programme, die Interrupts verwenden „parallel“? Erörtern Sie ausführlich! ein ISR läuft aus Sicht des Programmierers unabhängig vom Hauptprogramm. Es scheint so als laufe sie parallel zu Diesem. Dies ist aber nicht korrekt, da das Hauptprogramm bei einem Interrupt pausiert wird.
177. Zählen sie vier typische Interrupt-Quellen bei Mikrocontrollern auf und erklären Sie, wann und wodurch der Interrupt aufgerufen wird. -Taster und Schalter: durch Änderrung des digitalen Eingangssignals -serielle sSchnittstellen: druch anstehende Daten -Zähler und Zeitgeber: Überlauf des capture/compare -registers -ADC: Ende einer Wandlung (fallende Flanke des busy-flags)
178. Sie haben an ein I/O-Port-Pin Ihres Mikrocontrollers einen Taster angeschlossen. Der Taster schaltet gegen Masse und der Port-Pin wird mit einem Pull-Up-Widerstand gegen VCC gezogen. Der Port-Pin wird als pegel-sensitiver Interrupt konfiguriert, so dass bei Tasterbetätigung Interrupts erzeugen kann. Innerhalb Ihrer Taster-ISR inkrementieren Sie einen Counter. – Beim Testen von Ihrem Programm stellen Sie fest, dass der Counter sich um mehr als einen Wert beim Betätigen des Tasters erhöht. (a) Wie kommt das? (b) Was können Sie ändern, um dieses Fehlverhalten zu beseitigen? (a) Der Taster „pullt“ und erzeugt somit mehrere Impulse bei einer Tastenbetätigung. Somit wird die ISR mehrfach aufgerufen und der Counter erhöht. (b) Es wäre möglich den Interrupt bei einer fallenden Flanke auszulösen, da es unter Umständen etwas Zeit benötigt, bis nach dem ersten Pullimpuls der Ausgleichsvorgang soweit fortgeschritten ist, bis das Signal unter dem Pegel für die Erfassung einer negativen Flanke fällt.
179. Bezug vorherige Aufgabe: Sie ändern die Interrupt-Auslösung auf „negative Flanke“ ab und hoffen damit, Ihr Programm korrigiert zu haben. – Leider erhöht sich der Counter immer noch um mehr als einen Wert beim Betätigen des Tasters! Was können Sie noch unternehmen? Skizzieren Sie eine Lösung, die ohne Delays in der ISR auskommt! Es wäre möglich in der ISR ein Bit auf 0 abzufragen und den Zähler nur zu erhöhen, wenn das Bit 0 ist und dieses dann zu setzen. Das Bit müsste dann im Hauptprogramm wieder zurückgesetzt werden z.B. mittels eines Timers oder eines Zählers.
180. Aus Programmsicht können Programmunterbrechungen synchron oder asynchron auftreten. Erörtern Sie, welche Art von Programmunterbrechung synchron bzw. asynchron auftreten! Eine Programmunterbrechung mittels „Traps“ tritt synchron auf, da diese vom Hauptprogramm aufgerufen werden. Ein „Interrupt“ arbeitet asynchron. Sein Aufruf ist vom Hauptprogramm unabhängig.
181. Beschreiben Sie, z.B. in Form von einem Flussdiagramm, wie genau die Abarbeitung eines Interrupts funktioniert. -Sichern des Programm-counters im Stack -Sichern der Registerinhalte im Stack -Ausführen der ISR -Wiederherstellen der Registerinhalte vom Stack -Wiederherstellen der Programm-counters vom Stack -Sprung zur vorherigen Adresse im Hauptprogramm
182. Beim Auftreten eines Interrupts wird der Programcounter (PC) auf dem Stack abgelegt. Macht dies der Mikrocontroller oder sind Sie als Programmierer dafür verantwortlich? Begründen Sie Ihre Antwort! Nein, das Sichern des PCs wird von der Steuereinheit des MCs gesteuert. Dies geht aus der Vorlesung hervor.
183. Im Assember-Befehlssatz der 8051-Familie gibt es die beiden Befehle RET und RETI. Erklären Sie die Unterschiede der beiden Befehle und erklären Sie, in welcher Programmsituation welcher der beiden Befehle verwendet wird. RET dient dazu eine Subroutine zu beenden, entsprechend wird er auch verwendet. RETI dient dazu eine ISR zu verlassen. Er löst das Wiederherstellen der Register sowie des PCs aus.
184. Der Mikrocontroller C80151F020/21 unterstützt insgesamt 22 Interrupt-Quellen, die man in 6 Gruppen aufteilen kann. Nennen Sie einige der Gruppen und der interrupt-auslösenden Peripherie-Einheiten. 1. externe interrupts: Taster 2. timer interrupts: Timerüberlauf 3. programmable counter array: 4. serielle Schnittstelle: UART 5. ADC: fallende flanke des busyflags 6. Interrupts für SPI, SMBUS, externe Oszillatorüberprüfung
185. Warum können die seriellen Schnittstellen des C8051F020/21 Interrupts auslösen? Wozu kann das sinnvoll sein? Dies ist dann sinnvoll, wenn wichtige Daten anstehen, die sofort bearbeitet werden müssen.
186. Wurde beim C8051F2020/21 ein Interrupt ausgelöst, so wird das zugeordnete Interrupt-Pending-Flag gesetzt. Wozu dient dieses Pending-Flag? es dient dazu, z.B. bei einem Interrupt höherer Priorität zu erfassen, dass ein anderer Interrupt wartet.
187. Eine Interrupt-Service-Routine (ISR) sollte zu Beginn das Program-Status-Word (PSW) auf dem Stack sichern und später wieder restaurieren. (a) Warum ist das für einen sicheren Programmablauf wichtig? (b) Ist es auch denkbar eine ISR zu programmieren, die das PSW nicht sichert, aber trotzdem fehlerfrei funktioniert? (c) Welche Bedingung muss bei der Programmierung von so einer ISR dann eingehalten werden? (a) das PSW dient unter anderem dazu, dass aktuell verwendete Register abzuspeichern. Wird durch den Interrupt auf ein anderes umgeschaltet, führt dies zu Seiteneffekten. (b) Ja, das ist möglich (c) Die ISR darf keine Register verändern, die für das Hauptprogramm relevant sind.
188. Der C8051F2020/21 unterstützt priorisierte Interrupts. Erklären Sie, wozu es sinnvoll sein kann, einem Interrupt eine höhere Priorität gegenüber anderen Interrupts einzuräumen. Wenn ein Interrupt zur Bearbeitung auf Daten eines Anderen zurückgreift. Wenn sich diese ändern, sollte dies zwecks Geschwindigkeit Vorrang haben, damit die ISR mit der niedrigeren Priorität immer mit den aktuellsten Daten arbeitet.
189. Sie haben in Ihrem Programm für den C8051F020/21 zwei Interrupts die gleiche Priorität gegeben. – Welcher Interrupt wird zuerst ausgeführt, falls beide Interrupts gleichzeitig ausgelöst werden? der mit der kleineren internen „priority-order“.
190. Kann eine Interrupt-Service-Routine (ISR), die gerade ausgeführt wird, von einem weiteren Interrupt unterbrochen werden? Erklären Sie den Ablauf der ISRs in diesem Fall! Ja kann er, wenn ein Interrupt mit einer höheren Priorität ausgelöst wird. In diesem Fall wird die ISR mit niedrigerer Priorität verlassen und die mit der Höheren bearbeitet. Ist dies abgeschlossen, wird die andere ISR weiterbearbeitet und ist diese ebenfalls abgeschlossen, wird das Hauptprogramm weiterbearbeitet.
191. Was ist unter dem Begriff „Polling-Sequenz“ im Rahmen der 8051-Mikrocontroller-Familie zu verstehen? die „Polling-Sequenz“ beschreibt die interne ISR Priorisierung. Sie ist z.B. dann entscheidend wenn 2 interrupts mit gleicher programmierter Priorität ausgelöst werden.
192. (a) Erklären Sie wie der Begriff „Interrupt-Latency“ definiert ist. (b) Beschreiben Sie welche Überlegungen man aufstellen muss, um die minimale und maximale Interrupt-Latency zu bestimmen. (a) die Interrupt-latency ist die Zeit, die zwischen dem Interrupt Ereignis und der Bearbeitung der ersten Codezeile der ISR vergeht (b) Zur Bestimmung der minimalen Interrupt-latenz wird vom besten denkbaren Fall ausgegangen: Keine Sicherung der Register und der PSW usw. Zur Bestimmung der maximalen Interrupt-latenz muss vom schlechtesten denkbaren Fall ausgegangen werden. Umfangreiche Sicherung der Register usw.
193. Für das Programmverhalten ist die Interrupt-Latency im Mikrocontroller-Umfeld eine wichtige Größe. Ist hierbei die minimale oder maximale Interrupt-Latency die kritischere Größe? Begründen Sie Ihre Antwort! die maximale Interrupt latency ist die kritischere Größe, denn sie beschreibt die maximale Reaktionszeit auf ein Interrupt Ereignis.
194. Beim Eintreffen eines Interrupts springt der 8051 zu einer dem Interrupt zugeordneten Speicherstelle. Diese Speicherstelle wird mit einem Fachbegriff bezeichnet. Nennen sie den gesuchten Begriff und erklären Sie, welcher Assembler-Befehl an der besagten Speicherstelle (Adresse) stehen wird. die Speicherstelle wird als „interrupt vector“ bezeichnet. Hier wird ein LCALL Befehl zum Sprung zur ISR Adresse stehen.
195: Interrupts können durch spezielle Syntax-Erweiterungen auch in der Programmiersprache C implementiert werden. Beschreiben Sie wie eine InterruptRoutine in C programmiert wird! zunächst muss der entsprechende interrupt im register freigegeben werden, dann wird die ISR ähnlich einer Funktion mit folgenden Syntax aufgerufen: void funktionsname interrupt n [using m] wobei n die interruptnummer beschreibt sowie m das zu verwendende register darstellt
196: Die Mikrocontroller der 8051-Familie unterstützen insgesamt 4 Register-Bänke mit jeweils 8 Registern. Beschreiben Sie wie die vier Register-Bänke im Rahmen der Interrupt-Programmierung sinnvoll genutzt werden können! Eine Nutzung ist unter geschwindigkeitsgesichtspunkten sinnvoll, da ein umschalten der register beim Eintritt in die ISR eine Sicherung unnötig macht.
197: Wie können Sie aus der Programmiersprache C heraus, eine der vier Registerbänke für Ihre Interrupt-Funktion auswählen? Geben Sie ein Beispiel! Sie kann am Beginn der ISR gewählt werden. Z.B.: void timer2ISR interrupt 5 using 3
198: Geben Sie die Formel an, um aus der Interrupt-Nummer n den entsprechenden Interrupts-Vektor für einen Mikrocontroller der 8051-Familie zu berechnen! Interruptvektor = 8⋅n+3
199: Erklären Sie, was mit „atomaren Befehlen“ gemeint ist! ein atomarer Befehl kann in seiner Ausführung auch von einem interrupt nicht unterbrochen werden.
200: Muss der C-Programmierer beim Implementieren von Interrupt-Service-Routinen darauf achten, dass verwendete Register zunächst gesichert werden? Ja, denn sonst könnte es zu Seiteneffekten kommen
201: Gegeben ist die folgende Interrupt-Funktion in C: void ISRtime2 ( void ) interrupt 5 using 2 // { static unsigned short cnt = 0; // if ( --cnt & 2 ) P5 = 0x55; // else P5 = 0xAA; // TF2 = 0; // } Kommentieren sie nach dem //! void ISRtime2 ( void ) interrupt 5 using 2 // aufruf der timer2 ISR mit register 2 und interruptnr 5 { static unsigned short cnt = 0; // deklaration und initialisierung der variablen cnt if ( --cnt & 2 ) P5 = 0x55; // else P5 = 0xAA; // TF2 = 0; // löschen des tiferflags2 }
202: Können Sie an Interrupt-Funktionen in C Parameter übergeben? Begründen Sie Ihre Antwort! Nein, dies ist nicht möglich, da eine ISR asynchron arbeitet. Es wäre also nicht vorhersehbar welche Werte übergeben werden.
203: Was ist zu beachten, wenn Sie aus Ihrer Interrupt-Funktion auf globale Variablen zugreifen? Gibt es bei dieser Betrachtung einen Unterschied, ob Sie auf 8-Bit oder 16-/32-Bit Variablen zugreifen? Es ist zu beachten, dass kritische Verwendungen einer Variable nur von einer Programmverzweigung vorgenommen werden dürfen.
204: Erklären Sie mit einem Beispiel den Begriff „critical section“! ???
205: Der 8051 bieten den Assembler-Befehl JBC (jump and clear if bit is set). Was ist das Besondere an diesem Befehl und für welche Programmsituationen kann er verwendet werden? Das Besondere ist, dass der Sprung immer stattfindet und das Bit immer gelöscht wird.
Show full summary Hide full summary

Similar

Mapa Mental - Como Criar um Mapa Mental
miminoma
HSC Economics
lydia le
Study Plan
mlanders
Biology AQA 3.1.3 Cells
evie.daines
Chemistry
Holly Bamford
IGCSE Physics formulas
Imani :D
Science Additional B3 - Animal and Plant Cells Flashcards
Stirling v
GCSE Biology B2 (OCR)
Usman Rauf
Derecho Aéreo
Adriana Forero
Basic Korean Verbs
ASHISH AWALGAONKAR
7 Elements of Good Design
Micheal Heffernan