Forum: Mikrocontroller und Digitale Elektronik PIC mit Bootloader und CC5X


von Jörg (Gast)


Lesenswert?

Hallo,
ich möcht mich gerne in die PIC-Programmierung mit C einarbeiten. In
Assembler habe ich schon erste kleine Erfolge gefeiert.
Ich hab ein Experimentier-Board entworfen, das hat bisher auch sehr gut
funktioniert. Hab nen Bootloader installiert und den immer schön schnell
über die serielle Schnittstelle programmiert.
Jetzt hab ich mir den CC5X Compiler runtergeladen und wollte langsam
das Online-Tutorial durcharbeiten. Doch schon stoß ich auf erste
Probleme.
Für den Bootloader brauch ich gleich am Anfang des Quellcodes nen
Sprung an Adresse 0x04. In Assembler alles kein Problem:
 org  0x00
 goto  start
 org  0x04
 start
Aber wie mach ich das in C?? Wenn ich es so mache, mault der Compiler
rum:
void main(void)    // Start des Hauptprogramms
{
  #asm
  org  0x00
  goto  start
  org  0x04
  start
  #endasm

  TRISB = 0b.0000.0000;
  PORTB = 0b.0000.0000;
}
In der Zeile mit dem ersten "org" soll ein Fehler sein: "The
expression must be corrected. The marker ^------ shows the approximate
position where CC5X gives up. The documentation should be checked if
the cause is not obvious."

Vielleicht weiß jemand nen Tip wie in C gleich am Anfang nen Sprung an
Adresse 0x04 mache? Dankeschön für die Hilfe :-)

von Gerhard Gunzelmann (Gast)


Lesenswert?


von Tipgeber (Gast)


Lesenswert?

Was heisst "ein Sprung an Addresse 0x04"? Ein Sprung wäre das:

goto 0x04

Du meinst aber wohl etwas anderes:

'org 0x00' sagt dem Assembler, dass der folgende Befehl (goto
start)an Adresse 0x00 stehen soll.

In der Assembler-Programmierung bedeutet:

  org   0x00
  goto  start
  org   0x04

start

dass beim Einschalten (Power ON) und bei einem Interrupt bei der
Adresse 'start' begonnen werden soll.

Bei Power ON beginnt der PIC immer bei Adresse 0x00. Steht hier ein
'goto abc', wird dorthin gesprungen.

Bei einem Interrupt springt der PIC zur Adresse 0x04. Steht hier ein
'goto xyz' wird dahin gesprungen.

In der Regel steht daher am Anfang eines Assembler-Programmes:

  org  0x00
  goto start   ; bei Power ON mit Start beginnen
  org  0x04
  goto isr     ; bei Interrup zur Interrupt-Service-Routine springen

start:
  :
  :

isr:
  :
  :
  retfi

Bei C macht das eigentlich alles der Compiler, d. h. aus deinem

void main(void)   macht der Compiler:

  org  0x00
  goto main

umd erzeugt das Label 'start' an dem der Code beginnt,

und aus einem

interrupt             ; <--- Syntax hängt vom Compiler ab
void isr_test(void)   ;

macht der Compiler

  org  0x04
  goto isr_test

und erzeugt das Label 'isr_test' an dem die Interrupt Routine
beginnt. Du brauchst also eigentlich überhaupt kein Assembler-Code, der
die Einsprungadressen festlegt.

von Tipgeber (Gast)


Lesenswert?

umd erzeugt das Label 'start' an dem der Code beginnt

soll heissen

und erzeugt das Label 'main' an dem der Code beginnt
                       ^^^^

von Jörg (Gast)


Lesenswert?

hm ja klar, aber ich brauch für den funktionierenden bootloader nen
quellcode, der auf alle fälle nach 0x04 ausgeführt wird (ob int oder
nicht is eigentlich egal)... ich kann natürlich die richtigen zeilen im
asm file eintragen und nochmal in mplab compilieren, das is mir aber
etwas zu umständlich! kann man das nicht "irgendwie" in c machen??
das muss dann doch auf alle fälle vor 'main' oder???

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.