Forum: Mikrocontroller und Digitale Elektronik org Befehl


von Paulemann (Gast)


Lesenswert?

Hallo Leute,
hab mal wieder ein kleines Problem:
Ich werd aus dem "org" Befehlt in MPlab nicht so recht schlau.
Der Befehl gibt doch an wo genau ich mein Programm ablege, oder? Bei
meinem PIC 16F688 hab ich jetzt extra Flashspeicher um mein Programm
abzulegen. Wie mach ich das nun dass ich das dort ablege, und wo in
meinem Programm schreib ich das hin.
In meinem Template steht einfach org 0x00 ganz am Anfang nach der
Variablendefinition. Mein compiler meckert aber dann immer.
Also wie mach ich das?

Danke

von bone (Gast)


Lesenswert?

.org 0x00

statt ohne punkt....

von Paulemann (Gast)


Lesenswert?

?????????????

Also wenn ich .org schreib funktioniert ja gar nix mehr. Das erkennt er
mir nicht mal mehr als Befehl

;-)

von bone (Gast)


Lesenswert?

hmm sorry

von bone (Gast)


Lesenswert?

poste mal deinen code...

..das man da ma was sieht, dann kann man dir vllt besser helfen :-)

von Paulemann (Gast)


Lesenswert?

Ok, hier isser. Aber mit Vorsicht zu genießen, ist mein erste Code
überhaupt.



  list    p=16f688    ; list directive to  define processor
  #include  <P16F688.inc>    ; processor specific variable definitions

    ;Grundeinstellungen des PIC setzen. Siehe Datenblatt
  __CONFIG    B'000011100001'    ;Seite 100
                  ;Speicheradressen con CONFIG liegen im .INC file
  org 0x0000  ; Anfangsadresse des Programms
  goto Start

;***** VARIABLE DEFINITIONS
RESULTO  equ 0x20    ;Variable für Bit 9 und 10 des A/D Ergebnisses
RESULTU  equ 0x21    ;Variable für Bits 1 bis 8 des A/D Ergebnisses

;**********************************************************************


Start
   ; Einstellungen für den internen Oszillator vornehmen
  bsf STATUS,5    ; Bank 1 anwählen um in OSCCON zu schreiben
  bcf STATUS,6
  bcf OSCCON,0    ; Takt durch externen Oszillator bestimmt
  bsf  OSCCON,3    ; Takt durch externen Oszillator bestimmt
  ;bcf  OSCCON,4    ; Damit wurde ein interner Takt von 4 MHZ ausgewähl
  ;bsf  OSCCON,5    ; Ein Takt beträgt somit 1us
  ;bsf  OSCCON,6    ; Nur nötig wenn interner Oszillator genutzt wird

  ; Einstellungen für I/O Pins und AD Wandler
  bcf STATUS,5    ; in Bank 0 wechseln um ADCON0 zu beschreiben
  bcf STATUS,6
  bsf ADCON0,0    ; A/D Modul eingeschalten
  bsf ADCON0,6    ; Vref wird von PIN 12 abgegriffen
  bsf ADCON0,7    ; 10 Bit Ergebnis auf rechter Seite der ADRESH und
ADRESL Register
  bcf ADCON0,2    ;
  bsf  ADCON0,3    ; Anschluss AN6 als Analoger Eingang ausgewählt 
(PIN8)
  ; PIN 8 müsste auch auf Grundeinstellung bereits als Analoger Eingang
definiert sein
  bsf ADCON0,4    ;
  bsf STATUS,5    ; in Bank 1 wechseln um ADCON1,ANSEL und TRISC zu
beschreiben
  bcf STATUS,6
  bsf ANSEL,6      ; Anschluss AN6 auf Analogen Input gestellt 
(zugehöriger
TRIS muss auch als Input gewählt sein!)
  bsf TRISC,2      ; Pin 8 = RC2 als Input gewählt
  bsf ADCON1,4    ;
  bcf ADCON1,5    ; Auswahl des AD Taktes als 1/16 des Arbeitstaktes des
Prozessors(Oszillators). Damit beträgt ein A/D Takt ca. 4us. Und der
gesamte Umwandlungsprozess der
  bsf ADCON1,6    ; A/D Wandlung ca. 44us (11 TAD)

  ;Einstellungen für die EUSART Schnittstelle
  bsf TRISC,4      ;Eingänge auf PIN 5 und PIN 6 aktiviert
  bsf  TRISC,5
  bcf PIE1,4      ;Interrupt ausgeschaltet
            ;Sende-und Empfangseinstellungen
  bcf STATUS,5    ;in Bank 0 wechseln
  bcf STATUS,6
  bcf TXSTA,6      ;8-bit transmission
  ;bsf TXSTA,5    ;Transmit enabled
  bcf TXSTA,4      ;Asynchronen Modus auswählen
  bcf TXSTA,2      ;langsame Übertragung einstellen
  bsf RCSTA,7      ;Serieller Port angeschaltet
  bcf RCSTA,6      ;8-bit Empfang
  bsf RCSTA,4      ;Receiver einschalten für asynchronen Modus
  bcf  BAUDCTL,4    ;TX und nicht TX-Quer ausgewählt
  bcf  BAUDCTL,3    ;8-Bit Baudeinstellung
  bcf  BAUDCTL,1    ;RX,DT Edges generieren keine Interrupts
  bcf BAUDCTL,0    ;Auto-Baud Modus ausgeschaltet
  movlw  B'00011001'  ;Laden der Zahl 25 ins SPBRG Register
  movwf  SPBRG    ;Damit wird die Baudrate 2400 eingestellt

