Forum: Mikrocontroller und Digitale Elektronik PIC24 ASM Tutorial


von Max H. (hartl192)


Lesenswert?

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
von Chris B. (dekatz)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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
von Chris B. (dekatz)


Lesenswert?

Nachtrag: Und natürlich auch DS51317 "MPLAB ASM30 LINK30 and utilities 
user's guide"

von Max H. (hartl192)


Lesenswert?

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.

von Meister E. (edson)


Lesenswert?

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

von Max H. (hartl192)


Lesenswert?

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
von Max H. (hartl192)


Lesenswert?

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
von Meister E. (edson)


Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?

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
von Meister E. (edson)


Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?

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.

von Meister E. (edson)


Lesenswert?

Gut, nochmals danke. Dann muss ich es mir erst recht anschauen. :)

von Max H. (hartl192)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

Man könnte natürlich versucht sein, den REPEAT Befehl zu verwenden.

von Max H. (hartl192)


Lesenswert?

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.

von Meister E. (edson)


Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?

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
Noch kein Account? Hier anmelden.