• Keine Ergebnisse gefunden

Teil 6 – C-Programmierung auf Mikrocontrollern

N/A
N/A
Protected

Academic year: 2021

Aktie "Teil 6 – C-Programmierung auf Mikrocontrollern"

Copied!
13
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Teil 6 – C-Programmierung auf Mikrocontrollern 1

Teil 6 – C-Programmierung auf Mikrocontrollern

6.1. Datentypen mit definierter Länge 6.2. Bit-Operationen

6.3. Volatile

6.4. Ports und Register

6.5. Statische Daten im Programm-Flash

(2)

Teil 6 – C-Programmierung auf Mikrocontrollern 2

Beispiel aus dem Praktikum

Demoprogramm zum Senden über die serielle Schnittelle

(3)

Teil 6 – C-Programmierung auf Mikrocontrollern 3

Beispiel aus dem Praktikum

Das Feld mit den zu übertragenden Einsen und Nullen wird im Datentyp „int“

abgespeichert. Auf dem Mikrocontroller ATmega328 belegt daher jede Zahl zwei Byte Speicher!

(4)

International Standard ISO/IEC 9899 (Programming Languages – C)

Teil 6 – C-Programmierung auf Mikrocontrollern 4

(5)

Teil 6 – C-Programmierung auf Mikrocontrollern 5

Ausschnitt aus stdint.h

Integer-Typen für AVR-8-Bit-Mikrocontroller

(6)

Teil 6 – C-Programmierung auf Mikrocontrollern 6

Beispiel aus dem Praktikum

LED am Ausgang PB5 ein- und ausschalten

int main(void) {

DDRB = 0b00100000; // PB5 als Ausgang konfigurieren

while(1) {

PORTB = 0b00100000; // ein _delay_ms(500);

PORTB = 0b00000000; // aus _delay_ms(500);

} }

(7)

Teil 6 – C-Programmierung auf Mikrocontrollern 7

Quelle: [1]

(8)

Teil 6 – C-Programmierung auf Mikrocontrollern 8

Beispiel aus dem Praktikum (a)

Timer 0 konfigurieren: ca. 20 Timer-Interrupts pro Sekunde

(9)

Teil 6 – C-Programmierung auf Mikrocontrollern 9

Beispiel aus dem Praktikum (b)

Timer 0 konfigurieren: ca. 20 Timer-Interrupts pro Sekunde

(10)

Teil 6 – C-Programmierung auf Mikrocontrollern 10

Beispiel

Variable "millis" wird im Interrupt und im Hauptprogramm genutzt

volatile int64_t millis = 0; // Millisekunden seit Programmstart ISR(TIM0_COMPA_vect) // Timer Compare Match Interrupt

{

++millis;

}

int main(void) {

int seconds;

...

while(1) {

// Achtung: Timer-Interrupts kurz deaktivieren, damit "millis"

// nicht während (!) der folgenden Berechnung verändert wird!

cli(); seconds = millis / 1000; sei();

if(seconds % 2 == 0) PORTB = 0b00001000;

else ...

(11)

Teil 6 – C-Programmierung auf Mikrocontrollern 11 Das Register PORTB liegt an Adresse 0x18

ATtiny13

Übersicht über alle Register, siehe Datenblatt S. 157

Quelle: [2]

(12)

Teil 6 – C-Programmierung auf Mikrocontrollern 12

pgmspace.h

Statische Daten im Programm-Flash ablegen

#include <avr/pgmspace.h>

const uint8_t sin_tab[] PROGMEM = { // Vorberechnete Sinustabelle...

35, 35, 195, 195, 67, 67, 131, 131, 3, 3, 93, 93, 157, 157, 29, 29, 237, 237, 109, 109, ...

19, 19, 19, 227, 227, 99, 99, 163, 163, 163, 0 }; // Ende der Tabelle: ---^

uint16_t sin_index = 0;

ISR (TIMER0_OVF_vect)

{ // Regelmäßiger Timer-Interrupt...

uint8_t x = pgm_read_byte_near(sin_tab + sin_index);

sin_index = sin_index + 1;

if(x == 0) {

sin_index = 0; // Tabellenende? --> Zurück zum Anfang...

x = pgm_read_byte_near(sin_tab + sin_index);

}

. . . .

(13)

Quellenverzeichnis 13

Quellenverzeichnis

[1] de.cppreference.com: Sprache, Operator-Vorrang (Stand: 10.05.2016) [2] www.atmel.com: Datenblatt ATtiny13 (Stand: 12.04.2016)

Referenzen

ÄHNLICHE DOKUMENTE

Hinweis: Alle Beispiele in diesem Lehrbuch werden mit der Referenzhardware myAVR Board MK2 beschrieben.. 2.2

stop the assembly at this point and check for shorts and solder bridges around the IC sockets, voltage regulators, and the lOO-pin

• Eine Messung eines AD-Wandlers Abgeschlossen ist.. Registrierung

Man unterscheidet zwischen drei Arten von Interrupts Software - wird von einem Programm ausgelöst.. Prozessor - wird von einem anderen Prozessor ausgelöst Hardware - wird von

[r]

• Timer nötig z ur Implementierung eines

Strukturen: Zusammenfassung von Variablen (gleichen oder verschiedenen

Befehlsfolge, die Ergebnis berechnet und mit- tels return -Anweisung zur¨