;***************Hauptprogrammschleife*********************************** 
***************

;A/D Wandlung
main
  bcf STATUS,5    ;in Bank 0 wechseln
  bcf STATUS,6
  bsf ADCON0,1    ;A/D Wandlung wird gestartet
ADloop          ;11.5 us vergehen bevor die Wandlung anfängt
  btfsc ADCON0,1    ;ist Wandler schon fertig? Wenn 0 in ADCON0,1 steht
wird die nächste Zeile übersprungen
  goto ADloop      ;Diese Schleife sollte ca. 44us+11.5us Sekunden
benötigen

  movf ADRESH,w    ;obere 2 Bit des A/D Ergebnis in W laden (W=Akku, 
oder
Arbeitsregister)
  movwf RESULTO    ;obere 2 Bit in Variable RESULTO laden
  bsf STATUS,5    ;In Bank 1 Wechseln
  bcf  STATUS,6
  movf ADRESL,W    ;untere 8 Bit des A/D Ergebnis in W laden
  bcf STATUS,5    ;In Bank 0 Wechseln
  bcf STATUS,6
  movwf RESULTU    ;untere 8 Bit in Variable RESULTU laden

;ESUART
  bsf TXSTA,5      ;Transmit enabled
  movf RESULTU,W    ;ersten 8-Bit in Akku laden
  movwf TXREG      ;ersten 8-Bit senden
gesendet
  btfss TXSTA,1    ;nachschauen ob Daten bereits gesendet worden sind
  goto gesendet    ;nein, noch nicht gesendet, nochmal abfragen
  movf RESULTO,W    ;ja, gesendet, die übrigen 2-Bit in den Akku laden
  movwf TXREG      ;die übrigen 2-Bit senden

  goto main

  END                       ; directive 'end of program'

von Dieter W. (dds5)


Lesenswert?

Hallo Paulemann,
wie heisst denn die Meckermeldung ?

Da der Quellcode in Assembler geschrieben ist, kann ein Compiler damit
nichts anfangen.
Der MPASM sollte das aber richtig übersetzen können.

Übrigens werden je nach Einstellung nicht nur errors sondern auch
warnings und messages ausgegeben. Das stört manchmal etwas.

von Profi (Gast)


Lesenswert?

Die org-Direktive hat zur Folge, dass der nachfolgende Code (oder auch
Daten) an die angegebene Adresse gesetzt wird.
Das hat mit Anfangsadresse des Programms gar nichts zu tun.

Diese muß an der Adresse des Reset-Vektors stehen.
Da gibt es von der Prozessorfamilie anhängige Methoden:
 - Der Prozessor fängt an einer festen Adresse (z.B.0000) an
 - Der Prozessor fängt an der Adresse, die in einer bestimmten
Speicherstelle (z.B. FFFE:FFFF) steht, an

Zu Warnings und Errors:
ich würde immer alle einschalten, denn sie haben schon ihren Sinn.
Man sollte versuchen, Code so zu schreiben, dass keine/wenige Warnings
erscheinen.

dann werden z.B. C-Fallen wie if(c=3)  statt if (c==3)
gleich als Warning (possible unwanted assignment) angezeigt.

Für Anfänger ist es sicher schwer, die gangzen Zusammenhänge zu
verstehen, aber Übung macht dem Meister. Wir alle haben mal klein
angefangen.

von Paulemann (Gast)


Lesenswert?

Danke, langsam lichtet sich das Dunkel.

Hab auch nochmal in meinem Datenblatt und einigen Beispielprogrammen
recherchiert und hab jetzt folgendes:

org 0x0000     ;Adresse des Reset Vektors auf 0x0000
goto start

nun stand in dem Datenblatt des PIC dass der Programmspeicher wo das
Programm abgelegt wird bei 0x0005 anfängt.
Deshalb hab ich nach diese beiden Zeilen noch geschrieben

org 0x0005
und dann den Programmcode.

So hab ich das in einer Vielzahl anderer Beispielprogramme auch
gefunden. Mein Compiler meckert auch nicht mehr!
Stimmt das jetzt?

Danke
Paulemann

P.s. Ich programmier nicht in C. Ich nehm die MPLAB Software her und
schreib das so runter wie oben abgetippt. Ich find das so gar nicht so
schlecht und da sich mein Programm eh in Grenzen hält wars auch nicht
zu kompliziert.

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.