AVR-Mikrocontroller in BASCOM programmieren, Teil 2



Ähnliche Dokumente
Bisher hatten immer nur als Ausgänge geschaltet und hierfür folgende Befehle benutzt:

'

4-Kanal-Analoglogger für die Regelungstechnik

AVR-Mikrocontroller in BASCOM programmieren, Teil 3

Für schnelle und bequeme Entwicklungen wird gern Basic eingesetzt.

Nachtaktiver Blinker. Ralf Pongratz. 11. November 2012

Die Software zum Unser kleiner Computer

2.1 Atmega-Peripherie/Interrupts

Assembler-Unterprogramme

AVR-Mikrocontroller in BASCOM programmieren

PROFE 2. Lycée Technique des Arts et Métiers Projet de fin d' études 2014/2015. FELTES Jean Claude Messstation im Musée Nationale des Mines

2

RalfPongratz. Grundversion. Reaktivlichtmit7SegmentAnzeige

1.7 Atmega-Programmierung in ASM/Verschachtelte Schleifen

Stefan Hoffmann. Leichter Start mit BASCOM und myavr

myavr Programmierung in C

3 Achsen Accelerometer

Rauschgenerator mit AVR

Tag 2 Eingabe und Interrupts

Geschrieben von: Malte Freitag, den 16. Juli 2010 um 21:28 Uhr - Aktualisiert Montag, den 05. Dezember 2011 um 18:09 Uhr

Ruecklicht-V1 von Peter Krueger /

Forth-Vokabular. Vokabular für Attiny2313-Forth Stand: A: Assembler-Wort F: Forth-Wort C: Compiler-Wort

AVR-Mikrocontroller in BASCOM programmieren

Einführung in AVR-Assembler

Daten loggen mit der STI100-Platine

Zusammenfassung der Assemblerbefehle des 8051

Der Magnetfeldsensor HMC5883L

AVR-Mikrocontroller in BASCOM programmieren, Teil 1

Arduinio Projekt. Inhaltsverzeichnis

STM32 - Schieberegister, SPI - u

Datentechnik. Prinzipieller Aufbau eines Schnittstellenbausteins

Speicheraufbau des AT89C5131

4.0 Der Atmel AT89LPx052 Mikrocontroller

Das Attiny-Projekt Registermodell 1. Das Registermodell

E Mikrocontroller-Programmierung

Atmel AVR für Dummies

Sprungbefehle und Kontroll-Strukturen

Unter einem Interrupt kann man sich einen durch Hardware ausgelösten Unterprogrammaufruf vorstellen.

Interrupts. Funktionsprinzip. Funktionsprinzip. Beispiel in C

Grundlegende Programmiertechniken

JX6-INT1 Versions Update von V1.00 auf V1.24

Assembler für BASIC Programmierer

Schritt Aktion Erläuterung 1 UBRR auf 25 setzen Baudrate auf 9600 TXEN-Bit von UCSRB auf 1 setzen

8. Beschreibung des Prozessors MSP 430

Mikrocontrollerplatine vorbereiten

Die AVR Mikrocontrollerfamilie

Für den CTC-Mode kann demnach TCCR1A komplett auf 0 gesetzt werden, weil WGM11 und WGM10 in diesem Register liegen und beide laut Tabelle 0 sind:

Eingaben. Themen heute. Taster. Eingaben Zuweisungen Zeitmessung. Programmieren für Ingenieure Sommer Andreas Zeller, Universität des Saarlandes

UART und Interrupts. Versuch Nr. 7

Ampelsteuerung Merkblatt 2 Wie wird der Arduino programmiert?

5-Tonfolgen Dekodierung mittels AVR

Microcontroller Kurs Programmieren Microcontroller Kurs/Johannes Fuchs 1

Programmierübungen in Assembler

U5-2 Register beim AVR-µC

Interrupt-Programmierung

Core und Speicher des ATmega16

Arduino µcontroller. Virtuelle COMSchnittstelle

Unterprogramme mittels Stack (Forts.)

Labor für Prozessregelung und Rechnerverbund Anleitung zum WinMaster ( Dipl.-Ing. Peter Tarkany) Beschreibung: Dipl.-Ing.

GdI2 - Systemnahe Programmierung in C Übungen Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 U4.fm

CCS Compiler Tutorial mit Beispielen

Fuses mit BASCOM und USBASP setzen

Einführung in AVR Assembler

Name: ES2 Klausur Thema: ARM Name: Punkte: Note:

Microcontroller Selbststudium Semesterwoche 9

Technische Informatik 2: Addressierung und Befehle

Arduino Interrupt-Handling (Teil 1) Seite 2

Parallel-IO. Ports am ATmega128

Lösungen der Aufgaben

Atmega Interrupts. Rachid Abdallah Gruppe 3 Betreuer : Benjamin Bös

Starten Sie die Arduino IDE und geben Sie den folgenden Programmcode ein:

