mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC mit Bootloader und CC5X


Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Gerhard Gunzelmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Tipgeber (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tipgeber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
umd erzeugt das Label 'start' an dem der Code beginnt

soll heissen

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

Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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???

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.