User Tools

Site Tools


tipps_fuers_programmieren

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
tipps_fuers_programmieren [2019/05/02 01:10]
tfischer - Imported by DokuWiki Advanced Plugin
tipps_fuers_programmieren [2019/08/21 19:57] (current)
tfischer
Line 1: Line 1:
-mexlewiki.hs-heilbronn.de====== Allgemeines ======+====== Allgemeines ======
   * Eine schöne Einführung in die Embedded Softwareentwicklung ist im Buch [[https://​link.springer.com/​content/​pdf/​10.1007%2F978-3-658-18386-8.pdf|Sensornetzwerke in Theorie und Praxis - Embedded Systems-Projekte erfolgreich realisieren]] von Kollegen Meroth und Sora zu finden. Dort wird der Einstieg in das Feld die (in Hardware) eingebettete Softwareentwicklung erklärt. Aus dem Hochschulnetz bzw. mit VPN können Sie dieses direkt bei Springer Link betrachten. Eine andere schöne Einführung findet sich auf [[https://​www.mikrocontroller.net/​articles/​AVR-GCC-Tutorial|Mikrocontroller.net]].   * Eine schöne Einführung in die Embedded Softwareentwicklung ist im Buch [[https://​link.springer.com/​content/​pdf/​10.1007%2F978-3-658-18386-8.pdf|Sensornetzwerke in Theorie und Praxis - Embedded Systems-Projekte erfolgreich realisieren]] von Kollegen Meroth und Sora zu finden. Dort wird der Einstieg in das Feld die (in Hardware) eingebettete Softwareentwicklung erklärt. Aus dem Hochschulnetz bzw. mit VPN können Sie dieses direkt bei Springer Link betrachten. Eine andere schöne Einführung findet sich auf [[https://​www.mikrocontroller.net/​articles/​AVR-GCC-Tutorial|Mikrocontroller.net]].
   * 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 und testen.   * 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 und testen.
Line 9: Line 9:
   * Falls Sie im Netz nach Lösungen suchen, so beachten Sie, dass bei Arduinos in der Regel C%%++%% (z.B. file.cpp) genutzt wird. Dies ist in den seltensten Fällen direkt kompatibel. Andererseits lassen sich aber die Konzepte übernehmen.   * Falls Sie im Netz nach Lösungen suchen, so beachten Sie, dass bei Arduinos in der Regel C%%++%% (z.B. file.cpp) genutzt wird. Dies ist in den seltensten Fällen direkt kompatibel. Andererseits lassen sich aber die Konzepte übernehmen.
   * for(x = 0 ; x < 400 ; x%%++%%) : Wenn x als 8 bit integer definiert ist, wird diese Schleife endlos lange laufen... ​   * for(x = 0 ; x < 400 ; x%%++%%) : Wenn x als 8 bit integer definiert ist, wird diese Schleife endlos lange laufen... ​
 +  * 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/​b
 +
  
 ====== serielle Schnittstellen ====== ====== serielle Schnittstellen ======
Line 31: Line 33:
   * Falls Sie einen externen Oszillator oder Quarz benutzen, werden zwei Ports dafür verwendet (Ports XTAL = "​Crystal"​). Wenn Sie diese Ports per DDR versehentlich zu einem Ausgang definieren, hat der Chip keinen Takt mehr. Das heißt diese Portzuweisung ist das letzte was der Chip macht... Es ist danach nur noch per Debuggerschnittstelle möglich diesen wieder zu beleben.   * Falls Sie einen externen Oszillator oder Quarz benutzen, werden zwei Ports dafür verwendet (Ports XTAL = "​Crystal"​). Wenn Sie diese Ports per DDR versehentlich zu einem Ausgang definieren, hat der Chip keinen Takt mehr. Das heißt diese Portzuweisung ist das letzte was der Chip macht... Es ist danach nur noch per Debuggerschnittstelle möglich diesen wieder zu beleben.
  
-====== ​Umgang mit Fehlern ====== +====== ​häufige ​Fehler ​und Debugging ======
-===== Programmier-Fehler ​===== +
- +
-  * "​Erasing device failed",​ "Error status received: Got 0xc9, expected 0x00 (An unknown command was sent)"​.  +
-    * Steht bei Device Programming das Interface auf ISP? Falls nicht kann dies die Ursache sein. Das Programming geschieht immer mittels ISP. +
-    * Hat das USB-Kabel/​Progi/​Adapterplatine/​Kabel ein Problem? Probieren Sie eine andere Variante der Komponenten durch +
-  * ** Mein Chip hat keinen Speicherplatz mehr** bzw ** Ich erhalte ein '​Memory Overflow'​ Fehler** Falls Sie Daten statt im SRAM im EEPROM speichern wollen, so können Sie das Befehlswort "​PROGMEM"​ nutzen. Details dazu finden Sie z.B. auf der Seite von [[https://​www.microchip.com/​webdoc/​AVRLibcReferenceManual/​pgmspace_1pgmspace_strings.html|Microchip]] +
- +
-====== ​Debugging ====== +
-  * Zum Auffinden von Fehlern gibt es verschiedene Vorgehen. Folgendes sehe ich als sinnvoll und zielführend an:  +
-    - Definieren des "​Gut-Falls":​ Wie wäre zu erkennen, dass das Programm korrekt läuft?  +
-    - Definieren des Ausgangszustands:​ Gab es schon ein Teil des Programms, welcher korrekt lief? +
-    - 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|<​code c>​... ​  +
-void main() +
-+
-  initLCD();​ +
-  initADC();​ +
-   +
-  while(1) +
-  { +
-     ​doThis();​ +
-     if (something) +
-     { +
-        LCDprint('​s',​1,​1);​ +
-        doThat(); +
-     } +
-  }; +
-}</​code>​++ +
-    - Ä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|<​code c>​... ​  +
-void main() +
-+
-  int dummy=0; +
-  ... +
-  while(1) +
-  { +
-     ​doThis();​ +
-     if (something) +
-     { +
-        dummy=1; +
-        doThis(); +
-        dummy=0; +
-     } +
-  }; +
-+
- +
-void doThis() +
-+
-   ... +
-   ​SomeCode;​ +
-   ​if(dummy==1) LCDprint('​s',​1,​1);​ +
-   ... +
-+
-</​code>​++ +
-    - 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/​Deklaration einer externen Variable sinnvoll. Beispiel: Es wurde die Datei ADC.h inkludiert. Aus main() wird setADCgain() aufgerufen. In dieser Funktion wird ein Fehler erwartet. Sinnvoll ist es nun die Variable dummy in ADC.h zu deklarieren (extern int dummy;) und in main.c zu definieren (int dummy=0;). Dann kann die Variable in ADC.C auch ohne weiter Definition/​Deklaration verwendet werden. Näheres dazu auch auf [[https://​en.wikipedia.org/​wiki/​External_variable#​Example_(C_programming_language)|Wikipedia]]. ++Beispiel|\\ **main.c** <code c>​... ​  +
-#include ADC.h +
- +
-int dummy=0; +
-void main() +
-+
-  ... +
-  while(1) +
-  { +
-     ​setADCgain();​ +
-     ... +
-     if (something) +
-     { +
-        dummy=1; +
-        setADCgain();​ +
-        dummy=0; +
-     } +
-  }; +
-+
- +
-</​code>​**ADC.h**\\ <code c>...  +
-extern int dummy; +
-</​code>​**ADC.c**\\ <code c>...  +
-void setADCgain() +
-+
-   ... +
-   ​SomeCode;​ +
-   ​if(dummy==1) LCDprint('​s',​1,​1);​ +
-   ... +
-+
-</​code>​+++
  
 +Tipps zum Debugging und zu häufigen Fehlern finden sich bei den [[Tipps für die Fehlersuche]].
  
tipps_fuers_programmieren.1556759415.txt.gz · Last modified: 2019/05/02 01:10 by tfischer