Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung Nächste Überarbeitung Beide Seiten der Revision | ||
microcontrollertechnik:tipps_fuers_programmieren [2019/08/21 16:46] tfischer [Programmier-Fehler] |
microcontrollertechnik:tipps_fuers_programmieren [2022/04/05 00:53] tfischer ↷ Links angepasst weil Seiten im Wiki verschoben wurden |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== | + | ====== |
- | * Eine schöne Einführung in die Embedded Softwareentwicklung ist im Buch [[https:// | + | |
- | * Zum Programmieren muss die Hardware noch nicht vollständig sein. Wenn Sie einen Mikrocontroller der ATmega Familie nutzen wollen, so können Sie z.B. mit dem MiniMEXLE bereits Software entwickeln | + | * Sofern es sich um eine Aufgabe mit Hardware-Software-Co-Design hantdelt, kann mit der Erstellung der Software bzw. der Softwaresystem-Entwicklung bereits parallel zur Schaltplan-Erstellung bzw. direkt danach begonnen werden. |
+ | * Machen Sie sich dazu zunächst Gedanken, | ||
+ | * **was** | ||
+ | * und in **welcher Abfolge** | ||
+ | * Dann können Sie sich überlegen, | ||
+ | * wie diese einzelnen Tätigkeiten **C-Funktionen** | ||
+ | * wie die C-Funktionen | ||
+ | * welche Schnittstellen die C-Funktionen untereinander benötigen, (Datentyp, Wertebereich, | ||
+ | * **Erst dann sollten Sie überlegen wie der Code aussieht**. Hier hilft ein Blick in die Datenblätter | ||
+ | |||
+ | ===== Software System Design ===== | ||
+ | Falls Sie noch nicht wissen, wie die Software oder die zu verwende Hardware genau genutzt | ||
+ | * Suchen Sie die Komponente nicht (nur) auf deutsch. Die Ergebnisse vermehren sich um ein Vielfaches, wenn in Englisch gesucht wird. Zur Übersetzung empfiehlt | ||
+ | * Nutzen Sie auch die Bildersuche, | ||
+ | * Bei unklaren Begriffen, bieten sich auch folgende Suchworte an: // '' | ||
+ | |||
+ | ===== Vorgaben für Bewertung ===== | ||
+ | |||
+ | Die [[vorgaben_fuer_die_softwareentwicklung|Vorgaben für die Programmierung]] enthalten Hinweise, wie der abgegebene Code aussehen soll. | ||
+ | |||
+ | ===== Häufige Fehler | ||
+ | |||
+ | * Tipps zum Debugging und zu häufigen Fehlern finden sich bei den [[elektronik_labor: | ||
* Versuchen Sie möglichst nach jeder kleinen Änderung Ihr Programm zu testen. Wenn Sie drei Punkte ändern und dann erst testen, dann wissen Sie nicht, an welcher Änderung es liegt! | * Versuchen Sie möglichst nach jeder kleinen Änderung Ihr Programm zu testen. Wenn Sie drei Punkte ändern und dann erst testen, dann wissen Sie nicht, an welcher Änderung es liegt! | ||
*{{ :: | *{{ :: | ||
+ | |||
+ | ===== Allgemeines ===== | ||
+ | * Eine schöne Einführung in die Embedded Softwareentwicklung ist im Buch [[https:// | ||
+ | * Zum Programmieren muss die Hardware noch nicht vollständig sein. Wenn Sie einen Mikrocontroller der ATmega Familie nutzen wollen, so können Sie z.B. mit dem MiniMEXLE, MEXLE2020 oder Simulide bereits Software entwickeln und testen. | ||
* Tipps für die {{ : | * Tipps für die {{ : | ||
* Falls Sie lange Tabellen benötigen, sollten Sie die Daten im Programmspeicher (EEPROM) und nicht im Datenspeicher (SRAM) ablegen. In der Regel ist der Programmspeicher um den Faktor 5..10 größer | * Falls Sie lange Tabellen benötigen, sollten Sie die Daten im Programmspeicher (EEPROM) und nicht im Datenspeicher (SRAM) ablegen. In der Regel ist der Programmspeicher um den Faktor 5..10 größer | ||
Zeile 11: | Zeile 37: | ||
* Die Variablentypen sind bei Rechnungen zu beachten, sonst wird aus c=a/b mit int a=5 und int b=2 eine 2. Hier hilft ein expliziter Typecast: c=(float)a/ | * Die Variablentypen sind bei Rechnungen zu beachten, sonst wird aus c=a/b mit int a=5 und int b=2 eine 2. Hier hilft ein expliziter Typecast: c=(float)a/ | ||
- | + | ===== serielle Schnittstellen ===== | |
- | ====== serielle Schnittstellen | + | |
* Die Programmierung eines AVR-Chips über USB (sofern dies der Chip ermöglicht), | * Die Programmierung eines AVR-Chips über USB (sofern dies der Chip ermöglicht), | ||
* Falls Sie einen externen Baustein über einen Mikrocontroller ansteuern wollen, ist folgendes zu beachten: Überprüfen Sie, ob der externe Baustein auf die positive Flanke triggert oder auf die negative. In der Regel lässt sich dies beim externen Baustein nicht ändern. Dies kann auf der Seite des Mikrocontrollers per Software geändert werden. | * Falls Sie einen externen Baustein über einen Mikrocontroller ansteuern wollen, ist folgendes zu beachten: Überprüfen Sie, ob der externe Baustein auf die positive Flanke triggert oder auf die negative. In der Regel lässt sich dies beim externen Baustein nicht ändern. Dies kann auf der Seite des Mikrocontrollers per Software geändert werden. | ||
* Falls eine weitere I2C Schnittstelle benötigt wird, so finden sich [[https:// | * Falls eine weitere I2C Schnittstelle benötigt wird, so finden sich [[https:// | ||
- | ====== Programmierung des ST7565 im Display ERC 128 64 - 1 ====== | + | ===== Programmierung des ST7565 im Display ERC 128 64 - 1 ===== |
- | * Das Display {{ :: | + | * Das Display {{ laborausstattung: |
* Je 8bit vertikal sind im {{ :: | * Je 8bit vertikal sind im {{ :: | ||
* Die Kommandos, welche über SPI genutzt werden können, sind im Datasheet beschrieben. | * Die Kommandos, welche über SPI genutzt werden können, sind im Datasheet beschrieben. | ||
Zeile 25: | Zeile 50: | ||
* Beachten Sie die Einbaurichtung bei der Ansteuerung des Displays. | * Beachten Sie die Einbaurichtung bei der Ansteuerung des Displays. | ||
- | ====== Verwenden von Ports ====== | + | ===== Verwenden von Ports ===== |
* Folgendes ist zu beachten, falls Sie JTAG-Ports - z.B. PF4..7 bei ATMEGA16U4 - anderweitig verwenden wollen/ | * Folgendes ist zu beachten, falls Sie JTAG-Ports - z.B. PF4..7 bei ATMEGA16U4 - anderweitig verwenden wollen/ | ||
MCUCR |=(1<< | MCUCR |=(1<< | ||
MCUCR |=(1<< | MCUCR |=(1<< | ||
</ | </ | ||
- | * Für eine zeitkritische Ausgabe von aufeinanderfolgenden Bits (z.B. für die Ansteuerung von [[Hardware_fuer_schaltungserstellung|intelligenten LEDs]]) müssen unbedingt Interrupts genutzt werden. Es lohnt sich zusätzlich auf __USART__ zurückzugreifen. Bei USART werden die zu versendenden Daten zunächst ins UDRn Register gegeben und dann in das Shiftregister übertragen. | + | * Für eine zeitkritische Ausgabe von aufeinanderfolgenden Bits (z.B. für die Ansteuerung von [[elektronik_labor: |
* Falls Sie einen externen Oszillator oder Quarz benutzen, werden zwei Ports dafür verwendet (Ports XTAL = " | * Falls Sie einen externen Oszillator oder Quarz benutzen, werden zwei Ports dafür verwendet (Ports XTAL = " | ||
- | ====== | + | ====== |
- | ===== Programmier-Fehler | + | ===== Schrittmotortreiber |
- | * " | + | Verschiedene Schrittmotortreiber |
- | * Steht bei Device Programming das Interface auf ISP? Falls nicht kann dies die Ursache sein. Das Programming geschieht immer mittels ISP. | + | Folgende Simulation ermöglicht aber zumindest |
- | * Hat das USB-Kabel/ | + | {{microcontrollertechnik:stepper.rar}} |
- | * ** Mein Chip hat keinen Speicherplatz mehr** | + | |
- | * **F_CPU not defined for** (z.B. < | + | |
- | * Gehe zu Menu: Projekt > (ProjektName) Eigenschaften > Toolchain > AVR/GNU C Compiler > Symbols | + | |
- | * Füge F_CPU=8000000 (bzw. Passende Frequenz) ein | + | |
- | * **Das Programm kompiliert nicht** **TWSR not found** : Falls Sie einen modernen AVR Chip nutzen (z.B. 328PB) so kann dieser mehrere SPI und I2C Schnittstellen haben. Damit haben sich bei diesem Target auch die Register- und Interruptvektornamen geändert. Statt TWSR ist dann TWSR0 oder TSWR1 zu verwenden - je nach gewünschtem Pin. Dies ist am einfachsten über defines | + | |
- | ====== Debugging ====== | + | |
- | * Zum Auffinden von Fehlern gibt es verschiedene Vorgehen. Folgendes sehe ich als sinnvoll | + | |
- | - Definieren | + | |
- | - Definieren des Ausgangszustands: | + | |
- | - Falls es schon einen Teil des Programms gab, so sollte dieser wieder hergestellt werden. Die Änderungen sollten dann Zeile für Zeile (bzw. Funktionsblock für Funktionsblock) eingefügt und auf der Hardware auf getestet werden. | + | |
- | - Zur Ausgabe bietet es sich an z.B. ein unbenutzten PIN oder - falls schon vorhanden und in Software ansprechbar - ein Display zu nutzen. | + | |
- | - Die Ausgabemöglichkeit kann als genutzt werden, um den Programmablauf zu überprüfen. z.B. kann die Ausgabe eines Buchstabens auf dem Display als Zeile eingefügt und so das Erreichen dieser Zeile überprüft werden. ++Beispiel|< | + | |
- | void main() | + | |
- | { | + | |
- | initLCD(); | + | |
- | initADC(); | + | |
- | + | ||
- | while(1) | + | |
- | | + | |
- | | + | |
- | if (something) | + | |
- | { | + | |
- | LCDprint(' | + | |
- | doThat(); | + | |
- | } | + | |
- | }; | + | |
- | }</ | + | |
- | - Ähnliches geht auch beim Sprung in ein Unterprogramm. Wird dieses aber mehrmals in der Hauptschleife aufgerufen, kann es sich anbieten eine Hilfsvariable einzufügen. Damit ist es möglich nur den Sprung beim vermuteten Fehlverhalten zu betrachten: ++Beispiel|< | + | |
- | void main() | + | |
- | { | + | |
- | int dummy=0; | + | |
- | ... | + | |
- | while(1) | + | |
- | { | + | |
- | | + | |
- | if (something) | + | |
- | { | + | |
- | dummy=1; | + | |
- | doThis(); | + | |
- | dummy=0; | + | |
- | } | + | |
- | }; | + | |
- | } | + | |
- | void doThis() | ||
- | { | ||
- | ... | ||
- | | ||
- | | ||
- | ... | ||
- | } | ||
- | </ | ||
- | - Falls sich das Unterprogramm in einer weiteren Datei (z.B. eingebundene Library) befindet, so muss die Hilfsvariable übergeben werden. Temporär ist dafür die Definition/ | ||
- | #include ADC.h | ||
- | int dummy=0; | ||
- | void main() | ||
- | { | ||
- | ... | ||
- | while(1) | ||
- | { | ||
- | | ||
- | ... | ||
- | if (something) | ||
- | { | ||
- | dummy=1; | ||
- | setADCgain(); | ||
- | dummy=0; | ||
- | } | ||
- | }; | ||
- | } | ||
- | </ | ||
- | extern int dummy; | ||
- | </ | ||
- | void setADCgain() | ||
- | { | ||
- | ... | ||
- | | ||
- | | ||
- | ... | ||
- | } | ||
- | </ | ||