Pic32: Unterschied zwischen den Versionen
Alex (Diskussion | Beiträge) |
Alex (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
Zeile 209: | Zeile 209: | ||
test -f procdefs.ld && xmessage "flash now?" && sudo ubw32 -n -r -w "${ImagePath}" | 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. | * 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. | ||
== Execute code from Ram == | |||
MainCode | |||
<highlightSyntax language="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 | |||
# 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 | |||
</highlightSyntax> | |||
= Bauteilkiste = | = Bauteilkiste = | ||
Zeile 595: | Zeile 755: | ||
= Projekte = | = Projekte = |
Version vom 31. August 2012, 15:31 Uhr
Auf dieser Seite dreht sich alles um den Pic32 Mikrokontroller, ins Besondere den PIC32MX220F032D [1].
Eine Chronik, welche unsere "Fortschritte" aufzeigt.....
Pinguino
Pinguino ist ein an Arduino angelehntes open source Projekt. Eines der Pinguinoboards verwendet genau den Mikrokontroller unseres Begehrens.
Status: 7 Stück dieser dieser Pinguinoboards wurden bestellt. Kostenpunkt: 11,84 Eiros pro Stück.
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.
Entwicklung
Entweder Pinguino-IDE nehmen: Die ist allerdings viel schwarze Magie (geht schon mit dem USB-Bootloader los).
Für den Anfang alternativ ein 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
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
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
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 (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
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
Simple Delay
.... aber Achtung Optimierung des Compilers
<highlightSyntax language="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() }
</highlightSyntax>
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
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) 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) 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.
Pic32 raw
In diese Sektion gehören Dinge zum Pic32, die nichts mit dem Pinguino zu tun haben.
Buch: Pic32 C Programmierung
Ein Buch über die Programmierung von Pic32 Mikrokontrollern in C. (Natürlich ist das MIPS-Assembler auch seeehr spannend)
-
Im Space: Ja
Ausgeliehen an: ---
Wenn Ihr das Buch mit nach hause nehmen möchtet, dann vermerkt das bitte hier im Wiki.
Programmer: Pickit 3
Ein Pickit 3 ist im Space, muss noch in betrieb genommen werden.
Doku
Doku von Microchip
Tutorials
- Johnloomis Pic32 Tutorial In den Beispielcodes "mPORTDxxx" Makros durch "PORTA"-"PORTC" ersetzen und die Pins anpassen. Port D gibt es bei unserem Chip nicht.
Interessante Projekte
- freertos is a real-time operating system for embedded devices
- Microchip AN1264 Integrating Microchip Libraries with a Real-Time Operating System
IDE: MPLAB X
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.
Execute code from Ram
MainCode <highlightSyntax language="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
- 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
</highlightSyntax>
Bauteilkiste
Im Space steht eine Kiste mit Bauteilen, die zum Experimentieren mit dem Pic32 genommen werden dürfen.
Bitte nicht in der Kiste rumwühlen, sondern stattdessen auf folgende Inhaltsliste schauen.
Bauteil | Details | Datenblatt | € | Img |
---|---|---|---|---|
PIC32MX220F032D-I/PT | Microcontroller PIC32 32KB FL 8KBRAM 40MHz USB CTMU 4 DMA | [2] | 2,28 | |
MMA8452QR1 | Beschleunigungsmesser LOW G 3-AXIS 12BT EX VLT | [3] | 1,14 | |
MCP73833-AMI/UN | Batterie Charge Management Controller | [4] | 0,586 | |
47654-0001 | USB-Stecker MICRO USB AB RECPT MID MOUNT ASSY | [5] | 0,736 | |
SCHD3A0100 | Speicherkartenverbinder Slide In-Slide Out Headersmicro SD | [6] | 0,363 | |
JS202011SCQN | Schiebeschalter DPDT SMT .3A zum Ein-/Ausschalten | [7] | 0,20 | |
NRF24L01 | 2.4GHz RF Modul mit Antenne | |||
MIKROE-1120 | Akkusätze LI-POLYMER BATTERY 3.7V 2000mA; Nur zum experimentieren, für Bausatz wahrscheinlich zu teuer. | 11,46 | ||
RGB-LEDs | common annode | |||
Speaker | verschiedene kleine | ~1 | ||
Laborplatine | ||||
Schrumpfschlauch | ||||
Kabel | ||||
Flachbandkabel und Steckerkrams | ||||
Button | ||||
LDO | ||||
Lautsprecherkabel |
Wenn Ihr was nützliches rausfindet, immer rein damit ins Wiki! :)
Accelerometer
RGB-LED
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.
UART
- 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
<highlightSyntax language="c"> // UART Init sample
U2RXR = 6; // UART2 RPC8 / PMA5 / RC8 see PIC32 Family Reference Manual Section 12. I/O Ports, Table 12-1 RPC9R = 2; // UART2 RPC9 / CTED7 / PMA6 / RC9 see PIC32 Family Reference Manual Section 12. I/O Ports, Table 12-2
TRISCbits.TRISC8 = 1; // UART2 RX as Input -- should probably not be done TRISCbits.TRISC9 = 0; // UART2 TX as Output -- should probably not be done
UARTConfigure (UART2, UART_ENABLE_PINS_TX_RX_ONLY| UART_ENABLE_HIGH_SPEED); UARTSetFifoMode (UART2,UART_INTERRUPT_ON_TX_NOT_FULL | UART_INTERRUPT_ON_RX_NOT_EMPTY); UARTSetLineControl (UART2, UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1); UARTSetDataRate (UART2, GetPeripheralClock (), 500000); UARTEnable (UART2, UART_ENABLE_FLAGS (UART_PERIPHERAL | UART_RX | UART_TX));
UARTSendDataByte (UART2, 'A'); </highlightSyntax>
oder ganz pur, hier: 921600 Baud (in Wirklichkeit ca. 909090 Baud)
<highlightSyntax> /* 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'; </highlightSyntax>
SD-Card Interface
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
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.
Sound
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)
- ein netter "class d" Verstärker der ist sicher nicht für den fb... aber kommt aus einer netten Familie
Funk
Einige Seiten mit Unterlagen, Example Code usw. für PIC32 vers. nRF24L01+
- mech.northwestern.edu
- [8] Example PIC Code
- Demo Code for bi-directional communication between the MOD-NRF24LR and the LPC-P2148 Prototype Board Link defekt
- Eine Einleitung
- [9]
- alex BeispielCode für AVR atmega48
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 | Power | |||
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 | > |
<highlightSyntax language="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++); }
</highlightSyntax>
<highlightSyntax language="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++); }
</highlightSyntax>
Alternative Funk Systeme
- Wifi Module für kleine Systeme € > 20€ wird aber sicher viel billiger ;-)
Projekte
In diese Sektion kommen die Projekte, die mit dem Pic32 realisiert werden sollen
Flauschball
Der Flauschball soll ein Pic32-Innenleben bekommen. Eine ausführliche Projektbeschreibung findet ihr auf der Flauschballhomepage. Fragen und Anregungen zum Flauschball an yela