Pic32: Unterschied zwischen den Versionen

Aus Wiki CCC Göttingen
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
 
(224 dazwischenliegende Versionen von 6 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Auf dieser Seite dreht sich alles um den Miktrokontroller PIC32MX220F032D [http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en556010].
Struktur Vorschlag für dieses Wiki
[[Media:CCC_Wiki.pdf]]


Es folgt sicher bald der ein oder andere Talk zu diesem Mikrokontroller, der MIPS-Architektur, Pinguino, dem Flauschball und anderen in Bezug stehenden Projekten. (Wer mag kann da gerne was von übernehmen)
Wir experimentieren mit dem Pic32! Genaugenommen mit dem [http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en556010 PIC32MX220F032D].


= Pinguino =
Eine [[Pic32_Chronik|Chronik]], welche unsere "Fortschritte" aufzeigt.....
[http://pinguino.cc Pinguino] ist ein an Arduino angelehntes open source Projekt. Eines der Pinguinoboards verwendet genau den Mikrokontroller unseres Begehrens.


Status: 7 Stück dieser [http://www.watterott.com/de/PIC32-PINGUINO-MX220 dieser Pinguinoboards] wurden bestellt. Kostenpunkt: 11,84 Eiros pro Stück.
= Theorie =
under construction


Zwei der Boards werden künftig im Space liegen. Diese können gerne zum Experimentieren verwendet werden. Wer eins davon besitzen möchte, braucht nur 12 Striche bei yela an die Mate-Credittafel zu kritzeln.
== Architektur ==
* MIPS-Architektur [http://de.wikipedia.org/wiki/MIPS-Architektur]
** [http://www.cs.cornell.edu/courses/cs3410/2012sp/MIPS_Vol1.pdf MIPS32™ Architecture For Programmers Volume I: Introduction to the MIPS32™ Architecture]
** [http://www2.engr.arizona.edu/~ece369/Resources/MipsInstructionSetReference.pdf MIPS32™ Architecture For Programmers Volume II: The MIPS32™ Instruction Set] (''ausführliche'' Referenz zum Nachschlagen)
** [http://www.mips.com/media/files/MD00565-2B-MIPS32-QRC-01.01.pdf Schnellreferenz Für Befehlssatz] ("cheat sheet")
** Siehe auch [[Pic32_Assembler|Unsere Assembler-Experimente]]
* RISC [http://de.wikipedia.org/wiki/RISC]
* Harvard-Architektur [http://de.wikipedia.org/wiki/Harvard-Architektur]


= Pic32 raw =
== Dokumentation des Mikrokontrollers ==
In diese Sektion gehören Dinge zum Pic32, die nichts mit dem Pinguino zu tun haben.
* Herstellerseite des Mikrokontrollers [http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en556010]
** Wichtig ist z.B. das Family Reference Manual und der Beispielcode unten auf der Seite, sowie das
** Family Data Sheet [http://ww1.microchip.com/downloads/en/DeviceDoc/61168D.pdf]
*[http://ww1.microchip.com/downloads/en/AppNotes/01145b.pdf Using a USB Flash Drive with an Embedded Host]


Ein Buch über die Programmierung von Pic32 Mikrokontrollern in C wird die Tage in den Space verfrachtet. (Natürlich ist das MIPS-Assembler auch seeehr spannend)
== Tutorials ==
* Buch: Pic32 C Programmierung  
<gallery perrow=3 widths=200>
Datei:Alex lotta 01 .IMG 7735.JPG | Im Space: Ja<br />Ausgeliehen an: ---
</gallery>
*[http://www.johnloomis.org/microchip/pic32/resources.html Johnloomis Pic32 Tutorial] - In den Beispielcodes "mPORTDxxx" Makros durch "PORTA"-"PORTC" ersetzen und die Pins anpassen. Port D gibt es bei unserem Chip nicht.
* Schönes allgemeines C-Buch gesucht? [http://c.learncodethehardway.org/book/ Learn C The Hard Way]


= Flauschball =
== Weitere Links ==
Die Elektronik des [http://quantenbotanik.de/flauschballelektronik Flauschballs] soll mit diesem Chip laufen. Alles was in Bezug zu dem Flauschballprojekt steht, gehört in diese Sektion. Die Ergebnisse von yela und eine ausführliche Projektbeschreibung findet ihr auf der [http://quantenbotanik.de/flauschballelektronik Flauschballhomepage].
*[http://code.google.com/p/ejtagproxy/ ejatagproxy: GNU debugger für Pic32]
*[http://www.freertos.org/a00090.html#MICROCHIP freertos] is a real-time operating system for embedded devices
**[http://ww1.microchip.com/downloads/en/AppNotes/01264a.pdf Microchip AN1264] Integrating Microchip Libraries with a Real-Time Operating System


Im Space steht künftig eine Kiste mit Bauteilen, die für den Flauschball relevant sind. Diese stelle ich für Pic32-Projekte kostenfrei zur Verfügung. Natürlich ist das nicht ganz uneigennützig, denn ich bin ziemlich interessiert an einem Austausch über die Funktionsweise und Programmierung dieser Bauteile. ;)
= Entwicklung =
TODO: Beschreibung
== Toolchain ==
=== IDE: MPLAB X ===
MPLAB X ist die IDE von Microchip, der passende compiler XC32 muss zusaetzlich installiert werden.


Wer mag darf trotzdem gerne Mate-Creditstriche bei yela machen.  
Sehr zu empfehlen ist die Hilfe: Help --> Help Contents (besonders C32 Toolchain).
Dort zu finden ist beispielsweise eine schrittweise Anleitung zur Erstellung eines Beispielprojektes und einiges an Codebeispielen zu den verschiedenen Chipfeatures.


Eine Auflistung des Inhalts dieser Kiste folgt in Kürze. Bitte nicht in der Kiste rumwühlen, sondern stattdessen auf diese Inhaltsangabe schauen.
*[http://ww1.microchip.com/downloads/en/DeviceDoc/52027a.pdf Handbuch MPLAB X]


In Verbindung mit dem Pinguino-Board ist folgendes zu beachten:
* die nötige procdefs.ld-Datei muss in das Projektverzeichnis gepackt werden (nicht in ein Unterverzeichnis o.ä.)
* zum automatischen Flashen bei einem Build kann die Funktion "Execute after Build" benutzt werden. Dazu: In die Eigenschaften des Projekts gehen. Dort den Bereich "Building" wählen. Dort gibt es dann eine Zeile für die Funktion "Execute this line after build" sowie eine Checkbox. Die Checkbox selektieren und in die Zeile z.B. folgendes eintragen:
test -f procdefs.ld && xmessage "flash now?" && sudo ubw32 -n -r -w "${ImagePath}"
* dieses Beispiel stellt noch einmal sicher, dass eine procdefs.ld zumindest existiert (hoffentlich auch die richtige!), benutzt xmessage (ggf. installieren oder halt weglassen), um noch einmal eine Bestätigung zu holen und ruft dann via sudo das Flashprogramm "ubw32" auf. Wenn das nicht im PATH liegt, muss der Aufruf um den Pfad ergänzt werden. Statt ubw32 funktioniert auch mphidflash.


Fragen und Anregungen zum Flauschball an [[Benutzer: Cyela4t | yela]]
=== Reiner Toolchain+Makefile-Ansatz ===
http://hilses.de/project-template.tar.gz
(Achtung: enthält Linker-Konfiguration für PIC32-PINGUINO-MX220).
 
Benötigt zur Zeit die XC32-Toolchain von Microchip: [http://www.microchip.com/pagehandler/en-us/family/mplabx/#downloads] (dort sind auch die Compiler, u.a. XC32, verfügbar).
 
Beispielprojekt mit Benutzung des Microchip Application Library USB Stacks:
http://hilses.de/project-usb-generic-demo.tar.gz (aktualisiert zuletzt 5.8.2012).
 
Weitere Entwicklung läuft seitens HW jetzt auch in einem Git-Repo:
https://github.com/hwhw/flausch-projects
(bzw. Library für typische Funktionen in https://github.com/hwhw/flauschlib)
 
Die Microchip Application Libraries können hier heruntergeladen werden: [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2680&dDocName=en547784]
 
Die aktuelle Version hat noch einen Bug bei USB im Interrupt-Betrieb in Verbindung mit PIC32MX1xx/2xx - also auch unserem Gerät. Soll der Interrupt-Modus genutzt werden, kann dieser Patch für die Application Libraries verwendet werden:
http://hilses.de/microchip-applibs-usb-hal-pic32-mx1xx2xx-bug.patch.txt
 
Eine Alternative, besonders für Arduinofreunde, ist die Pinguino-IDE. Diese besteht allerdings aus viel schwarzer Magie (geht schon mit dem USB-Bootloader los).
====OS X====
(Gemacht mit OS X 10.8.2 am 26.09.2012)
 
XCode installieren
Aus dem Appstore kostenlos holen
Xcode starten, Einstellungen, Downloads, Command Line Tools auswählen und "install" klicken
 
XC32 Compiler von microchip installieren
http://www.microchip.com/pagehandler/en-us/family/mplabx/#downloads
( Auf "Download MAPLAB X" klicken, dann werden die Downloads per Javascript angezeigt m( )
 
XC32 Tools in den Pfad schreiben
krischan@kernelpanic:~> echo 'export PATH=$PATH:/Applications/microchip/xc32/v1.10/bin/' >> ~/.profile
 
Uploader holen und compilen:
krischan@kernelpanic:~> mkdir pic32
krischan@kernelpanic:~> cd pic32/
krischan@kernelpanic:~/pic32> svn checkout http://mphidflash.googlecode.com/svn/trunk/ mphidflash-read-only
krischan@kernelpanic:~/pic32> cd mphidflash-read-only/
krischan@kernelpanic:~/pic32/mphidflash-read-only> make
gcc -fast -c main.c
gcc -fast -c hex.c
gcc -fast -c usb-osx.c
gcc main.o hex.o usb-osx.o -Wl,-framework,IOKit,-framework,CoreFoundation -o mphidflash
strip mphidflash
krischan@kernelpanic:~/pic32/mphidflash-read-only>
 
=== Toolchain/Makefile für Windows 7 64-Bit ===
 
(Durchgeführt Ende September/Anfang Oktober 2012 durch sg)
 
Eine Unix-ähnliche Shell mit minimalen Gnu-Tools wie make ist von Vorteil. Ich (sg) habe dafür [http://www.mingw.org/wiki/MSYS MSYS] installiert.
 
Den XC32 C/C++ Compiler [http://www.microchip.com/pagehandler/en-us/family/mplabx/#downloads gibt es auch für Windows]. Der Installer trägt einem das bin-Verzeichnis in den Suchpfad ein. Allerdings waren da bei mir störende Anführungszeichen mit drin, die ich manuell über Systemsteuerung>Umgebungsvariablen entfernen musste, damit sich die Compiler auch außerhalb seines bin-Verzeichnisses lief. Die Anführungszeichen haben Windows selbst nicht gestört, aber der Compiler wertet diese Umgebungsvariable scheinbar selbst aus, um seinen Lizenzmanager, der in demselben bin-Verzeichnis liegt, zu starten. Die Fehlermeldung war wenig hilfreich "ProcessCreate schlug fehl" oder so ähnlich.
 
mphidflash zum Flashen des Pics per USB wird praktischerweise schon als Windows Binary [https://code.google.com/p/mphidflash/downloads/list hier] angeboten. Das klappte ohne Probleme bei mir.
 
Das Makefile von hw mit der hier verfügbaren procdefs.ld-Datei ist dann fast ohne Modifikation einsetzbar.
 
Den C++ Compiler habe ich auch zum Laufen bekommen.
 
=== Selbst Hand anlegen (Assembler) ===
 
* Microchip Toolchain installieren (XC32 Compiler)
* [[Pic32_Assembler|hier]] weiterlesen.
 
=== XC32 Optimierungen ===
 
Wir haben herausgefunden, dass XC32 eine "Default"-Kostentabelle für die MIPS32-Befehle verwendet. Das führt leider dazu, dass der Compiler die Kosten von Multiplikationen und Divisionen zu hoch einschätzt. Die M4K-CPU im PIC32MX hat eine schnelle MDU (Multiply-Divide-Unit). Es spielt dann eine Rolle, wenn man mit Compile-Zeit-konstanten Faktoren multiplizieren und auf Geschwindigkeit optimieren will. [[Pic32_Assembler#XC32-GCC_wei.C3.9F_nicht.2C_dass_wir_einen_PIC32_mit_schneller_MDU_haben|Mehr dazu...]]
 
== Flashen ==
Zum Flashen ist zur Zeit mphidflash Mittel der Wahl. Am besten die letzte SVN-Version, da die ohne libhid auskommt (benutzt stattdessen libusb-0.1) und vernünftig mit einfachen Nutzerrechten flashen kann: http://code.google.com/p/mphidflash/source/checkout
 
[https://flauschfunk.de/uart_demo.tgz flauschfunk_uart_demo]
 
Board per USB anschließen. Um den Chip in den USB-Bootloadermodus zu bringen den Button 1 gedrückt halten, dann den Resetbutton kurz drücken und den Button 1 danach loslassen. Nun sollten die rote und die grüne LED beide blinken und das Programm kann raufgeflasht werden:
/usr/local/bin/mphidflash -n -r -w Testfile.hex
 
=== Programmer: Pickit 3 ===
Ein Pickit 3 ist im Space.
 
== ctags ==
ctags_with_dep
xc32-gcc -g -Os -mprocessor=32MX220F032D \
-I. -I../flauschlib "-I/home/alex/devel/pinguino/applibs/Microchip/Include" \
-c "main.c" -M  | sed -e 's/[\\ ]/\n/g' | \
sed -e '/^$/d' -e '/\.o:[ \t]*$/d' | \
ctags -L - --c++-kinds=+p --fields=+iaS --extra=+q
 
== Bootloader ==
[http://ww1.microchip.com/downloads/en/AppNotes/01388B.pdf bootloader]
 
Der mitgelieferte Bootloader ist sehr groß. Zu beachten ist, dass immer die Linker-Konfiguration [[Pic32Procdefs| (procdef.ld)]] in den Projekt-Sourcen sein muss, sonst greift die PIC32MX220F032D-Standard-Konfiguration -- die weiß nichts von einem Bootloader und generiert Code, der den Bootloader-Code überschreiben sollte (was der Bootloader selbst eigentlich verhindern müsste, kann aber mangels tatsächlichem Source-Code nicht überprüft werden). So wie es ausschaut überprüft der Bootloader nicht die Grenzen, es ist also möglich mit einer falschen Linker-Konfiguration den Bootloader zu überschreiben. ''Soll schon vorgekommen sein ;-) ''
 
Der Bootloader scheint ansonsten ein gemäß Microchip AN1388 ([http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en554836]) gestrickter zu sein.
 
Für eigenen Code stehen in KSEG0 (Program Memory) 0x3600 Bytes, das sind 13824 Bytes, zur Verfügung.
 
Im besten Falle sollte uns gelingen, den USB-Stack des Bootloaders zu verwenden, denn mit einem weiteren USB-Stack ist das Program Memory ansonsten voll.
 
Perspektivisch sollte ein Umstieg auf den UART-basierten Bootloader (viel, viel kleiner, benötigt aber 3.3V-Pegel-Interface) erwogen werden.
 
Zum Überprüfen, ob der Bootloader auch nicht überschrieben wird, kann ein
xc32-objdump -S testfile.elf > objdump.txt
gemacht werden. Der erste Block in der Datei sollte so aussehen:
9d004000 <_reset>:
9d004000:  3c1a9d00    lui  k0,0x9d00
9d004004:  275a4010    addiu k0,k0,16400
9d004008:  03400008    jr k0
9d00400c:  00000000    nop
 
== Register ==
Für Neugierige: Nach einem Boot mit dem Pinguino-Bootloader und bei laufender Applikation mit USB-Stack (USB generic client, Interrupt-Handling aktiviert) sieht so der Inhalt der Register aus:
http://hilses.de/pinguino-mx220-registers.html
 
= Allgemeine Snippets =
==General Exception Handler==
 
<source lang="c">
 
//Achtung... Code ist noch "Grausam", aber er funktioniert... ;-)
 
static enum
{
  EXCEP_IRQ = 0,                // interrupt
  EXCEP_AdEL = 4,              // address error exception (load or ifetch)
  EXCEP_AdES,                  // address error exception (store)
  EXCEP_IBE,                    // bus error (ifetch)
  EXCEP_DBE,                    // bus error (load/store)
  EXCEP_Sys,                    // syscall
  EXCEP_Bp,                    // breakpoint
  EXCEP_RI,                    // reserved instruction
  EXCEP_CpU,                    // coprocessor unusable
  EXCEP_Overflow,              // arithmetic overflow
  EXCEP_Trap,                  // trap (possible divide by zero)
  EXCEP_IS1 = 16,              // implementation specfic 1
  EXCEP_CEU,                    // CorExtend Unuseable
  EXCEP_C2E                    // coprocessor 2
} _excep_code;
 
 
  // this function overrides the normal _weak_ generic handler
void
_general_exception_handler (void)
{
  register unsigned int i;
 
  asm volatile ("mfc0 %0,$13":"=r" (_excep_code));
  asm volatile ("mfc0 %0,$14":"=r" (_excep_addr));
 
  _excep_code = (_excep_code & 0x0000007C) >> 2;
 
  unsigned int val = _excep_code;
 
  while (U_STAbits.UTXBF);      // wait when buffer is full
  U_TXREG = 'E';
  while (U_STAbits.UTXBF);      // wait when buffer is full
  U_TXREG = ':';
  for (i = 0; i < 8; i++)
    {
      int bla = ((val & 0xF0000000) >> 28);
      while (U_STAbits.UTXBF);
 
      if (bla > 9)
        U_TXREG = (('A' - 10) + bla);
      else
        U_TXREG = ('0' + bla);
      val <<= 4;
    }
 
  while (U_STAbits.UTXBF);      // wait when buffer is full
  U_TXREG = ' ';
 
  val = _excep_addr;
  for (i = 0; i < 8; i++)
    {
      int bla = ((val & 0xF0000000) >> 28);
      while (U_STAbits.UTXBF);
 
      if (bla > 9)
        U_TXREG = (('A' - 10) + bla);
      else
        U_TXREG = ('0' + bla);
      val <<= 4;
    }
 
  while (U_STAbits.UTXBF);      // wait when buffer is full
  U_TXREG = '\r';
  while (U_STAbits.UTXBF);      // wait when buffer is full
  U_TXREG = '\n';
 
  while (1)
    {
      ;
    }
}
</source>
 
 
eine nette kleine debug Möglichket... Beim druck auf B gibt der  _general_exception_handler() seinen dump aus und weil ??? steht da nicht eine Adresse aus der IRQ Routine sondern die stelle bevor der IRQ aufgerufen wurde
<source lang="c">
 
  __attribute__ ((nomips16, interrupt (ipl2),
                  vector (U_VECTOR))) uart2_interrupt (void)
{
.....
  if (INTGetFlag (INT_SOURCE_UART_RX (UART2)))
    {
 
      if (U2STAbits.URXDA)
        {
          in = U2RXREG;
          if ((char ) in == 'B')
            {
            _general_exception_handler();
            }
           
          ToUART2Fifo_in (in);
.....
</source>
 
== Execute code from Ram ==
 
MainCode
<source lang="c">
..
PF_BYTE *buff = 0xA0001000;
 
 
// Freischalten des Rams für Ausführbaren Code
BMXDKPBA = 0x1000;
BMXDUDBA = 0x2000;
BMXDUPBA = 0x2000;
 
 
..
 
((void (*)()) buff) ();
 
</highlightSyntax>
 
 
RAM-Code
<highlightSyntax language="asm">
 
 
blink.c
 
#include "platform_config.h"
 
#include <peripheral/int.h>
#include <xc.h>
 
void
run ()
{
  char buf[100];
  int i;
  for (i = 0; i < 100; i++)
      buf[i]=i;
  for (i = 0; i < 1000; i++)
    {
      mLED_1_Toggle ();
    }
  while (U_STAbits.UTXBF);      // wait when buffer is full
    U_TXREG = 'R';
  while (U_STAbits.UTXBF);      // wait when buffer is full
    U_TXREG = buf[10];
   
}
 
xmem.ld
/*************************************************************************
* Memory Regions
*
* Memory regions without attributes cannot be used for orphaned sections.
* Only sections specifically assigned to these regions can be allocated
* into these regions.
*************************************************************************/
MEMORY
{
  xmem       (wrx) : ORIGIN = 0xA0001000, LENGTH = 0x1000
}
ENTRY(run)
 
SECTIONS
{
  .text :
  {
    *(.text*)
    *(.rodata*)
  } > xmem
}
 
 
 
#compile
>xc32-gcc -g -Os  -mprocessor=32MX220F032D -I. -I../flauschlib -c "blink.c" -o "blink.o"
#link
>xc32-ld -T xmem.ld -o blink.elf blink.o \
/opt/microchip/xc32/v1.10/pic32mx/lib/proc/32MX220F032D/processor.o
 
 
 
hier kommen noch warnings:
xc32-ld: warning: Sections: .debug_ranges, .debug_pubtypes, and .gnu.attributes should be mapped in the linker script.
xc32-ld:xmem.ld:23: warning: memory region `kseg1_data_mem' not declared
xc32-ld: Warning: kseg1_data_mem memory region not defined, using default range: 0xa0000000 .. 0xa0007fff
xc32-ld:xmem.ld:23: warning: memory region `kseg0_program_mem' not declared
xc32-ld: Warning: kseg0_program_mem memory region not defined, using default range: 0x9d000000 .. 0x9d07ffff
 
aber .elf wird erzeugt
 
#erzeugen des bin files
xc32-objcopy -O binary -j .text blink.elf blink.bin
 
 
# Konsolenbefehl zum Erzeugen dieser Datei:
>xc32-objdump -S blink.elf
 
blink.elf:    file format elf32-tradlittlemips
 
 
 
Disassembly of section .text:
 
a0001000 <run>:
char buf[100];
a0001000: 27bdff98 addiu sp,sp,-104 # Speicherplatz auf dem Stack reservieren durch dekrementieren des Stackpointers (in Byte). Der Stack wächst in negative Richtung. (Das Datensegment wächst in positive Adressrichtung.)
 
for (i = 0; i < 100; i++)
a0001004: 00001021 move v0,zero # v0 = 0
a0001008: 24030064 li v1,100 # Schleifen max = 100
# immediate steht immer für zahlen die direkt geschrieben werden und nicht in irgendeinem Register stehen
a000100c: 03a22021 addu a0,sp,v0  # buf[i] -> a0
 
buf[i]=i;
a0001010: a0820000 sb v0,0(a0) # buf[0] = 0
a0001014: 24420001 addiu v0,v0,1 # i++
a0001018: 1443fffd bne v0,v1,a0001010 <run+0x10> # i < 100
a000101c: 03a22021 addu a0,sp,v0 # Diese Zeile ist NOP
 
a0001020: 240303e8 li v1,1000  # Schleife i = 1000...0
a0001024: 3c02bf88 lui v0,0xbf88 # load upper immediate: v0 = PORTA Adresse upper half word
a0001028: 8c456130 lw a1,24880(v0) # a1 = Wert PORTA
a000102c: 8c446130 lw a0,24880(v0) # a0 = a1
a0001030: 2463ffff addiu v1,v1,-1 # i--
 
# TOGGELN
a0001034: 30a58000 andi a1,a1,0x8000 # a1 = a1 && 0x8000
a0001038: 2ca50001 sltiu a1,a1,1  #set on less than immediate unsigned: a1 < 1, Boolean Resultat in a1 geschrieben.
a000103c: 7ca47bc4 ins a0,a1,0xf,0x1 # insert bit field: a0.lsb = 0xf, a0.msb = 0xf+0x1-1
a0001040: ac446130 sw a0,24880(v0) # store word: v0 offset 24880 byte weiter = a0
# Schleife beenden
a0001044: 1460fff8 bnez v1,a0001028 <run+0x28> # branch not equal zero: v1 != 0 --> sprung
a0001048: 00000000 nop
# 2. LED Toggeln:
a000104c: 3c02bf80 lui v0,0xbf80 # v0 = U_TXBF upper half word Adresse
a0001050: 8c436210 lw v1,25104(v0) # v1 = U_TXBF lower half word Adresse, offset 25104 Bytes
a0001054: 30630200 andi v1,v1,0x200 # v1 = v1 && 0x200
a0001058: 1460fffd bnez v1,a0001050 <run+0x50> # v1 != 0 -> Sprung
a000105c: 3c04bf80 lui a0,0xbf80 # NOP, a0 = upper half word Adresse
 
a0001060: 3c02bf80 lui v0,0xbf80 # v0 = U_TXBF upper half word Adresse
a0001064: 24030052 li v1,82 # v1 = 82 lower half word Adresse
a0001068: ac436220 sw v1,25120(v0) # lower half word Adresse = 82
# Offset von 16 Byte wegen der Spezialregistern
a000106c: 8c836210 lw v1,25104(a0) # v1 = *(a0+25104)
a0001070: 30630200 andi v1,v1,0x200 # v1 = v1 && 0x200
a0001074: 1460fffd bnez v1,a000106c <run+0x6c> # v1 != 0 -> Sprung
a0001078: 83a3000a lb v1,10(sp) # NOP, v1 = buff[10]
 
a000107c: 27bd0068 addiu sp,sp,104 # Speicherplatz auf dem Stack wieder freigeben
a0001080: ac436220 sw v1,25120(v0) # store word:
a0001084: 03e00008 jr ra # Sprung an die Ruecksprungadresse, Unterfunktion beendet
a0001088: 00000000 nop
 
 
Disassembly of section .dinit:
 
9d000000 <.dinit>:
9d000000: 00000000 nop
 
</source>
 
 
== Simple Delay ==
[[Datei:Alex lotta 01 .delay01.jpg|thumb]]
.... aber Achtung Optimierung des Compilers
 
<source lang="c">
static WORD delay_count;
 
while (1)
    {
    delay_count = 3600U;
    mLED_2_On()
    do
      {
      delay_count--;
      mLED_2_On()
      }while(delay_count);
      mLED_2_Off()
    }
 
</source>
 
== Delay with Timer ==
<source lang="c">
void
delay_7us (void)
{
#define DELAYU 1
  T1CON = 0x8030;
  PR1 = 0xffff;
  TMR1 = 0;
  while (TMR1 < DELAYU);
 
 
  return;
}
</source>
 
= Bauteile und Protokolle =
Im Space steht eine Kiste mit Bauteilen, die zum Experimentieren mit dem Pic32 genommen werden dürfen.
 
{|class="wikitable"
! Bauteil || Details || Datenblatt || Img
|-
| PIC32MX220F032D-I/PT
| Microcontroller PIC32 32KB FL 8KBRAM 40MHz USB CTMU 4 DMA
| [http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en556010]
|[[Datei:Alex lotta 01 .IMG 7726.JPG|thumb]]
|-
| MCP73833-AMI/UN
| Batterie Charge Management Controller
| [http://ww1.microchip.com/downloads/en/DeviceDoc/22005a.pdf]
|[[Datei:Alex lota 01 .IMG 7715.JPG|thumb]]
|-
| 47654-0001
| USB-Stecker MICRO USB AB RECPT MID MOUNT ASSY
| [http://www.molex.com/molex/products/datasheet.jsp?part=active/0476540001_IO_CONNECTORS.xml&channel=Products]
|[[Datei:Alex lota 01 .IMG 7720.JPG|thumb]]
|-
| JS202011SCQN
| Schiebeschalter DPDT SMT .3A zum Ein-/Ausschalten
| [http://www.ck-components.com/js/slide,10533,en.html]
|[[Datei:Alex lota 01 .IMG 7721.JPG|thumb]]
|-
| MIKROE-1120
| Akkus&auml;tze LI-POLYMER BATTERY 3.7V 2000mA; Nur zum experimentieren, für Bausatz wahrscheinlich zu teuer.
|
|[[Datei:Alex lota 01 .IMG 7714.JPG|thumb]]
|-
|}
 
<gallery perrow=3 widths=200>
Datei:AlexN900 01 20120712 001.jpg
Datei:Alex lota 01 .IMG 7711.JPG
Datei:Alex lota 01 .IMG 7713.JPG
Datei:AlexN900 01 20120712 002.jpg
Datei:Alex lota 01 .IMG 7719.JPG
Datei:Alex lotta 01 .IMG 7723.JPG
</gallery>
 
== UART ==
[[Datei:AlexN900 01 20120814 001.jpg|thumb]]
* z.B. minicom installieren, dann z.B. minicom -D /dev/ttyUSB0
** ctrl-a z -> dann o drücken -> serial port setup -> Baud einstellen (921600) -> safe setup as dfl
** Der Uart ist nicht fest mit Pins am Gehäuse verbunden
*** Die Register RPC9R und U2RXR geben an an welchen pins was hängt. vegl. [http://ww1.microchip.com/downloads/en/DeviceDoc/61120E.pdf]
 
921600 Baud (in Wirklichkeit ca. 909090 Baud)
 
<source lang="c">
/* Pinguino Hilfe: RPC9 = D1 ; RPC8= D0 */
/* pin config: set up UART2 on RPC9 (TX) / RPC8 (RX) */
RPC9R=2;
U2RXR=6;
 
/* set up UART peripheral: */
U2BRG = 10; // @40MHz PCLK, with BRGH=1: 921600 Baud
U2STA = 0;
U2MODE = 0x8008; // ON, otherwise 8N1, high-speed mode (4x divider)
U2STASET = 0x1400; // RXEN, TXEN
 
/* sending: */
while(U2STAbits.UTXBF); // wait when buffer is full
U2TXREG = 'A';
</source>
 
== SD-Card Interface==
''' SCHD3A0100 Speicherkartenverbinder Slide In-Slide Out Headersmicro SD '''
[http://www.alps.com/WebObjects/catalog.woa/E/HTML/Connector/microSD_Card/SCHD/SCHD3A0100.html Datenblatt]
 
{| class="wikitable"
|+Serial Peripheral Interface Bus|SPI Bus
|-
! Pin !! Name !! I/O !! Description
|-
| 1 || nCS || I || Card Select (Neg True)
|-
| 2 || DI  || I || Data In [MOSI]
|-
| 3 || VSS || S || Ground
|-
| 4 || VDD || S || Power
|-
| 5 || CLK || I || Clock [SCLK]
|-
| 6 || VSS || S || Ground
|-
| 7 || DO  || O  || Data Out [MISO]
|-
| 8 || NC<br/>nIRQ || O || NC (Memory Cards)<br/>Interrupt (SDIO Cards)
|-
| 9 || NC  || . || NC
|}
  /----------------|
/ :1:2:3:4:5:6:7:8|
|9:              |
|                |
 
 
===Anschluss an Pinguino-Board===
 
HW's Lösung: via UEXT-Port. HW hat an seinem Adapter mühsam Pull-Up-Widerstände eingebaut, aber die sind wohl nicht wirklich nötig. Ein Adapter ohne Widerstände funktionierte genauso gut.
 
Anschluss:
 
SD-Card        UEXT
1 CS            10 UEXT CS (hat Pullup-Widerstand auf Pinguino-Board)
2 DI (MOSI)      8 SDO1
3 VSS            2 GND
4 VDD            1 +3.3V
5 CLK            9 SCK1
6 VSS            2 GND
7 DO (MISO)      7 SDI1
8              n.c.
9              n.c.
 
 
===Zeitmessungen===
read  block (512):                    1,3ms -- SD_SPI_BRG = 1
- static PF_BYTE send_cmd() ->            10µs
- static int rcvr_datablock().1 (wait) -> 400µs
-                            .2 (read) -> 870µs
... 10Mhz Clock > 100 ns -> 512*8*100ns -> 400µs
 
 
read  block (512):                    1,3ms -- SD_SPI_BRG = 0
- static PF_BYTE send_cmd() ->            17µs
- static int rcvr_datablock().1 (wait)  -> 600µs
-                            .2 (read)  -> 650µs (*)
... 20Mhz Clock > 50 ns -> 512*8*50ns  -> 200µs (*)
... 20Mhz Clock > 50 ns -> 512*8*50ns*3 -> 600µs (*) (Lücken zwischen Telegrammen vgl. (1))
<gallery widths=300px heights=300px perrow=2 >
Datei:Alex_lotta_01_.2012_09_06_1.JPG | (1) 2 x 8Bit SPI Telegram in einem Block read
Datei:Alex_lotta_01_.2012_09_06_4.JPG | (2) Kannal 1: rcvr_spi_m (led in rcvr_datablock), Kannal 2LED_ON(), LED_OFF()
Datei:Alex_lotta_01_.2012_09_06_5.JPG | (3) Kannal 1: rcvr_spi_m (led in rcvr_datablock), 1x8Bit SPI Telegram
Datei:Alex_lotta_01_.2012_09_06_0.JPG | (4) Kannal 1: rcvr_spi_m , 1x8Bit SPI Telegram ...unsigned char spi_sd_xmit(const unsigned char in) {mLED_1_On );        SD_SPI_BUF = in;        while(!SD_SPI_STATbits.SPIRBF);<br>mLED_1_Off ();        return SD_SPI_BUF;}
Datei:Alex_lotta_01_.2012_09_06_3.JPG | (5) Kannal 1: SendCmd, Kannal 2: rcvr_datablock part 1 (wait)
Datei:Alex_lotta_01_.2012_09_06_2.JPG | (6) Kannal 1: SendCmd, Kannal 2: rcvr_datablock part 2 (read)
</gallery>
 
 
==== SD_SPI_BUF ====
<source lang="c">
                                                // SPICLOCK - > Kannal 1
      mLED_2_On ();                            // LED 2 - > Kannal 2
 
                SD_SPI_BUF = 0xff;
                while(!SD_SPI_STATbits.SPIRBF);
                *buff++ = SD_SPI_BUF;
                SD_SPI_BUF = 0xff;
                while(!SD_SPI_STATbits.SPIRBF);
                *buff++ = SD_SPI_BUF;
                SD_SPI_BUF = 0xff;
                while(!SD_SPI_STATbits.SPIRBF)
                        {
                        mLED_1_On (); mLED_1_Off();    // LED 1 - > R1
                        }
                *buff++ = SD_SPI_BUF;
               
                SD_SPI_BUF = 0xff;
                while(!SD_SPI_STATbits.SPIRBF);
                *buff++ = SD_SPI_BUF;
        mLED_2_Off ();
</source>
<source lang="text">
 
40Mhz - 25ns
 
</source>
 
<gallery widths=300px heights=300px perrow=2>
Datei:Alex_lotta_01_.2012_09_06_17.JPG | ab nun mit Nutzung von SET und CLS für die LED
Datei:Alex_lotta_01_.120906_1702.0.jpg
Datei:Alex_lotta_01_.120906_1702.1.jpg
Datei:Alex_lotta_01_.120906_1702.3.jpg | ohne LED On/Off
Datei:Alex_lotta_01_.120906_1702.2.jpg | mit LED On/Off
</gallery>
510 zu 670 ns
-> 160ns für einmal LED an und aus


== Sound ==
== Sound ==
[[Benutzer:Alex|Alex]] [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2680&dDocName=en554171 stellt fest], dass die Helixbibliothek zum abspielen von MP3s wahrscheinlich nicht auf den Chip passen wird und empfieht [http://verkkokauppa.planeetta.net/epages/Planeetta.sf/en_GB/?ObjectPath=/Shops/vlsi/Products/N0NL304%2CN0NN579%2CN0NN316 diesen MP3 Decoder].
<gallery perrow=3 widths=200>
Datei:Alex lotta 01 .IMG 7734.JPG |'''Speaker'''
Datei:Alex lotta 01 .IMG 7731.JPG |'''Lautsprecherkabel'''
</gallery>
 
[[Benutzer:Alex|Alex]] [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2680&dDocName=en554171 stellt fest (Memory Requirements for PIC32)], dass die Helixbibliothek zum abspielen von MP3s wahrscheinlich nicht auf den Chip passen wird und empfiehlt(*)[http://verkkokauppa.planeetta.net/epages/Planeetta.sf/en_GB/?ObjectPath=/Shops/vlsi/Products/N0NL304%2CN0NN579%2CN0NN316 diesen MP3 Decoder](**).


Aufgrund des hohen Preises des Decoders würde ich zumindest beim Endbausatz eher von MP3 absehen, denn dieser soll möglichst günstig werden.
Aufgrund des hohen Preises des Decoders würde ich zumindest beim Endbausatz eher von MP3 absehen, denn dieser soll möglichst günstig werden.
(*) ich habe den gefunden, noch nie in der Hand gehabt und die Unterlagen nur angelesen--[[Benutzer:Alex|Alex]] 23:43, 11. Jul. 2012 (CEST)
(**) Link down
* [http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATA_BRIEF/DM00039737.pdf ein netter "class d" Verstärker] der ist sicher nicht für den fb... aber kommt aus einer netten Familie(*)
[http://www.st.com/web/en/catalog/sense_power/CL1503 class d Verstärker, leider nur als BGA und so]
(*) Link down
=== PWM - Sound ===
[https://github.com/hwhw/flausch-projects/tree/master/sound hw sein Soundprojekt bei github]
[https://code.google.com/p/audio-pwm/ sg sein Code für Interpolation und Dithering mit Rauschformung]
Hier fehlt noch ein Schaltplan
<gallery perrow=3 widths=200>
Datei:Alex lotta 01 .20120920 21 05.jpg | so schauen die ersten Versuche aus einen Sinus per PWM auszugeben
</gallery>
Eine höhere Abtastrate/Pulsfrequenz schiebt das "Imaging" weiter vom "Audioband" weg, was die Anforderungen für den analogen Tiefpass, den man da noch dranhängen müsste, stark vereinfacht. Eine hohe "Bittiefe" kann man dann noch per Rauschformung reinholen. Ein Rauschformer für 96 kHz sowie ein Interpolator (von 48 kHz nach 96 kHz) ist schon vorhanden, siehe Link.
<gallery perrow=3 widths=200>
Datei:Ohne-rauschformung.png | 8 Bits bei 96 kHz ohne Rauschformung (und 16bits/48kHz darunter zum Vergleich)
</gallery>
<gallery perrow=3 widths=200>
Datei:Mit-rauschformung.png | 8 Bits bei 96 kHz mit Rauschformung (und 16bits/48kHz darunter zum Vergleich)
</gallery>
== Funk ==
<gallery perrow=3 widths=200>
Datei:Alex lotta 01 .IMG 7728.JPG |'''NRF24L01 2.4GHz RF Modul mit Antenne'''
</gallery>
===Einige Seiten mit Unterlagen, Example Code usw. für PIC32 vers. nRF24L01+===
* [http://www.nordicsemi.com/kor/content/download/2726/34069/file/nRF24L01P_Product_Specification_1_0.pdf Das Datenblatt zum nRF24L01]
* [http://hades.mech.northwestern.edu/index.php/PIC32MX:_High-speed_Wireless_Communication mech.northwestern.edu]
* [http://www.sparkfun.com/products/691] Example PIC Code
* [http://microcontrollershop.com/download/nRF24L01_and_LPC_P2148.zip?osCsid=sang0h51gmlrae3d2kg6tcgcu6 Demo Code for bi-directional communication between the MOD-NRF24LR and the LPC-P2148 Prototype Board] Link defekt
* [http://www.mikrocontroller.net/articles/NRF24L01_Tutorial Eine Einleitung]
* [http://www.tinkerer.eu/AVRLib/nRF24L01]
* [https://www.flauschfunk.de/avr_mega48_nRF.tgz alex BeispielCode für AVR atmega48]
[http://ww1.microchip.com/downloads/en/DeviceDoc/61106G.pdf  PIC32 Family Reference Manual, Sect. 23 Serial Peripheral Interface ]
Pinbelegung (BS) nRF24L01+ Modul
**********************
*1|2                *
*3|4    XX      --| *
*5|6    XX      | - *
*7|8            | | *
*        OSC        *
**********************
Testaufbau, Inbetriebnahme: Pinguino und nRF24L01+
{|class="wikitable"
!colspan="6" style="background-color:#6f6fd7;"| nRF24L01+ und PIC32-PINGUINO-MX220 devBoard
|-
! style="width:12em;"|Pin nRF24L01+ || Name || Pin Pinguino || PIC32MX220F032D || direction
|-
| 1 || GND || || || Power
|-
| 2 || Vcc || D4 ||RC4 || Power (um den Chip zu rücksetzen zu können)
|-
| 3 In || CE || D3 || RC3 || <
|-
| 4 In|| CSN || D2 || RC2 || <
|-
| 5 In|| SCK || D13 || RB15 (SCK2) || <
|-
| 6 In || MOSI || D11 ||  RB5 (SDO2) || <
|-
| 7 Out || MISO|| D12|| RB13 (SDI2) || >
|-
| 8 Out || IRQ || || || >
|-
|}
<source lang="c">
// Simple SPI init, work in progress
// SPI2
#define CE  LATCbits.LATC3
#define CSN LATCbits.LATC2
#define CS_LOW()    CSN = 0;
#define CS_HIGH()  CSN = 1;
#define CE_LOW()    CE  = 0;
#define CE_HIGH()  CE  = 1;
TRISBbits.TRISB5 = 0;  // SD02 as output
RPB5R = 4; // SDO2
TRISBbits.TRISB13 = 1; // SDI2 as input
SDI2R = 3; // RPB13;
TRISBbits.TRISB15 = 0; // SCK2 as output  (fixed pin)
ANSELA=0;  // disable all analog inputs
ANSELB=0;
ANSELC=0;
// CS// CE
TRISCbits.TRISC2 = 0; // CSN as output
TRISCbits.TRISC3 = 0; // CE as output
CS_HIGH(); // NO SPI Chip Select
CE_LOW();  // NO Chip Enable Activates RX or TX mode
SPI2CON  = 0;
SPI2CONbits.MSTEN=1;
SPI2BRG  = 1;
SPI2CON2 = 0;
SPI2CONbits.ON=1;  // enable SPI2
while (1)
  {
  SPI2BUF=0xa5;
  for (c = 0; c < 1000000;c++);
  }
</source>
[[Datei:Alex lotta 01 .spi1.jpg]]
<source lang="c">
// Simple SPI init, work in progress
// SPI2
#define CE  LATCbits.LATC3
#define CSN LATCbits.LATC2
#define CS_LOW()    CSN = 0;
#define CS_HIGH()  CSN = 1;
#define CE_LOW()    CE  = 0;
#define CE_HIGH()  CE  = 1;
TRISBbits.TRISB5 = 0;  // SD02 as output
RPB5R = 4; // SDO2
TRISBbits.TRISB13 = 1; // SDI2 as input
SDI2R = 3; // RPB13;
TRISBbits.TRISB15 = 0; // SCK2 as output  (fixed pin)
ANSELA=0;  // disable all analog inputs
ANSELB=0;
ANSELC=0;
// CS// CE
TRISCbits.TRISC2 = 0; // CSN as output
TRISCbits.TRISC3 = 0; // CE as output
CS_HIGH(); // NO SPI Chip Select
CE_LOW();  // NO Chip Enable Activates RX or TX mode
SPI2CON  = 0;
SPI2CONbits.MSTEN=1;
SPI2BRG  = 1;
SPI2CON2 = 0;
SPI2CONbits.ON=1;  // enable SPI2
while (1)
  {
  SPI2BUF=0xa5;
  while(!DataRdySPI2());
  ret=SPI2BUF;
  SPI2BUF=0xa4;
  while(!DataRdySPI2());
  ret=SPI2BUF;
  for (c = 0; c < 1000000;c++);
  }
</source>
[[Datei:Alex lotta 01 .spi2.jpg]]
====Experimente mit SPI und DMA====
<gallery widths=300px heights=300px perrow=2 >
Datei:Alex lotta 01 .20120920 11 03.jpg | mit DMA
Datei:Alex lotta 01 .20120920 11 9.jpg | ohne DMA
Datei:Alex lotta 01 .20120920 11 1.jpg | mit DMA
Datei:Alex lotta 01 .20120920 11 2.jpg | ohne DMA
Datei:Alex lotta 01 .20120920 11 8.jpg | crc16 für 32  byte
</gallery>
Burst Read
* 32*8  = 256 bit 64µS
* ≙ 0,25µS / 4MHz
===Alternative Funk Systeme ===
* [http://de.mouser.com/microchipwifi/?cm_sp=homepage-_-featuredtech-_-Microchip+Technology+MRF24WB0MA+MRF24WB0MB+WiFi+Transceiver+Modules Wifi Module für kleine Systeme € > 20€] wird aber sicher viel billiger ;-)
===Funkprotokollideen===
* [http://code.google.com/p/tiny-fecc/ Tiny FECC] für Forward Error Correction bei Bulk-Datentransfer
== I2C - Accelerometer ==
''' MMA8452QR1 Beschleunigungsmesser LOW G 3-AXIS 12BT EX VLT '''
<gallery perrow=3 widths=200>
Datei:Hardwareporn3.jpg
Datei:Hardwareporn4.jpg
</gallery>
[http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8452Q.pdf Datenblatt]
[http://ww1.microchip.com/downloads/en/DeviceDoc/PIC32_I2C_CodeExample_101911.zip I2C Beispielcode]
== RGB-LED ==
''' common annode '''
<gallery perrow=3 widths=200>
Datei:Alex lotta 01 .IMG 7727.JPG
</gallery>
Die verwendeten RGB-LEDs sind common Anode. Sie haben vier Beinchen, wobei das laengste Bein die Anode ist (+,rot). Schaut man ins Innere einer dieser LEDs, ist zu erkennen, dass sie ein gutes Beispiel dafür ist, dass es Außnahmen dafür gibt, dass der "Kelch" immer am Kathodenbeinchen liegt.
Auf der einen Seite der Anode ist nur ein weiteres Bein, dies ist das Beinchen für rot, an dem ich eine Spannung von 2,3 V für gut befunden habe. Auf der anderen Seite der Anode liegen die Beinchen für grün und blau, wobei das Blaue das Aeußere ist. An beide würde ich eine Spannung von 3,3 V legen.
=Pinguino=
[http://pinguino.cc Pinguino] ist ein an Arduino angelehntes open source Projekt. Eines der Pinguinoboards verwendet genau den Mikrokontroller unseres Begehrens. Wir verwenden die Boards hauptsaechlich unabhaengig von der Pinguinoumgebung als Entwicklungsboards.
Status: 7 Stück dieser [http://www.watterott.com/de/PIC32-PINGUINO-MX220] Boards wurden in der ersten Bestellung geordert. Am 17.09. haben wir 7 weitere Pinguinoboards bestellt.
Zwei der Boards liegen im Space zum experimentieren. Wer eins davon besitzen möchte, kann m0eb 12 Eiros dafür bezahlen.
[http://www.heise.de/hardware-hacks/meldung/IDE-fuer-Arduino-kompatible-PIC-Boards-1570317.html heise über Pinguino]
== PIC32-PINGUINO-MX220 Pinbelegung ==
Leider ist das Board nicht entsprechend der typischen MCU-Pin-Namen beschriftet, sondern in einem Pseudo-Arduino-Stil.
Pinout des MCUs: [http://ww1.microchip.com/downloads/en/devicedoc/61168b.pdf#page=20] (PIC32MX1xx/2xx Family Datasheet)
Tatsächlich hat das Board folgende Pinbelegung:
PIC32 Pinguino MX220
====================
Pin on PCB PIC32 pin
========== =========
(osc) 30: OSC1 (CLKI/RPA2/RA2)
31: OSC2 (CLKO/RPA3/RA3)
USB:
====
(VUSB/+3.3V) 10: VUSB
VBUS (+5V) 42: VBUS
USB D+ 08: PGED2/RPB10/D+/CTED11/RB10
USB D- 09: PGEC2/RPB11/D-/RB11
GND
ID (n.c.)
UEXT:
=====
+3.3V (P1)
GND (P2)
U1TX (P3) 33: SOSCI/RPB4/RB4
U1RX (P4) 34: SOSCO/RPA4/RA4/T1CK/CTED9
SCL1 (P5pu) 44: RPB8/SCL1/CTED10/PMD4/RB8
SDA1 (P6pu) 01: RPB9/SDA1/CTED4/PMD3/RB9
SDI1 (P7) 32: TDO/RPA8/PMA8/RA8
SDO1 (P8) 35: TDI/RPA9/PMA9/RA9
SCK1 (P9) 14: CVREF/AN10/C3INB/RPB14/VBUSON/SCK1/CTED5/RB14
UEXT CS (P10pu) 13: TCK/CTED8/PMA7/RA7
Analog Con2:
============
A0 25: AN6/RPC0/RC0
A1 26: AN7/RPC1/RC1
A2 21: PGED1/AN2/C1IND/C2INB/C3IND/RPB0/PMD0/RB0
A3 22: PGEC1/AN3/C1INC/C2INA/RPB1/CTED12/PMD1/RB1
A4 23: AN4/C1INB/C2IND/RPB2/SDA2/CTED13/PMD2/CNB2/RB2
A5 24: AN5/C1INA/C2INC/RTCC/RPB3/SCL2/PMWR/CNB3/RB3
Digital Con4:
=============
D8 (pu,BTN) 43: RPB7/CTED3/PMD5/INT0/RB7
D9 (LED2[Rot]) 12: TMS/PMA10/RA10
D10 (#SS/PGEC3) 20: PGEC3/VREF-/CVREF-/AN1/RPA1/CTED2/PMD6/RA1
D11 (SDO2) 41: RPB5/USBID/RB5
D12 (SDI2) 11: AN11/RPB13/CTPLS/PMRD/RB13
D13 (SCK2,LED1[Grün]) 15: AN9/C3INA/RPB15/SCK2/CTED6/PMCS1/RB15
GND
AREF/PGED3 19: PGED3/VREF+/CVREF+/AN0/C3INC/RPA0/CTED1/PMD7/RA0
Digital Con5:
=============
D0 (U2RX) 04: RPC8/PMA5/RC8
D1 (U2TX) 05: RPC9/CTED7/PMA6/RC9
D2 27: AN8/RPC2/PMA2/RC2
D3 36: AN12/RPC3/RC3
D4 37: RPC4/PMA4/RC4
D5 38: RPC5/PMA3/RC5
D6 02: RPC6/PMA1/RC6
D7 03: RPC7/PMA0/RC7
ICSP:
=====
1 RESET
2 +3.3V
3 GND
4 AREF/PGED3 19: PGED3/VREF+/CVREF+/AN0/C3INC/RPA0/CTED1/PMD7/RA0
5 D10 (#SS,PGEC3) 20: PGEC3/VREF-/CVREF-/AN1/RPA1/CTED2/PMD6/RA1
6 n.a.
=Projekte=
In diese Sektion kommen die Projekte, die mit dem Pic32 realisiert werden sollen
==Flauschball==
Der [http://quantenbotanik.de/flauschballelektronik Flauschball] soll ein Pic32-Innenleben bekommen.
Eine ausführliche Projektbeschreibung findet ihr auf der [http://quantenbotanik.de/flauschballelektronik Flauschballhomepage].
Fragen und Anregungen zum Flauschball an [[Benutzer: Cyela4t | yela]]
[[Category:Projekte]]

Aktuelle Version vom 11. März 2015, 20:20 Uhr

Struktur Vorschlag für dieses Wiki Media:CCC_Wiki.pdf

Wir experimentieren mit dem Pic32! Genaugenommen mit dem PIC32MX220F032D.

Eine Chronik, welche unsere "Fortschritte" aufzeigt.....

Theorie[Bearbeiten]

under construction

Architektur[Bearbeiten]

Dokumentation des Mikrokontrollers[Bearbeiten]

Tutorials[Bearbeiten]

  • Buch: Pic32 C Programmierung

Weitere Links[Bearbeiten]

Entwicklung[Bearbeiten]

TODO: Beschreibung

Toolchain[Bearbeiten]

IDE: MPLAB X[Bearbeiten]

MPLAB X ist die IDE von Microchip, der passende compiler XC32 muss zusaetzlich installiert werden.

Sehr zu empfehlen ist die Hilfe: Help --> Help Contents (besonders C32 Toolchain). Dort zu finden ist beispielsweise eine schrittweise Anleitung zur Erstellung eines Beispielprojektes und einiges an Codebeispielen zu den verschiedenen Chipfeatures.

In Verbindung mit dem Pinguino-Board ist folgendes zu beachten:

  • die nötige procdefs.ld-Datei muss in das Projektverzeichnis gepackt werden (nicht in ein Unterverzeichnis o.ä.)
  • zum automatischen Flashen bei einem Build kann die Funktion "Execute after Build" benutzt werden. Dazu: In die Eigenschaften des Projekts gehen. Dort den Bereich "Building" wählen. Dort gibt es dann eine Zeile für die Funktion "Execute this line after build" sowie eine Checkbox. Die Checkbox selektieren und in die Zeile z.B. folgendes eintragen:
test -f procdefs.ld && xmessage "flash now?" && sudo ubw32 -n -r -w "${ImagePath}"
  • dieses Beispiel stellt noch einmal sicher, dass eine procdefs.ld zumindest existiert (hoffentlich auch die richtige!), benutzt xmessage (ggf. installieren oder halt weglassen), um noch einmal eine Bestätigung zu holen und ruft dann via sudo das Flashprogramm "ubw32" auf. Wenn das nicht im PATH liegt, muss der Aufruf um den Pfad ergänzt werden. Statt ubw32 funktioniert auch mphidflash.

Reiner Toolchain+Makefile-Ansatz[Bearbeiten]

http://hilses.de/project-template.tar.gz 

(Achtung: enthält Linker-Konfiguration für PIC32-PINGUINO-MX220).

Benötigt zur Zeit die XC32-Toolchain von Microchip: [6] (dort sind auch die Compiler, u.a. XC32, verfügbar).

Beispielprojekt mit Benutzung des Microchip Application Library USB Stacks:

http://hilses.de/project-usb-generic-demo.tar.gz (aktualisiert zuletzt 5.8.2012). 

Weitere Entwicklung läuft seitens HW jetzt auch in einem Git-Repo:

https://github.com/hwhw/flausch-projects 

(bzw. Library für typische Funktionen in https://github.com/hwhw/flauschlib)

Die Microchip Application Libraries können hier heruntergeladen werden: [7]

Die aktuelle Version hat noch einen Bug bei USB im Interrupt-Betrieb in Verbindung mit PIC32MX1xx/2xx - also auch unserem Gerät. Soll der Interrupt-Modus genutzt werden, kann dieser Patch für die Application Libraries verwendet werden:

http://hilses.de/microchip-applibs-usb-hal-pic32-mx1xx2xx-bug.patch.txt

Eine Alternative, besonders für Arduinofreunde, ist die Pinguino-IDE. Diese besteht allerdings aus viel schwarzer Magie (geht schon mit dem USB-Bootloader los).

OS X[Bearbeiten]

(Gemacht mit OS X 10.8.2 am 26.09.2012)

XCode installieren

Aus dem Appstore kostenlos holen
Xcode starten, Einstellungen, Downloads, Command Line Tools auswählen und "install" klicken

XC32 Compiler von microchip installieren

http://www.microchip.com/pagehandler/en-us/family/mplabx/#downloads
( Auf "Download MAPLAB X" klicken, dann werden die Downloads per Javascript angezeigt m( )

XC32 Tools in den Pfad schreiben

krischan@kernelpanic:~> echo 'export PATH=$PATH:/Applications/microchip/xc32/v1.10/bin/' >> ~/.profile

Uploader holen und compilen:

krischan@kernelpanic:~> mkdir pic32
krischan@kernelpanic:~> cd pic32/
krischan@kernelpanic:~/pic32> svn checkout http://mphidflash.googlecode.com/svn/trunk/ mphidflash-read-only
krischan@kernelpanic:~/pic32> cd mphidflash-read-only/
krischan@kernelpanic:~/pic32/mphidflash-read-only> make
gcc -fast -c main.c
gcc -fast -c hex.c
gcc -fast -c usb-osx.c
gcc main.o hex.o usb-osx.o -Wl,-framework,IOKit,-framework,CoreFoundation -o mphidflash
strip mphidflash
krischan@kernelpanic:~/pic32/mphidflash-read-only>

Toolchain/Makefile für Windows 7 64-Bit[Bearbeiten]

(Durchgeführt Ende September/Anfang Oktober 2012 durch sg)

Eine Unix-ähnliche Shell mit minimalen Gnu-Tools wie make ist von Vorteil. Ich (sg) habe dafür MSYS installiert.

Den XC32 C/C++ Compiler gibt es auch für Windows. Der Installer trägt einem das bin-Verzeichnis in den Suchpfad ein. Allerdings waren da bei mir störende Anführungszeichen mit drin, die ich manuell über Systemsteuerung>Umgebungsvariablen entfernen musste, damit sich die Compiler auch außerhalb seines bin-Verzeichnisses lief. Die Anführungszeichen haben Windows selbst nicht gestört, aber der Compiler wertet diese Umgebungsvariable scheinbar selbst aus, um seinen Lizenzmanager, der in demselben bin-Verzeichnis liegt, zu starten. Die Fehlermeldung war wenig hilfreich "ProcessCreate schlug fehl" oder so ähnlich.

mphidflash zum Flashen des Pics per USB wird praktischerweise schon als Windows Binary hier angeboten. Das klappte ohne Probleme bei mir.

Das Makefile von hw mit der hier verfügbaren procdefs.ld-Datei ist dann fast ohne Modifikation einsetzbar.

Den C++ Compiler habe ich auch zum Laufen bekommen.

Selbst Hand anlegen (Assembler)[Bearbeiten]

  • Microchip Toolchain installieren (XC32 Compiler)
  • hier weiterlesen.

XC32 Optimierungen[Bearbeiten]

Wir haben herausgefunden, dass XC32 eine "Default"-Kostentabelle für die MIPS32-Befehle verwendet. Das führt leider dazu, dass der Compiler die Kosten von Multiplikationen und Divisionen zu hoch einschätzt. Die M4K-CPU im PIC32MX hat eine schnelle MDU (Multiply-Divide-Unit). Es spielt dann eine Rolle, wenn man mit Compile-Zeit-konstanten Faktoren multiplizieren und auf Geschwindigkeit optimieren will. Mehr dazu...

Flashen[Bearbeiten]

Zum Flashen ist zur Zeit mphidflash Mittel der Wahl. Am besten die letzte SVN-Version, da die ohne libhid auskommt (benutzt stattdessen libusb-0.1) und vernünftig mit einfachen Nutzerrechten flashen kann: http://code.google.com/p/mphidflash/source/checkout

flauschfunk_uart_demo

Board per USB anschließen. Um den Chip in den USB-Bootloadermodus zu bringen den Button 1 gedrückt halten, dann den Resetbutton kurz drücken und den Button 1 danach loslassen. Nun sollten die rote und die grüne LED beide blinken und das Programm kann raufgeflasht werden:

/usr/local/bin/mphidflash -n -r -w Testfile.hex

Programmer: Pickit 3[Bearbeiten]

Ein Pickit 3 ist im Space.

ctags[Bearbeiten]

ctags_with_dep

xc32-gcc -g -Os -mprocessor=32MX220F032D \
-I. -I../flauschlib "-I/home/alex/devel/pinguino/applibs/Microchip/Include" \
-c "main.c" -M  | sed -e 's/[\\ ]/\n/g' | \
sed -e '/^$/d' -e '/\.o:[ \t]*$/d' | \ 
ctags -L - --c++-kinds=+p --fields=+iaS --extra=+q

Bootloader[Bearbeiten]

bootloader

Der mitgelieferte Bootloader ist sehr groß. Zu beachten ist, dass immer die Linker-Konfiguration (procdef.ld) in den Projekt-Sourcen sein muss, sonst greift die PIC32MX220F032D-Standard-Konfiguration -- die weiß nichts von einem Bootloader und generiert Code, der den Bootloader-Code überschreiben sollte (was der Bootloader selbst eigentlich verhindern müsste, kann aber mangels tatsächlichem Source-Code nicht überprüft werden). So wie es ausschaut überprüft der Bootloader nicht die Grenzen, es ist also möglich mit einer falschen Linker-Konfiguration den Bootloader zu überschreiben. Soll schon vorgekommen sein ;-)

Der Bootloader scheint ansonsten ein gemäß Microchip AN1388 ([8]) gestrickter zu sein.

Für eigenen Code stehen in KSEG0 (Program Memory) 0x3600 Bytes, das sind 13824 Bytes, zur Verfügung.

Im besten Falle sollte uns gelingen, den USB-Stack des Bootloaders zu verwenden, denn mit einem weiteren USB-Stack ist das Program Memory ansonsten voll.

Perspektivisch sollte ein Umstieg auf den UART-basierten Bootloader (viel, viel kleiner, benötigt aber 3.3V-Pegel-Interface) erwogen werden.

Zum Überprüfen, ob der Bootloader auch nicht überschrieben wird, kann ein

xc32-objdump -S testfile.elf > objdump.txt

gemacht werden. Der erste Block in der Datei sollte so aussehen:

9d004000 <_reset>:
9d004000:   3c1a9d00    lui   k0,0x9d00
9d004004:   275a4010    addiu k0,k0,16400
9d004008:   03400008    jr k0
9d00400c:   00000000    nop

Register[Bearbeiten]

Für Neugierige: Nach einem Boot mit dem Pinguino-Bootloader und bei laufender Applikation mit USB-Stack (USB generic client, Interrupt-Handling aktiviert) sieht so der Inhalt der Register aus:

http://hilses.de/pinguino-mx220-registers.html

Allgemeine Snippets[Bearbeiten]

General Exception Handler[Bearbeiten]

<source lang="c">

//Achtung... Code ist noch "Grausam", aber er funktioniert... ;-)

static enum {

 EXCEP_IRQ = 0,                // interrupt
 EXCEP_AdEL = 4,               // address error exception (load or ifetch)
 EXCEP_AdES,                   // address error exception (store)
 EXCEP_IBE,                    // bus error (ifetch)
 EXCEP_DBE,                    // bus error (load/store)
 EXCEP_Sys,                    // syscall
 EXCEP_Bp,                     // breakpoint
 EXCEP_RI,                     // reserved instruction
 EXCEP_CpU,                    // coprocessor unusable
 EXCEP_Overflow,               // arithmetic overflow
 EXCEP_Trap,                   // trap (possible divide by zero)
 EXCEP_IS1 = 16,               // implementation specfic 1
 EXCEP_CEU,                    // CorExtend Unuseable
 EXCEP_C2E                     // coprocessor 2

} _excep_code;


 // this function overrides the normal _weak_ generic handler

void _general_exception_handler (void) {

 register unsigned int i;
 asm volatile ("mfc0 %0,$13":"=r" (_excep_code));
 asm volatile ("mfc0 %0,$14":"=r" (_excep_addr));
 _excep_code = (_excep_code & 0x0000007C) >> 2;
 unsigned int val = _excep_code;
 while (U_STAbits.UTXBF);      // wait when buffer is full
 U_TXREG = 'E';
 while (U_STAbits.UTXBF);      // wait when buffer is full
 U_TXREG = ':';
 for (i = 0; i < 8; i++)
   {
     int bla = ((val & 0xF0000000) >> 28);
     while (U_STAbits.UTXBF);
     if (bla > 9)
       U_TXREG = (('A' - 10) + bla);
     else
       U_TXREG = ('0' + bla);
     val <<= 4;
   }
 while (U_STAbits.UTXBF);      // wait when buffer is full
 U_TXREG = ' ';
 val = _excep_addr;
 for (i = 0; i < 8; i++)
   {
     int bla = ((val & 0xF0000000) >> 28);
     while (U_STAbits.UTXBF);
     if (bla > 9)
       U_TXREG = (('A' - 10) + bla);
     else
       U_TXREG = ('0' + bla);
     val <<= 4;
   }
 while (U_STAbits.UTXBF);      // wait when buffer is full
 U_TXREG = '\r';
 while (U_STAbits.UTXBF);      // wait when buffer is full
 U_TXREG = '\n';
 while (1)
   {
     ;
   }

} </source>


eine nette kleine debug Möglichket... Beim druck auf B gibt der _general_exception_handler() seinen dump aus und weil ??? steht da nicht eine Adresse aus der IRQ Routine sondern die stelle bevor der IRQ aufgerufen wurde

<source lang="c">

 __attribute__ ((nomips16, interrupt (ipl2),
                 vector (U_VECTOR))) uart2_interrupt (void)

{ .....

 if (INTGetFlag (INT_SOURCE_UART_RX (UART2)))
   {
     if (U2STAbits.URXDA)
       {
         in = U2RXREG;
         if ((char ) in == 'B')
           {
           _general_exception_handler();
           }
           
         ToUART2Fifo_in (in);

..... </source>

Execute code from Ram[Bearbeiten]

MainCode <source lang="c"> .. PF_BYTE *buff = 0xA0001000;


// Freischalten des Rams für Ausführbaren Code BMXDKPBA = 0x1000; BMXDUDBA = 0x2000; BMXDUPBA = 0x2000;


..

((void (*)()) buff) ();

</highlightSyntax>


RAM-Code <highlightSyntax language="asm">


blink.c

  1. include "platform_config.h"
  1. include <peripheral/int.h>
  2. include <xc.h>

void run () {

 char buf[100];
 int i;
 for (i = 0; i < 100; i++)
     buf[i]=i;
 for (i = 0; i < 1000; i++)
   {
     mLED_1_Toggle ();
   }
 while (U_STAbits.UTXBF);      // wait when buffer is full
   U_TXREG = 'R';
 while (U_STAbits.UTXBF);      // wait when buffer is full
   U_TXREG = buf[10];
    

}

xmem.ld /*************************************************************************

* Memory Regions
*
* Memory regions without attributes cannot be used for orphaned sections.
* Only sections specifically assigned to these regions can be allocated
* into these regions.
*************************************************************************/

MEMORY {

 xmem		       (wrx) : ORIGIN = 0xA0001000, LENGTH = 0x1000

} ENTRY(run)

SECTIONS {

 .text :
 {
   *(.text*)
   *(.rodata*)
 } > xmem

}


  1. compile

>xc32-gcc -g -Os -mprocessor=32MX220F032D -I. -I../flauschlib -c "blink.c" -o "blink.o"

  1. link

>xc32-ld -T xmem.ld -o blink.elf blink.o \

/opt/microchip/xc32/v1.10/pic32mx/lib/proc/32MX220F032D/processor.o


hier kommen noch warnings: xc32-ld: warning: Sections: .debug_ranges, .debug_pubtypes, and .gnu.attributes should be mapped in the linker script. xc32-ld:xmem.ld:23: warning: memory region `kseg1_data_mem' not declared xc32-ld: Warning: kseg1_data_mem memory region not defined, using default range: 0xa0000000 .. 0xa0007fff xc32-ld:xmem.ld:23: warning: memory region `kseg0_program_mem' not declared xc32-ld: Warning: kseg0_program_mem memory region not defined, using default range: 0x9d000000 .. 0x9d07ffff

aber .elf wird erzeugt

  1. erzeugen des bin files

xc32-objcopy -O binary -j .text blink.elf blink.bin


  1. Konsolenbefehl zum Erzeugen dieser Datei:

>xc32-objdump -S blink.elf

blink.elf: file format elf32-tradlittlemips


Disassembly of section .text:

a0001000 <run>: char buf[100]; a0001000: 27bdff98 addiu sp,sp,-104 # Speicherplatz auf dem Stack reservieren durch dekrementieren des Stackpointers (in Byte). Der Stack wächst in negative Richtung. (Das Datensegment wächst in positive Adressrichtung.)

for (i = 0; i < 100; i++) a0001004: 00001021 move v0,zero # v0 = 0 a0001008: 24030064 li v1,100 # Schleifen max = 100

  1. immediate steht immer für zahlen die direkt geschrieben werden und nicht in irgendeinem Register stehen

a000100c: 03a22021 addu a0,sp,v0 # buf[i] -> a0

buf[i]=i; a0001010: a0820000 sb v0,0(a0) # buf[0] = 0 a0001014: 24420001 addiu v0,v0,1 # i++ a0001018: 1443fffd bne v0,v1,a0001010 <run+0x10> # i < 100 a000101c: 03a22021 addu a0,sp,v0 # Diese Zeile ist NOP

a0001020: 240303e8 li v1,1000 # Schleife i = 1000...0 a0001024: 3c02bf88 lui v0,0xbf88 # load upper immediate: v0 = PORTA Adresse upper half word a0001028: 8c456130 lw a1,24880(v0) # a1 = Wert PORTA a000102c: 8c446130 lw a0,24880(v0) # a0 = a1 a0001030: 2463ffff addiu v1,v1,-1 # i--

  1. TOGGELN

a0001034: 30a58000 andi a1,a1,0x8000 # a1 = a1 && 0x8000 a0001038: 2ca50001 sltiu a1,a1,1 #set on less than immediate unsigned: a1 < 1, Boolean Resultat in a1 geschrieben. a000103c: 7ca47bc4 ins a0,a1,0xf,0x1 # insert bit field: a0.lsb = 0xf, a0.msb = 0xf+0x1-1 a0001040: ac446130 sw a0,24880(v0) # store word: v0 offset 24880 byte weiter = a0

  1. Schleife beenden

a0001044: 1460fff8 bnez v1,a0001028 <run+0x28> # branch not equal zero: v1 != 0 --> sprung a0001048: 00000000 nop

  1. 2. LED Toggeln:

a000104c: 3c02bf80 lui v0,0xbf80 # v0 = U_TXBF upper half word Adresse a0001050: 8c436210 lw v1,25104(v0) # v1 = U_TXBF lower half word Adresse, offset 25104 Bytes a0001054: 30630200 andi v1,v1,0x200 # v1 = v1 && 0x200 a0001058: 1460fffd bnez v1,a0001050 <run+0x50> # v1 != 0 -> Sprung a000105c: 3c04bf80 lui a0,0xbf80 # NOP, a0 = upper half word Adresse

a0001060: 3c02bf80 lui v0,0xbf80 # v0 = U_TXBF upper half word Adresse a0001064: 24030052 li v1,82 # v1 = 82 lower half word Adresse a0001068: ac436220 sw v1,25120(v0) # lower half word Adresse = 82

  1. Offset von 16 Byte wegen der Spezialregistern

a000106c: 8c836210 lw v1,25104(a0) # v1 = *(a0+25104) a0001070: 30630200 andi v1,v1,0x200 # v1 = v1 && 0x200 a0001074: 1460fffd bnez v1,a000106c <run+0x6c> # v1 != 0 -> Sprung a0001078: 83a3000a lb v1,10(sp) # NOP, v1 = buff[10]

a000107c: 27bd0068 addiu sp,sp,104 # Speicherplatz auf dem Stack wieder freigeben a0001080: ac436220 sw v1,25120(v0) # store word: a0001084: 03e00008 jr ra # Sprung an die Ruecksprungadresse, Unterfunktion beendet a0001088: 00000000 nop


Disassembly of section .dinit:

9d000000 <.dinit>: 9d000000: 00000000 nop

</source>


Simple Delay[Bearbeiten]

.... aber Achtung Optimierung des Compilers

<source lang="c"> static WORD delay_count;

while (1)
   {
   delay_count = 3600U;
   mLED_2_On()
   do 
     {
     delay_count--;
      mLED_2_On()
     }while(delay_count);
     mLED_2_Off()
   }

</source>

Delay with Timer[Bearbeiten]

<source lang="c"> void delay_7us (void) {

  1. define DELAYU 1
 T1CON = 0x8030;
 PR1 = 0xffff;
 TMR1 = 0;
 while (TMR1 < DELAYU);


 return;

} </source>

Bauteile und Protokolle[Bearbeiten]

Im Space steht eine Kiste mit Bauteilen, die zum Experimentieren mit dem Pic32 genommen werden dürfen.

Bauteil Details Datenblatt Img
PIC32MX220F032D-I/PT Microcontroller PIC32 32KB FL 8KBRAM 40MHz USB CTMU 4 DMA [9]
MCP73833-AMI/UN Batterie Charge Management Controller [10]
47654-0001 USB-Stecker MICRO USB AB RECPT MID MOUNT ASSY [11]
JS202011SCQN Schiebeschalter DPDT SMT .3A zum Ein-/Ausschalten [12]
MIKROE-1120 Akkusätze LI-POLYMER BATTERY 3.7V 2000mA; Nur zum experimentieren, für Bausatz wahrscheinlich zu teuer.

UART[Bearbeiten]

  • z.B. minicom installieren, dann z.B. minicom -D /dev/ttyUSB0
    • ctrl-a z -> dann o drücken -> serial port setup -> Baud einstellen (921600) -> safe setup as dfl
    • Der Uart ist nicht fest mit Pins am Gehäuse verbunden
      • Die Register RPC9R und U2RXR geben an an welchen pins was hängt. vegl. [13]

921600 Baud (in Wirklichkeit ca. 909090 Baud)

<source lang="c"> /* Pinguino Hilfe: RPC9 = D1 ; RPC8= D0 */ /* pin config: set up UART2 on RPC9 (TX) / RPC8 (RX) */ RPC9R=2; U2RXR=6;

/* set up UART peripheral: */ U2BRG = 10; // @40MHz PCLK, with BRGH=1: 921600 Baud U2STA = 0; U2MODE = 0x8008; // ON, otherwise 8N1, high-speed mode (4x divider) U2STASET = 0x1400; // RXEN, TXEN

/* sending: */ while(U2STAbits.UTXBF); // wait when buffer is full U2TXREG = 'A'; </source>

SD-Card Interface[Bearbeiten]

SCHD3A0100 Speicherkartenverbinder Slide In-Slide Out Headersmicro SD Datenblatt

SPI Bus
Pin Name I/O Description
1 nCS I Card Select (Neg True)
2 DI I Data In [MOSI]
3 VSS S Ground
4 VDD S Power
5 CLK I Clock [SCLK]
6 VSS S Ground
7 DO O Data Out [MISO]
8 NC
nIRQ
O NC (Memory Cards)
Interrupt (SDIO Cards)
9 NC . NC
 /----------------|
/ :1:2:3:4:5:6:7:8|
|9:               |
|                 |


Anschluss an Pinguino-Board[Bearbeiten]

HW's Lösung: via UEXT-Port. HW hat an seinem Adapter mühsam Pull-Up-Widerstände eingebaut, aber die sind wohl nicht wirklich nötig. Ein Adapter ohne Widerstände funktionierte genauso gut.

Anschluss:

SD-Card         UEXT
1 CS            10 UEXT CS (hat Pullup-Widerstand auf Pinguino-Board)
2 DI (MOSI)      8 SDO1
3 VSS            2 GND
4 VDD            1 +3.3V
5 CLK            9 SCK1
6 VSS            2 GND
7 DO (MISO)      7 SDI1
8               n.c.
9               n.c.


Zeitmessungen[Bearbeiten]

read  block (512):                     1,3ms -- SD_SPI_BRG = 1
- static PF_BYTE send_cmd() ->             10µs
- static int rcvr_datablock().1 (wait) -> 400µs
-                            .2 (read) -> 870µs
... 10Mhz Clock > 100 ns -> 512*8*100ns -> 400µs


read  block (512):                     1,3ms -- SD_SPI_BRG = 0
- static PF_BYTE send_cmd() ->             17µs
- static int rcvr_datablock().1 (wait)  -> 600µs
-                            .2 (read)  -> 650µs (*)
... 20Mhz Clock > 50 ns -> 512*8*50ns   -> 200µs (*)
... 20Mhz Clock > 50 ns -> 512*8*50ns*3 -> 600µs (*) (Lücken zwischen Telegrammen vgl. (1))


SD_SPI_BUF[Bearbeiten]

<source lang="c">

                                               // SPICLOCK - > Kannal 1
     mLED_2_On ();                             // LED 2 - > Kannal 2 
               SD_SPI_BUF = 0xff;
               while(!SD_SPI_STATbits.SPIRBF);
               *buff++ = SD_SPI_BUF;

               SD_SPI_BUF = 0xff;
               while(!SD_SPI_STATbits.SPIRBF);
               *buff++ = SD_SPI_BUF;

               SD_SPI_BUF = 0xff;
               while(!SD_SPI_STATbits.SPIRBF)
                       {
                       mLED_1_On (); mLED_1_Off();    // LED 1 - > R1
                       }
               *buff++ = SD_SPI_BUF;
               
               SD_SPI_BUF = 0xff;
               while(!SD_SPI_STATbits.SPIRBF);
               *buff++ = SD_SPI_BUF;
       mLED_2_Off ();

</source> <source lang="text">

40Mhz - 25ns

</source>

510 zu 670 ns -> 160ns für einmal LED an und aus

Sound[Bearbeiten]

Alex stellt fest (Memory Requirements for PIC32), dass die Helixbibliothek zum abspielen von MP3s wahrscheinlich nicht auf den Chip passen wird und empfiehlt(*)diesen MP3 Decoder(**).

Aufgrund des hohen Preises des Decoders würde ich zumindest beim Endbausatz eher von MP3 absehen, denn dieser soll möglichst günstig werden.


(*) ich habe den gefunden, noch nie in der Hand gehabt und die Unterlagen nur angelesen--Alex 23:43, 11. Jul. 2012 (CEST)

(**) Link down

class d Verstärker, leider nur als BGA und so


(*) Link down



PWM - Sound[Bearbeiten]

hw sein Soundprojekt bei github

sg sein Code für Interpolation und Dithering mit Rauschformung

Hier fehlt noch ein Schaltplan

Eine höhere Abtastrate/Pulsfrequenz schiebt das "Imaging" weiter vom "Audioband" weg, was die Anforderungen für den analogen Tiefpass, den man da noch dranhängen müsste, stark vereinfacht. Eine hohe "Bittiefe" kann man dann noch per Rauschformung reinholen. Ein Rauschformer für 96 kHz sowie ein Interpolator (von 48 kHz nach 96 kHz) ist schon vorhanden, siehe Link.

Funk[Bearbeiten]

Einige Seiten mit Unterlagen, Example Code usw. für PIC32 vers. nRF24L01+[Bearbeiten]


PIC32 Family Reference Manual, Sect. 23 Serial Peripheral Interface

Pinbelegung (BS) nRF24L01+ Modul
**********************
*1|2                 *
*3|4     XX      --| *
*5|6     XX      | - *
*7|8             | | *
*        OSC         *
**********************


Testaufbau, Inbetriebnahme: Pinguino und nRF24L01+

nRF24L01+ und PIC32-PINGUINO-MX220 devBoard
Pin nRF24L01+ Name Pin Pinguino PIC32MX220F032D direction
1 GND Power
2 Vcc D4 RC4 Power (um den Chip zu rücksetzen zu können)
3 In CE D3 RC3 <
4 In CSN D2 RC2 <
5 In SCK D13 RB15 (SCK2) <
6 In MOSI D11 RB5 (SDO2) <
7 Out MISO D12 RB13 (SDI2) >
8 Out IRQ >


<source lang="c">

// Simple SPI init, work in progress

// SPI2

  1. define CE LATCbits.LATC3
  2. define CSN LATCbits.LATC2
  1. define CS_LOW() CSN = 0;
  2. define CS_HIGH() CSN = 1;
  3. define CE_LOW() CE = 0;
  4. define CE_HIGH() CE = 1;


TRISBbits.TRISB5 = 0; // SD02 as output RPB5R = 4; // SDO2

TRISBbits.TRISB13 = 1; // SDI2 as input SDI2R = 3; // RPB13;

TRISBbits.TRISB15 = 0; // SCK2 as output (fixed pin) ANSELA=0; // disable all analog inputs ANSELB=0; ANSELC=0;

// CS// CE TRISCbits.TRISC2 = 0; // CSN as output TRISCbits.TRISC3 = 0; // CE as output

CS_HIGH(); // NO SPI Chip Select CE_LOW(); // NO Chip Enable Activates RX or TX mode

SPI2CON = 0; SPI2CONbits.MSTEN=1; SPI2BRG = 1; SPI2CON2 = 0; SPI2CONbits.ON=1; // enable SPI2


while (1)

 {
 SPI2BUF=0xa5;
 for (c = 0; c < 1000000;c++);
 }

</source>



<source lang="c"> // Simple SPI init, work in progress

// SPI2

  1. define CE LATCbits.LATC3
  2. define CSN LATCbits.LATC2
  1. define CS_LOW() CSN = 0;
  2. define CS_HIGH() CSN = 1;
  3. define CE_LOW() CE = 0;
  4. define CE_HIGH() CE = 1;


TRISBbits.TRISB5 = 0; // SD02 as output RPB5R = 4; // SDO2

TRISBbits.TRISB13 = 1; // SDI2 as input SDI2R = 3; // RPB13;

TRISBbits.TRISB15 = 0; // SCK2 as output (fixed pin) ANSELA=0; // disable all analog inputs ANSELB=0; ANSELC=0;

// CS// CE TRISCbits.TRISC2 = 0; // CSN as output TRISCbits.TRISC3 = 0; // CE as output

CS_HIGH(); // NO SPI Chip Select CE_LOW(); // NO Chip Enable Activates RX or TX mode

SPI2CON = 0; SPI2CONbits.MSTEN=1; SPI2BRG = 1; SPI2CON2 = 0; SPI2CONbits.ON=1; // enable SPI2


while (1)

 {
 SPI2BUF=0xa5;
 while(!DataRdySPI2());
 ret=SPI2BUF;
 SPI2BUF=0xa4;
 while(!DataRdySPI2());
 ret=SPI2BUF;


 for (c = 0; c < 1000000;c++);
 }

</source>


Experimente mit SPI und DMA[Bearbeiten]


Burst Read

  • 32*8 = 256 bit 64µS
  • ≙ 0,25µS / 4MHz

Alternative Funk Systeme[Bearbeiten]

Funkprotokollideen[Bearbeiten]

  • Tiny FECC für Forward Error Correction bei Bulk-Datentransfer

I2C - Accelerometer[Bearbeiten]

MMA8452QR1 Beschleunigungsmesser LOW G 3-AXIS 12BT EX VLT

Datenblatt

I2C Beispielcode

RGB-LED[Bearbeiten]

common annode

Die verwendeten RGB-LEDs sind common Anode. Sie haben vier Beinchen, wobei das laengste Bein die Anode ist (+,rot). Schaut man ins Innere einer dieser LEDs, ist zu erkennen, dass sie ein gutes Beispiel dafür ist, dass es Außnahmen dafür gibt, dass der "Kelch" immer am Kathodenbeinchen liegt.

Auf der einen Seite der Anode ist nur ein weiteres Bein, dies ist das Beinchen für rot, an dem ich eine Spannung von 2,3 V für gut befunden habe. Auf der anderen Seite der Anode liegen die Beinchen für grün und blau, wobei das Blaue das Aeußere ist. An beide würde ich eine Spannung von 3,3 V legen.

Pinguino[Bearbeiten]

Pinguino ist ein an Arduino angelehntes open source Projekt. Eines der Pinguinoboards verwendet genau den Mikrokontroller unseres Begehrens. Wir verwenden die Boards hauptsaechlich unabhaengig von der Pinguinoumgebung als Entwicklungsboards.

Status: 7 Stück dieser [16] Boards wurden in der ersten Bestellung geordert. Am 17.09. haben wir 7 weitere Pinguinoboards bestellt.

Zwei der Boards liegen im Space zum experimentieren. Wer eins davon besitzen möchte, kann m0eb 12 Eiros dafür bezahlen.

heise über Pinguino

PIC32-PINGUINO-MX220 Pinbelegung[Bearbeiten]

Leider ist das Board nicht entsprechend der typischen MCU-Pin-Namen beschriftet, sondern in einem Pseudo-Arduino-Stil. Pinout des MCUs: [17] (PIC32MX1xx/2xx Family Datasheet) Tatsächlich hat das Board folgende Pinbelegung:

PIC32 Pinguino MX220
====================

Pin on PCB		PIC32 pin
==========		=========

(osc)			30: OSC1 (CLKI/RPA2/RA2)
			31: OSC2 (CLKO/RPA3/RA3)


USB:
====

(VUSB/+3.3V)		10: VUSB
VBUS (+5V)		42: VBUS
USB D+			08: PGED2/RPB10/D+/CTED11/RB10
USB D-			09: PGEC2/RPB11/D-/RB11
GND
ID (n.c.)


UEXT:
=====

+3.3V (P1)
GND (P2)
U1TX (P3)		33: SOSCI/RPB4/RB4
U1RX (P4)		34: SOSCO/RPA4/RA4/T1CK/CTED9
SCL1 (P5pu)		44: RPB8/SCL1/CTED10/PMD4/RB8
SDA1 (P6pu)		01: RPB9/SDA1/CTED4/PMD3/RB9
SDI1 (P7)		32: TDO/RPA8/PMA8/RA8
SDO1 (P8)		35: TDI/RPA9/PMA9/RA9
SCK1 (P9)		14: CVREF/AN10/C3INB/RPB14/VBUSON/SCK1/CTED5/RB14
UEXT CS (P10pu)		13: TCK/CTED8/PMA7/RA7


Analog Con2:
============

A0			25: AN6/RPC0/RC0
A1			26: AN7/RPC1/RC1
A2			21: PGED1/AN2/C1IND/C2INB/C3IND/RPB0/PMD0/RB0
A3			22: PGEC1/AN3/C1INC/C2INA/RPB1/CTED12/PMD1/RB1
A4			23: AN4/C1INB/C2IND/RPB2/SDA2/CTED13/PMD2/CNB2/RB2
A5			24: AN5/C1INA/C2INC/RTCC/RPB3/SCL2/PMWR/CNB3/RB3


Digital Con4:
=============

D8 (pu,BTN)		43: RPB7/CTED3/PMD5/INT0/RB7
D9 (LED2[Rot])		12: TMS/PMA10/RA10
D10 (#SS/PGEC3)		20: PGEC3/VREF-/CVREF-/AN1/RPA1/CTED2/PMD6/RA1
D11 (SDO2)		41: RPB5/USBID/RB5
D12 (SDI2)		11: AN11/RPB13/CTPLS/PMRD/RB13
D13 (SCK2,LED1[Grün])		15: AN9/C3INA/RPB15/SCK2/CTED6/PMCS1/RB15
GND
AREF/PGED3		19: PGED3/VREF+/CVREF+/AN0/C3INC/RPA0/CTED1/PMD7/RA0


Digital Con5:
=============

D0 (U2RX)		04: RPC8/PMA5/RC8
D1 (U2TX)		05: RPC9/CTED7/PMA6/RC9
D2			27: AN8/RPC2/PMA2/RC2
D3			36: AN12/RPC3/RC3
D4			37: RPC4/PMA4/RC4
D5			38: RPC5/PMA3/RC5
D6			02: RPC6/PMA1/RC6
D7			03: RPC7/PMA0/RC7


ICSP:
=====

1 RESET
2 +3.3V
3 GND
4 AREF/PGED3		19: PGED3/VREF+/CVREF+/AN0/C3INC/RPA0/CTED1/PMD7/RA0
5 D10 (#SS,PGEC3)	20: PGEC3/VREF-/CVREF-/AN1/RPA1/CTED2/PMD6/RA1
6 n.a.

Projekte[Bearbeiten]

In diese Sektion kommen die Projekte, die mit dem Pic32 realisiert werden sollen

Flauschball[Bearbeiten]

Der Flauschball soll ein Pic32-Innenleben bekommen. Eine ausführliche Projektbeschreibung findet ihr auf der Flauschballhomepage. Fragen und Anregungen zum Flauschball an yela