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
:
Bearbeitet durch User
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).
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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.
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 |
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
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.