Praktikum Mikrorechner 11 (Timer 1)

C.1 Serielle Schnittstelle, erstes Testprogramm (a)

Bootloader FastBoot von Peter Dannegger

Einleitung Die Pins alphabetisch Kapitel 1 Programmierung des ATmega8 und des ATmega

Serielle Schnittstelle, erstes Testprogramm (a)

Aufgaben zur Attiny-Platine

Interruptsystem AVR. Interrupt-Quellen: Extern, Timer, ADC, USART usw. (siehe IVT im Anhang) Rücksprungadresse automatisch am Stack.

AVR Ein/Ausgabe. Inhaltsverzeichnis

Neues vom STRIP Forth-Prozessor

Autonome Mobile Systeme. Dr. Stefan Enderle

Deutsche Dokumentation von ihrem Elektronik-Lieferanten: Inteligentes Motorboard (12V/6A) mit I2C-Bus

Mikrocontroller Einstieg ATmega 8

Name: ES2 Klausur Thema: ARM Name: Punkte: Note:

SIOSLAB. Technische Daten:

Kapitel 18. Externe Komponenten

Übungsaufgaben. Stand

USB > I2C- Bus Modul. Startet den I2C-Bus. Daten einlesen NACK senden

QSYer für den YAESU FT-897 und FT September 2018 Matthias DD1US

Mikrocomputertechnik

ORIKA. Lycée Technique des Arts et Métiers. ... viel mehr als nur ein Spielzeug

Selbstgebauter, kompakter, Strom sparender, Mehrkanal- Datenlogger mit PICs

Transkript:

jean-claude.feltes@education.lu 1 AVR-Mikrocontroller in BASCOM programmieren, Teil 2 13. Interrupts 13.1 Externe Interrupts durch Taster Wenn Taster mittels Polling abgefragt werden, wie in Teil 1 beschrieben, kann das Hauptprogramm entweder nicht viel anderes tun (was auch mal vorkommen kann), oder es besteht die Möglichkeit, dass Tastendrücke verpasst werden wenn der Controller gerade mit etwas anderem beschäftigt ist. Als Demo für die Arbeit des Controllers soll uns eine blinkende LED dienen. Das Blinken soll mit 2 Tastern ein und aus geschaltet werden können. Ohne Interrupts: so geht es nicht. $hwstack=100 'Taster mit Pullup 'Ein 'Aus Dim Ledon As Bit If Pind.2 = 0 Then Ledon = 1 If Pind.3 = 0 Then Ledon = 0 Portd.5 = Ledon Die 1-bit-Variable Ledon ist ein Flag für Ein/Aus der LED. Während den Wait-Befehlen kann der Controller nichts nützliches tun, also auch nicht eine betätigte Taste bemerken. Wenn man nicht sehr lange auf die Taste drückt, verpasst das Programm die Betätigung mit großer Wahrscheinlichkeit. Mit Interrupts Achtung: es gibt beim Mega8 nur 2 Pins die auf externe Interrupts reagieren können: INT0 = D.2 und INT1 = D.3. Wir können also nicht wie beim Polling irgendwelche Pins nehmen! Tritt ein Interrupt auf, so unterbricht der Controller das mit dem er gerade beschäftigt war und springt in die Interrupt-Service-Routine. Diese ist ein möglichst kurz gehaltenes Unterprogramm, in dem z.b. ein Flag gesetzt werden kann, welches vom Hauptprogramm ausgewertet wird. Damit der Controller auf Interrupts reagieren kann, muss man 3 Dinge tun, (hier z.b. für INT0): Mit On Int0... deklarieren wohin beim Interrupt gesprungen werden soll. Mit Enable Int0 sagen dass dieser spezielle Interrupt aktiv ist. Mit dafür sorgen, dass die Interrupts allgemein aktiviert sind.

jean-claude.feltes@education.lu 2 In der Interrupt-Serviceroutine sollte so wenig wie möglich gemacht werden, denn während dieser Zeit ist der Controller für andere Interrupts blockiert. Der Interrupt kann auf Low-Level (statisch low), Rising (ansteigende Flanke) oder Falling (abfallende Flanke) konfiguriert werden. Bei Tastern gegen Masse verwendet man Falling. $hwstack=100 'Taster mit internem Pullup und aktivierten Interrupts On Int0 Int0service On Int1 Int1service Config Int0 = Falling Config Int1 = Falling Enable Int0 Enable Int1 Dim Ledon As Bit '------------------------------------------ Portd.5 = Ledon '------------------------------------------ Int0service: Ledon = 1 Int1service: Ledon = 0 Wegen den langen Wait-Befehlen passiert nicht immer sofort etwas, aber der Controller reagiert auch auf einen kurzen Tastendruck. Noch ein (einfacheres) Beispiel Das obige Beispiel sollte das Problem verdeutlichen (dass der Controller bei der Polling-Methode nicht immer ansprechbar ist) und eine Lösung zeigen. Um das Prinzip noch einmal klarzustellen hier ein noch einfacheres Beispiel: die LED soll mit den Tastern nur ein- und ausgeschaltet werden. In diesem Fall braucht das Hauptprogramm gar nichts zu tun..dat " $crystal = 4000000 'Taster

