Ich habe vor von 8bit auf 16bit (PIC24) umzusteigen. Das Testboard habe
ich bald fertig, ich warte noch auf die PICs.
Ich möchte wie ich es auch bei den 8bit PICs gemacht habe erst die
Basics in ASM lernen, und wenn ich das kann zu C übergehen.
Kennt jemand ein gutes Tutorial zur Programmierung von PIC24 in ASM?
Es kann auch englisch sein, ich würde Deutsch aber bevorzugen.
Ich habe mit auch Datenblätter von einem dsPIC30 angesehen. Kann es
sein, dass der dsPIC30 und der PIC24 einen ähnlichen oder den gleichen
Befehlssatz haben?
Ich möchte nicht dass in diesem Thread über darüber diskutiert wird, ob
es überhaupt sinnvoll ist mit ASM anzufangen...
Grüße
Max
Gibt es meines Wissens nichts was Anspruch auf ein "Turorial" erheben
kann.
Wenn du die 8-Bitter in ASM beherschtst, brauchst du für PIC24 kein
Tutorial welches mit einer blinkenden LED beginnt sondern etwas
spezielles die 16-Bit PIC betreffend:
DS70157D "16 bit MCU and DSP programmer's reference manual" zum
runterladen bei MICROCHIP.
Im MICROCHIP forum gibt es eine Liste von Links mit ASM relevanten
Themen und Beispielen:
http://www.microchip.com/forums/tm.aspx?m=442087&mpage=1&key=%F1%AF%97%B9
Runterscrollen zum Eintag von "Guest" vom November 03, 2009 (dort ist
auch gleich der Link zum DS70157D).
Der dsPIC30 Befehlssatz ist eine Erweiterung des PIC24 Befehlssatzes umd
DSP-relevante Befehle...und noch einige Besonderheiten, die aber im
DS70157D nachzulesen sind.
Max H. schrieb:
> Ich habe mit auch Datenblätter von einem dsPIC30 angesehen. Kann es
> sein, dass der dsPIC30 und der PIC24 einen ähnlichen oder den gleichen
> Befehlssatz haben?
Mit den dsPIC30 fing Microchip im 16-Bit Segment an. Aus dieser heute
veralteten Reihe leiteten sie später die PIC24 und dsPIC33 ab. Bei den
PIC24 flog die DSP-Einheit mitsamt der Befehle raus. Einige dieser Chips
existieren identisch als PIC24 und dsPIC33 Variante, unterschieden nur
im DSP-Befehlssatz (vmtl. Marketing/Preis aber intern gleicher Chip).
Nachtrag: Und natürlich auch DS51317 "MPLAB ASM30 LINK30 and utilities
user's guide"
Chris B. schrieb:
> Wenn du die 8-Bitter in ASM beherschtst, brauchst du für PIC24 kein
> Tutorial welches mit einer blinkenden LED beginnt
Ich habe eigentlich so etwas gesucht, damit würde ich dann Lernen, wie
das mit den Configs und dem Oszillator gemacht wird und ich habe einen
kurzen Beispielcode, den Rest würde ich mir dann mit dem Befehlssatz
erarbeiten.
Also mit einem einfachen Programm starten und dann darauf aufbauen.
Hallo Max,
hier ein Link mit einem einfachen Beispielprogramm (Beitrag vom
31.01.2009):
http://www.fernando-heitor.de/index.php?topic=3905.msg19959#msg19959
Meister Eder schrieb:
> hier ein Link mit einem einfachen Beispielprogramm (Beitrag vom
> 31.01.2009):
Ich denke damit kann ich was anfangen, muss aber noch auch meinen
PIC24F16KA102 warten. Ich werde berichten, wenn sich was tut...
Danke.
Vllt. beende ich auch vorher mein 8bit ASM Project, sonst könnte ich mit
den verschiedenen ASMs durcheinander kommen.
Der PIC ist heute noch angekommen und ich habe gleich losgelegt: Die LED
blinken jetzt mit 330kHz. Ich habe noch kein delay gemacht.
Ich habe dieses configs Verwenden: 1 | config __CONFIG1, GCP_OFF & GWRP_OFF & COE_OFF & FWDTEN_OFF & ICS_PGx2
| 2 | config __CONFIG2, FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMOD_HS & FNOSC_PRI
|
Ich verstehe die Syntax zum Setzen der config bits nicht.
Es gibt __CONFIG1 und 2 aber in PIC gibt es ja 8 Configuration Register.
Zu welchem __CONFIGx muss ich dann meine bits schreiben?
Am Quarz messe ich aber 2 MHz, obwohl ich einen 8MHz Quarz eingebaut
habe.
Max H. schrieb:
> Der PIC ist heute noch angekommen und ich habe gleich losgelegt: Die LED
> blinken jetzt mit 330kHz. Ich habe noch kein delay gemacht.
Gratuliere, freut mich für dich.
> Ich habe dieses configs Verwenden:
> 1 | config __CONFIG1, GCP_OFF & GWRP_OFF & COE_OFF & FWDTEN_OFF &
| 2 | > ICS_PGx2
| 3 | > config __CONFIG2, FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMOD_HS &
| 4 | > FNOSC_PRI
|
> Ich verstehe die Syntax zum Setzen der config bits nicht.
> Es gibt __CONFIG1 und 2 aber in PIC gibt es ja 8 Configuration Register.
> Zu welchem __CONFIGx muss ich dann meine bits schreiben?
Schau in die Header-Datei p24FJ128GA010.inc, dort stehen die Identifier
der Configbits gruppiert nach ihrer Zugehörigkeit zu __CONFIGx.
Aus dem Gedächtnis (seit 2 Jahren kein 16-Bit PIC mehr in ASM
programmiert):
Es gibt auch noch __CONFIG2 evtl auch __CONFIG3, die wurden aber im
Beispiel nicht gebraucht bzw. deren Default-Werte verwendet.
>
> Am Quarz messe ich aber 2 MHz, obwohl ich einen 8MHz Quarz eingebaut
> habe.
Ist es sicher ein 8MHz Grundtonquarz? An den Configbits liegt es nicht,
was an OSC0 und OSC1 schwingt muss eigentlich der Quarz sein, weil
OSCIOFNC_OFF und HS dürfte auch stimmen.
Mein PIC hat diese configs: FBS FGS FOSCSEL FOSC FWDT FPOR FICD FDS
Muss ich sie alle einen mit
config __BSF
config __FGS
….
setzen?
Wenn ich die *.inc vergleiche, denke ich, dass es so sein wird.
Das mit dem Oszillator könnte dann so sein, weil ich mit dem __CONFIG1
die bits irgendwie falsch einstelle.
Das 2MHz Signal am Quarz ist ein fast perfektes Rechteck, es könnte also
sein, dass der Pin als clock out eingestellt ist.
Ich werde es jetzt mit config __BSF config __FGS versuchen.
Edit:
Es waren die Config. Ich habe es jetzt so gemacht und es passt. 1 | config __FBS, BWRP_OFF ;Boot segment may be written
| 2 | config __FGS, GWRP_OFF & GCP_OFF ;General segment may be written & No protection
| 3 | config __FOSCSEL, FNOSC_PRI & IESO_OFF ;Primary oscillator (XT, HS, EC) & Internal External Switchover mode disabled
| 4 | config __FOSC, POSCMOD_HS ;HS oscillator mode selected
|
Vielen Dank für die Hilfe.
Ich denke jetzt da die configs passen, brache ich um weiter zu kommen
nur den Instruction Set und Übung.
Edit: Die PLL läuft jetzt auch.
Ok, danke für die Rückmeldung mit der config Direktive, da habe ich ja
gut daneben getippt. Mein Beispiel ist noch unter MPLAB8 geschrieben, du
verwendest wahrscheinlich MPLABX, oder?
Hab schon am Rande mitbekommen, dass sich ein paar Dinge geändert haben,
aber was man mal lange so drin hatte...
Muss mir das bei Gelegenheit mal anschauen, ist ja schon böse, dass die
__CONFIG Makros mit den alten Argumenten überhaupt übersetzt werden.
Meister Eder schrieb:
> MPLABX
Nein, ich habe mal versucht, bin aber beim 8er geblieben. Vor allem weil
das PICkit3 nicht das machte, was ich wollte.
Gut, nochmals danke. Dann muss ich es mir erst recht anschauen. :)
Das erste 16bit lauflicht läuft...
Ist diese delay Schleife so in ordnung, oder gibt es auf dem PIC24
bessere wege (ohne Timer)?
1 | mov #250,W2
| 2 | delay:
| 3 | mov #4000,W1
| 4 | delay1:
| 5 | dec W1,W1
| 6 | bra nz,delay1
| 7 | dec W2,W2
| 8 | bra nz,delay
|
Man könnte natürlich versucht sein, den REPEAT Befehl zu verwenden.
Wie mache ich das mit den Variablen? Gibt es in ASM30 so etwas wie
cblock?
Bis jetzt habe ich nur die möglichkiet mit .equ gefunden.
1 | .section MAINRAM, bss, address(0x850)
| 2 | variable1: .space 0x02 ;reserviert 2byte für variable1
|
Mit .space kannst du in jeder Speicherregion Platz reservieren. Im
Beispiel ist es das RAM ab Adresse 0x850.
Noch mal ein Dank an alle (vor allem Meister Eder) die mir geholfen
haben.
Und falls jemand irgendwann diesen Thread findet könnte er meinen Code
für einen 16bit Knighrider vllt. brauchen. Die Schaltung dazu ist ein
PIC24F16KA102 mit einem 8MHz Quarz und 16 LEDs an PORTB. 1 | .equ __24F16KA102, 1
| 2 | .include "p24F16KA102.inc"
| 3 | config __FBS, BWRP_OFF ;Boot segment may be written
| 4 | config __FGS, GWRP_OFF & GCP_OFF ;General segment may be written & No protection
| 5 | config __FOSCSEL, FNOSC_PRIPLL & IESO_OFF ;Primary oscillator with PLL module (HS+PLL, EC+PLL) & Internal External Switchover mode disabled
| 6 | config __FOSC, POSCMOD_HS ;HS oscillator mode selected
| 7 | config __FWDT, FWDTEN_OFF ;WDT disabled (control is placed on the SWDTEN bit)
| 8 |
| 9 | .section MAINRAM, bss, address(0x800)
| 10 | del_1: .space 0x02 ;reserviert 2byte für variable1
| 11 |
| 12 | .global __reset
| 13 | .text
| 14 | __reset:
| 15 | ;stack pointer init
| 16 | mov #__SP_init,w15
| 17 | mov #__SPLIM_init,W0
| 18 | mov W0,_SPLIM
| 19 |
| 20 | mov #0x00FF, w0
| 21 | mov w0,TRISA ;set PORTAA<0:7> as digital input
| 22 | mov #0x0000, w0
| 23 | mov w0,TRISB ;set PORTB<0:15> as digital output
| 24 | mov #0x0001,w0
| 25 | mov w0,LATB
| 26 | mov #0x1FFF, w0
| 27 | ior AD1PCFG ;All inputs digital
| 28 |
| 29 |
| 30 | shift_rl:
| 31 | rlnc LATB
| 32 | call delay
| 33 | btss LATB,#15
| 34 | goto shift_rl
| 35 | shift_lr:
| 36 | rrnc LATB
| 37 | call delay
| 38 | btss LATB,#0
| 39 | goto shift_lr
| 40 | goto shift_rl
| 41 |
| 42 | delay: ;ca. 500ms delay @8MHz
| 43 | mov #250,W2
| 44 | mov w2,del_1
| 45 | delay2:
| 46 | mov #4000,W1
| 47 | delay1:
| 48 | dec W1,W1
| 49 | nop
| 50 | bra nz,delay1
| 51 | dec del_1
| 52 | bra nz,delay2
| 53 | return
| 54 |
| 55 | .end
|
Und zu den Configs:
In der *.inc Datei sind mehrere Einträge, die nach diesem Muster
aufgebaut sind: 1 | ;----- FOSCSEL (0xf80006) --------------------------------------------------
| 2 | ;
| 3 | ; The following settings are available for FOSCSEL:
| 4 | ;
| 5 | ; Oscillator Select:
| 6 | ; FNOSC_FRC Fast RC oscillator (FRC)
| 7 | ; FNOSC_FRCPLL Fast RC oscillator with divide-by-N with PLL module (FRCDIV+PLL)
| 8 | ; FNOSC_PRI Primary oscillator (XT, HS, EC)
| 9 | ; FNOSC_PRIPLL Primary oscillator with PLL module (HS+PLL, EC+PLL)
| 10 | ; FNOSC_SOSC Secondary oscillator (SOSC)
| 11 | ; FNOSC_LPRC Low-Power RC oscillator (LPRC)
| 12 | ; FNOSC_LPFRC 500 kHz Low-Power FRC oscillator with divide-by-N (LPFRCDIV)
| 13 | ; FNOSC_FRCDIV 8 MHz FRC oscillator with divide-by-N (FRCDIV)
| 14 | ;
| 15 | ; Internal External Switch Over bit:
| 16 | ; IESO_OFF Internal External Switchover mode disabled (Two-Speed Start-up disabled)
| 17 | ; IESO_ON Internal External Switchover mode enabled (Two-Speed Start-up enabled)
| 18 | ;
| 19 | .equiv FNOSC_FRC, 0xFFF8 ; Fast RC oscillator (FRC)
| 20 | .equiv FNOSC_FRCPLL, 0xFFF9 ; Fast RC oscillator with divide-by-N with PLL module (FRCDIV+PLL)
| 21 | .equiv FNOSC_PRI, 0xFFFA ; Primary oscillator (XT, HS, EC)
| 22 | .equiv FNOSC_PRIPLL, 0xFFFB ; Primary oscillator with PLL module (HS+PLL, EC+PLL)
| 23 | .equiv FNOSC_SOSC, 0xFFFC ; Secondary oscillator (SOSC)
| 24 | .equiv FNOSC_LPRC, 0xFFFD ; Low-Power RC oscillator (LPRC)
| 25 | .equiv FNOSC_LPFRC, 0xFFFE ; 500 kHz Low-Power FRC oscillator with divide-by-N (LPFRCDIV)
| 26 | .equiv FNOSC_FRCDIV, 0xFFFF ; 8 MHz FRC oscillator with divide-by-N (FRCDIV)
| 27 |
| 28 | .equiv IESO_OFF, 0xFF7F ; Internal External Switchover mode disabled (Two-Speed Start-up disabled)
| 29 | .equiv IESO_ON, 0xFFFF ; Internal External Switchover mode enabled (Two-Speed Start-up enabled)
|
Will ich jetzt z.B. den primeren Oszillator mit PLL aktivieren und den
"Internal External Switchover mode" deaktivieren sieht die config
Anweisung
so aus: 1 | config __FOSCSEL, FNOSC_PRIPLL & IESO_OFF
|
Das hört sich jetzt eigentlich ziemlich einfach an, aber das gelöste
Problem sieht immer relativ einfach aus.
Meine frage neich einem Tut ist hiermit zu einem kleinen Config tutorial
geworden ;-)
Grüße
Max
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|