mikrocontroller.net

Forum: Projekte & Code "BASIC ähnlicher" Compiler für Microchip PIC


Autor: Feadi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein Compiler für PIC µC's programmiert. Als Sourcesprache 
benutze ich etwas BASIC-Ähnliches. "Ähnlich" weil es kein echtes Basic 
ist, es erinnert nur daran. Der Compiler spuckt eine .asm Datei aus, 
diese kann man mit MPASM zu einer .hex Datei Assemblieren, oder mit 
MPLAB simulieren. In MPASM muss case sensitive deaktiviert werden. 
Unterstützt werden alle PIC's die zum 16F84 codekompatibel sind (alle 
mit 14Bit Befehlssatz).

So, jetzt zu den guten Seiten:
 - if else Konstrukte möglich
 - kein Codelimit
 - der Compiler ist kostenlos

Und die Nachteile:
 - ISR muss in Assembler programmiert werden (weil der Compiler eine 
Stacknachbildung benutzt)
 - auf Assembler kann nicht 100%tig verzichtet werden
 - die for Schleife hat einen Bug: "for i = 0 to 255" funktioniert 
nicht, keine Lösung bekannt :(
 - enthält höchstwarscheinlich noch viele unbekannte Fehler :(

Ich empfehle den Compiler nicht ernsthaft zu benutzen, wegen den bisher 
unbekannten Bugs. Sehr komfortaben ist es aber auf dem PIC ein "if else" 
Konstrukt benutzen zu können, das ist der Grund warum ich den Compiler 
hier veröffentliche. Also bitte nicht zu viel davon erwarten ;)

In der .zip Datei ist eine ganz kleine Doku und ein Beispielprogramm zu 
finden.

Zum Schluss noch ein "Hello World" Beispiel (Blinker):
processor 16F628a
asm( ; )

asm( ; --- DIM )
dim TRISB as extern, PORTB as extern
dim X as byte

asm( ; --- BANKSEL )
banksel TRISB

asm( ; --- TRISB[0] = 0 )
clr TRISB(0)

asm( ; --- BANKSEL )
banksel PORTB

asm( ; --- Programmschleife: )
schleife:

  asm( ; --- IF )
  if X then
    asm( ; --- THEN )
    clr PORTB(0)
    X = 0
  else
    asm( ; --- ELSE )
    set PORTB(0)
    X = 1
  endif
  asm( ; --- ENDIF )

  gosub wait

  goto schleife


wait:
  dim waitcount2 as byte
  for waitcount2 = 1 to 2
    gosub waitbischen
    gosub waitbischen
    gosub waitbischen
    gosub waitbischen
  next waitcount2
 return

waitbischen:
  dim waitcount as byte
  for waitcount = 1 to 10
    asm( nop )
    asm( nop )
    asm( nop )
    asm( nop )
  next waitcount
 return


Und die Compilerausgabe:
  processor 16f628a
  include "p16f628a.inc"

  ; 
  ; --- dim 
_x EQU 0x20
  ; --- banksel 
  banksel trisb
  ; --- trisb[0] = 0 
  bcf trisb, 0
  ; --- banksel 
  banksel portb
  ; --- programmschleife : 
_schleife:
  ; --- if 
  movf _x, w
  addlw 0
  btfsc STATUS, Z
  goto __label0
  ; --- then 
  bcf portb, 0
  movlw 0x00
  movwf _x
  goto __label1
__label0:
  ; --- else 
  bsf portb, 0
  movlw 0x01
  movwf _x
__label1:
  ; --- endif 
  call _wait
  goto _schleife
_wait:
_waitcount2 EQU 0x21
  movlw 0x01
  movwf _waitcount2
__label2:
  movlw 0x02
  subwf _waitcount2, w
  sublw 1
  btfsc STATUS, Z
  goto __label3
  call _waitbischen
  call _waitbischen
  call _waitbischen
  call _waitbischen
  incf _waitcount2, f
  goto __label2
__label3:
  decf _waitcount2, f
  return
_waitbischen:
_waitcount EQU 0x22
  movlw 0x01
  movwf _waitcount
__label4:
  movlw 0x0A
  subwf _waitcount, w
  sublw 1
  btfsc STATUS, Z
  goto __label5
  nop 
  nop 
  nop 
  nop 
  incf _waitcount, f
  goto __label4
__label5:
  decf _waitcount, f
  return

  end

Gruß, Feadi

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.