jean-claude.feltes@education.lu 3 On Int0 Int0serv On Int1 Int1serv Config Int0 = Rising Config Int1 = Falling Enable Int0 Enable Int1 Config Pind.5 = Output '------------------- 'Hauptprogramm : tu nix oder irgendwas sinnvolles '-------------------- Int0serv: Portd.5 = 1 Int1serv: 13.2 Worauf man allgemein bei Interrupts achten muss Der Sprung in die Interrupt-Routine kostet Zeit! BASCOM sichert automatisch immer die Register R0...R31 (außer R6 bis R9 und R12 bis R15) und das Statusregister SREG. Hierfür ist je 1 PUSH-Befehl am Anfang und 1 POP- Befehl am Ende der Serviceroutine erfordert. Für das Retten von SREG wird ein IN und ein PUSH, am Ende ein POP und ein OUT gebraucht. Vor dem Eintreten in die Serviceroutine verstreicht mindestens eine Zeit von 50 (für 25 POPs) + 2 (für IN) = 52 Taktzyklen, also z.b. 52 0.25µs = 13µs bei einem 4MHz-Quarz! Genaueres siehe Assembler für BASIC-Programmierer http://staff.ltam.lu/feljc/electronics/bascom/asm_bas.pdf Wenn man den Interrupt mit der Option Nosave aufruft, kann man Zeit sparen indem man sich selber um das Sichern der benutzten Register und des Statusregisters kümmert. Das Sichern der Rücksprung-Adresse und der Register braucht Platz in einem Teil des RAM, dem sogenannten Hardware Stack. Die Größe dieses Speicherbereichs wird in Options - Compiler - Chip eingestellt. Es kann sein, dass die Voreinstellung zu klein ist. In dem Fall überlappen HW Stack und BASCOM-Variablen, und es können seltsame Effekte auftreten. Empfehlenswert ist es, die Zeile $hwstack = 100 an den Programmbeginn zu setzen, so dass auf jeden Fall genug Stack reserviert wird.

jean-claude.feltes@education.lu 4 13.3 Serieller Interrupt zum Empfangen von Kommandozeichen Dies ist eine ähnliche Anwendung wie die Steuerung durch Taster. Vom PC soll ein Kommandobyte gesendet werden, welches im Demobeispiel einfach eine LED schaltet, stellvertretend für eine sinnvolle Arbeit des Controllers. Die im Teil 1 besprochene Lösung mit Polling wieder den Nachteil, dass Bytes verloren gehen können, wenn der Controller mit etwas anderem beschäftigt ist. Hier eine Lösung mit Interrupt: über RS232 ein- und ausschalten mit "1" und "0", 'interruptgesteuert $crystal = 4000000 $baud = 9600 On Urxc Serialinterrupt Dim Ok As Byte '-------------------------------------------------- 'Wenn ein Zeichen da ist If Ok <> "" Then Select Case Ok Case "1" Portd.5 = 1 Case "0" End Select End If '-------------------------------------------------- Serialinterrupt: Ok = Udr Hier wurde wieder die Interrupt-Serviceroutine kurz gehalten, und die Auswertung im Hauptprogramm durchgeführt. 13.4 Serieller Interrupt zur interaktiven Kommunikation Das folgernde Programm reagiert einerseits auf Kommandozeichen und fragt bei bestimmten Zeichen interaktiv nach einer bestimmeten Eingabe. Im Beispiel wird eine Variable hochgezählt, deren Startwert man resetten oder interaktiv eingeben kann. Um die Übersichtlichkeit zu steigern empfiehlt es sich, von Anfang an mit Unterprogrammen zu arbeiten. Diese können dann später beliebig erweitert werden. $hwstack = 50 $baud = 19200 On Urxc Serialinterrupt Dim I As Byte

jean-claude.feltes@education.lu 5 Dim Ok As Byte If Ok <> "" Then Gosub Communication Waitms 500 Print I I = I + 1 '------------------------------------------------------- Serialinterrupt: Ok = Udr '-------------------------------------------------------- Communication: Select Case Ok Case "0" I = 0 Case "i" Disable Urxc Input "Startwert von I eingeben: ", I End Select Ok = "" Wichtig: Beim Benutzen des INPUT-Befehls muß der serielle Interrupt abgeschaltet werden! Ausserdem muß daran gedacht werden, dass die Variable zum Empfang der Zeichen nach der Auswertung rückgesetzt wird. Kritik und Rückmeldungen bitte an jean-claude.feltes@education.lu