Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
microcontrollertechnik:1_hello_blinking_world [2022/09/19 00:22] tfischer Port / Pin von D6 in B2 |
microcontrollertechnik:1_hello_blinking_world [2024/03/21 02:58] (aktuell) mexleadmin |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== 1. Hello Blinking World ====== | + | wie fi====== 1 Hello Blinking World ====== |
===== 1.1 AVR Programmierung für Dummies ===== | ===== 1.1 AVR Programmierung für Dummies ===== | ||
Zeile 34: | Zeile 34: | ||
Nach dieser Lektion sollten Sie: | Nach dieser Lektion sollten Sie: | ||
- | - wissen, wie man im Atmel Studio ein Projekt anlegt. | + | - wissen, wie man im Microchip |
- wissen, wie der Programmierumgebung die Taktfrequenz des Microcontrollers festgelegt wird. | - wissen, wie der Programmierumgebung die Taktfrequenz des Microcontrollers festgelegt wird. | ||
- die wichtigsten Bitmanipulationen (Bitmaske zum setzten und löschen eines einzelnen Bits, togglen) kennen und anwenden können. | - die wichtigsten Bitmanipulationen (Bitmaske zum setzten und löschen eines einzelnen Bits, togglen) kennen und anwenden können. | ||
Zeile 44: | Zeile 44: | ||
==== Video ==== | ==== Video ==== | ||
- | {{youtube> | + | {{youtube> |
</ | </ | ||
Zeile 52: | Zeile 52: | ||
--> I. Vorarbeiten # | --> I. Vorarbeiten # | ||
- | - installieren Sie [[0._hilfsmittel#atmel_studio|SimulIDE und Atmel Studio]] | + | - installieren Sie [[0_hilfsmittel#Microchip_studio|SimulIDE und Microchip |
- falls es Probleme bei der Programmierung gibt: nutzen Sie die [[elektronik_labor: | - falls es Probleme bei der Programmierung gibt: nutzen Sie die [[elektronik_labor: | ||
<-- | <-- | ||
- | --> II. Eingabe in Atmel Studio # | + | --> II. Eingabe in Microchip |
- | - öffnen Sie Atmel Studio | + | - öffnen Sie Microchip |
- Anlegen eines neuen Projekts | - Anlegen eines neuen Projekts | ||
- '' | - '' | ||
Zeile 69: | Zeile 69: | ||
- Im unteren Teil des Fensters sollte nun die Ausgabe des Kompilers sichtbar werden. Diese sollte '' | - Im unteren Teil des Fensters sollte nun die Ausgabe des Kompilers sichtbar werden. Diese sollte '' | ||
- Auswählen der hex-Datei | - Auswählen der hex-Datei | ||
- | - im Atmel Studio finden Sie rechts im Fenster den " | + | - im Microchip |
- gehen Sie dort im Solution Explorer zu '' | - gehen Sie dort im Solution Explorer zu '' | ||
- klicken Sie mit rechter Maustaste auf '' | - klicken Sie mit rechter Maustaste auf '' | ||
Zeile 76: | Zeile 76: | ||
--> III. Ausführung in Simulide # | --> III. Ausführung in Simulide # | ||
- Öffnen Sie SimulIDE (unter ...\bin\simulide.exe) | - Öffnen Sie SimulIDE (unter ...\bin\simulide.exe) | ||
- | - links in SimulIDE sollten Sie den Komponenten Browser finden. Wählen Sie dort '' | + | - links in SimulIDE sollten Sie den Komponenten Browser finden. Wählen Sie dort '' |
- | - Ziehen Sie den Eintrag '' | + | - Ziehen Sie den Eintrag '' |
- | - Es sollte nun ein Chip names '' | + | - Es sollte nun ein Chip names '' |
- Erstellen der Ausgangsschaltung | - Erstellen der Ausgangsschaltung | ||
- | - Im Programm wurde im auf PortD das 6bit angesprochen. Entsprechend soll auch hier am Port D der Ausgang | + | - Im Programm wurde im auf PortB das 2bit angesprochen. Entsprechend soll auch hier am Port B der Ausgang |
- Fügen Sie eine LED (im Komponenten Browser über Output LED) und ein Massepotential ein (Sources Ground) | - Fügen Sie eine LED (im Komponenten Browser über Output LED) und ein Massepotential ein (Sources Ground) | ||
- Die Komponenten können mit dem Kontextmenu (Rechtsklick) gedreht und gespiegelt werden. Außerdem ist mit der Auswahl von '' | - Die Komponenten können mit dem Kontextmenu (Rechtsklick) gedreht und gespiegelt werden. Außerdem ist mit der Auswahl von '' | ||
- | - Verbinden Sie die LED mit Masse und mit Port D6. Achten Sie auf die richtige Richtung der LED. Die Verbindungen lassen sich dadurch erstellen, dass auf ein Komponenten-Pin geklickt wird und die Linie zu einem nächsten Komponenten-Pin gezogen wird. | + | - Verbinden Sie die LED mit Masse und mit Port B2. Achten Sie auf die richtige Richtung der LED. Die Verbindungen lassen sich dadurch erstellen, dass auf ein Komponenten-Pin geklickt wird und die Linie zu einem nächsten Komponenten-Pin gezogen wird. |
- Flashen der Software | - Flashen der Software | ||
- Klicken Sie rechts auf den Microcontroller und wählen Sie '' | - Klicken Sie rechts auf den Microcontroller und wählen Sie '' | ||
Zeile 103: | Zeile 103: | ||
- Lesen Sie auf Mikrocontroller.net im Kapitel [[https:// | - Lesen Sie auf Mikrocontroller.net im Kapitel [[https:// | ||
- Registeranalyse | - Registeranalyse | ||
- | - Öffnen Sie in Simulide die RAM Table (je nach Version: über Reiter | + | - Öffnen Sie in Simulide die RAM Table (Rechtsklick auf Microcontroller |
- | - Analysieren Sie das Verhalten der Register '' | + | - Analysieren Sie das Verhalten der Register '' |
- | - Zählt der Zähler aufwärts oder abwärts? Ändern Sie dazu die Simulationsgeschwindigkeit | + | - Zählt der Zähler aufwärts oder abwärts? Ändern Sie dazu die Simulationsgeschwindigkeit |
<-- | <-- | ||
Zeile 150: | Zeile 150: | ||
<-- | <-- | ||
- | --> Was ist DDRD, PORTD?# | + | --> Was ist DDRB, PORTB?# |
Die Anschlüsse (Pins) des Chips sind in 8er Gruppen sortiert, den sogenannten Ports. | Die Anschlüsse (Pins) des Chips sind in 8er Gruppen sortiert, den sogenannten Ports. | ||
- | Für jeden Port sind jeweils drei Register-Bytes vorhanden: DDRx, PORTx und PINx. Diese Speicherstellen ermöglichen die Konfiguration des Ports. Die Bits in den Registern stehen für die einzelnen Anschlüsse: | + | Für jeden Port sind jeweils drei Register-Bytes vorhanden: DDRx, PORTx und PINx. Diese Speicherstellen ermöglichen die Konfiguration des Ports. Die Bits in den Registern stehen für die einzelnen Anschlüsse: |
Das Bit im **DDRx** (__D__ata __D__irection __R__egister) wählt die Richtung des Pins aus. Wenn dort logisch Eins geschrieben wird, wird der entsprechende Pin als Ausgangspin konfiguriert. Wenn dort logisch Null geschrieben wird, wird der entsprechende Pin als Eingangspin konfiguriert. | Das Bit im **DDRx** (__D__ata __D__irection __R__egister) wählt die Richtung des Pins aus. Wenn dort logisch Eins geschrieben wird, wird der entsprechende Pin als Ausgangspin konfiguriert. Wenn dort logisch Null geschrieben wird, wird der entsprechende Pin als Eingangspin konfiguriert. | ||
Zeile 160: | Zeile 160: | ||
Wenn das gewünschte Bit in PORTx logisch Eins geschrieben wird und der Pin als Ausgangspin konfiguriert ist, wird der Portpin auf high (eins) gesetzt. Wenn das gewünschte Bit in PORTx logisch Null geschrieben wird und der Pin als Ausgangspin konfiguriert ist, wird der Portpin auf Low (Null) getrieben. | Wenn das gewünschte Bit in PORTx logisch Eins geschrieben wird und der Pin als Ausgangspin konfiguriert ist, wird der Portpin auf high (eins) gesetzt. Wenn das gewünschte Bit in PORTx logisch Null geschrieben wird und der Pin als Ausgangspin konfiguriert ist, wird der Portpin auf Low (Null) getrieben. | ||
- | Auch wenn ein Pink als Eingangspin konfiguriert wurde, hat PORTx eine Funktion. Wenn in diesem Fall das gewünschte Bit in PORTx logisch eins geschrieben wird, wird der Pull-up-Widerstand aktiviert. Ein Pull-up-Widerstand ist ein höherohmiger Widerstand (im Bereich $20 k\Omega$ ... $100 k\Omega$), der bei nicht weiter verbundenem Pin den ausgegebenen Wert auf logisch Eins zieht. Um den Pull-up-Widerstand auszuschalten, | + | Auch wenn ein Pink als Eingangspin konfiguriert wurde, hat PORTx eine Funktion. Wenn in diesem Fall das gewünschte Bit in PORTx logisch eins geschrieben wird, wird der Pull-up-Widerstand aktiviert. Ein Pull-up-Widerstand ist ein höherohmiger Widerstand (im Bereich $20~\rm k\Omega$ ... $100~\rm k\Omega$), der bei nicht weiter verbundenem Pin den ausgegebenen Wert auf logisch Eins zieht. Um den Pull-up-Widerstand auszuschalten, |
Das Einlesen der Signale wird in einem späteren Kapitel erklärt. | Das Einlesen der Signale wird in einem späteren Kapitel erklärt. | ||
Zeile 177: | Zeile 177: | ||
--> | --> | ||
- | Die Namen sind im Datenblatt des verwendeten Microcontrollers zu finden. | + | Die Namen sind im Datenblatt des verwendeten Microcontrollers zu finden. |
+ | - Mittels | ||
+ | - Direkt | ||
+ | Leider gibt es gerade bei dem ATMEGA88 auch ein **veraltetes** Datenblatt, welches just das ist, wass sich z.B. über Google leichter finden lässt. \\ | ||
+ | in diesem Fall muss also über die Herstellerseite gesucht werden, bzw. bei der Suchmaschine '' | ||
- | Die gesuchte Pinbelegung | + | Zum Lesen der Datenblätter empfiehlt sich ein Download und die Betrachtung über einen PDF-Viewer, welcher ein Inhaltsverzeichnis als Seitenleiste ermöglicht (z.B. Acrobat Reader). Ansonsten |
- | <WRAP right> | + | Die gesuchte Pinbelegung ist für den ATmega88 konkret auf Seite 3 unter "1. Pin Configurations": |
+ | |||
+ | <WRAP right> | ||
| | ||
</ | </ | ||
Zeile 204: | Zeile 210: | ||
Richtig bemerkt. Das liegt daran, dass der verwendete Chip in Simulide auf 16 MHz läuft. Dies ist in der Simulation oben unter dem Start-Button zu sehen. | Richtig bemerkt. Das liegt daran, dass der verwendete Chip in Simulide auf 16 MHz läuft. Dies ist in der Simulation oben unter dem Start-Button zu sehen. | ||
- | In Realität wird die Taktfrequenz durch die Randbedingungen wie Performance, | + | In Realität wird die Taktfrequenz durch die Randbedingungen wie Performance, |
Häufig werden hierbei - neben ganzzahligen MHz - auch Vielfache von 256 genutzt, wie z.B. 12,288 MHz. Dies vereinfacht das exakte Abzählen von (Milli)Sekunden, | Häufig werden hierbei - neben ganzzahligen MHz - auch Vielfache von 256 genutzt, wie z.B. 12,288 MHz. Dies vereinfacht das exakte Abzählen von (Milli)Sekunden, | ||
Der Takt kann bei der realen Hardware in der Regel nicht zur Laufzeit beliebig geändert werden, sondern liegt fest vor. | Der Takt kann bei der realen Hardware in der Regel nicht zur Laufzeit beliebig geändert werden, sondern liegt fest vor. | ||
Zeile 232: | Zeile 238: | ||
// Die Zahl in folgender Zeile gibt die Bitposition in der nächsten Zeile an: | // Die Zahl in folgender Zeile gibt die Bitposition in der nächsten Zeile an: | ||
// | // | ||
- | DDRD=0b00000100; | + | DDRB=0b00000100; |
while (1) | while (1) | ||
{ | { | ||
Zeile 262: | Zeile 268: | ||
<sxh c; first-line: 13> | <sxh c; first-line: 13> | ||
- | PORTB |= 1<< | + | PORTB |= 1<< |
</ | </ | ||
Zeile 313: | Zeile 319: | ||
... | ... | ||
uint8_t a = DUMMY1; // DUMMY1 ist größer als 500 | uint8_t a = DUMMY1; // DUMMY1 ist größer als 500 | ||
- | uint8_t b = DUMMY2 * 2; // Ergebnis ist 5 + 3 *2 = 16 , nicht 10 | + | uint8_t b = DUMMY2 * 2; // Es wird 5 + 3 *2 = 11 ausgegeben, und nicht (5 + 3)*2 = 16 |
... | ... | ||
} | } | ||
Zeile 330: | Zeile 336: | ||
--> Wie sähe der Code aus, wenn man sich an die Vorgaben für sauberen Code hielte?# | --> Wie sähe der Code aus, wenn man sich an die Vorgaben für sauberen Code hielte?# | ||
- | Hierbei ist zu beachten, dass auch die Verwendung von delays vermieden werden soll. Diese sind ein " | + | Hierbei ist zu beachten, dass auch die Verwendung von delays vermieden werden soll. Diese sind ein " |
<sxh c; first-line: 1> | <sxh c; first-line: 1> | ||
Zeile 358: | Zeile 364: | ||
--> Beim " | --> Beim " | ||
- | Klicken Sie auf den fraglichen Code-Snipsel (z.B. Variablen- oder Funktionsname) mit einem Rechts-Klick und wählen Sie '' | + | Klicken Sie auf den fraglichen Code-Snipsel (z.B. Variablen- oder Funktionsname) mit einem Rechts-Klick und wählen Sie '' |
<-- | <-- |