PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Erster Versuch in Assembler zu programmieren



Smokey
19.02.2006, 19:59
Hallo
ich habe mir dieses wochenende nichts anderes vorgenommen als ein eigenes
Programm in Assembler zu schreiben.Die Seite von Sprut hab ich mir Ausgedruckt und vor 2 Wochen angefangen zu lesen.Jetzt bin ich schon seit Samstag Morgen dabei zu programmieren.Mein Problem ist das beim assemblieren der ASM Datei Mpasmwin ein fenster öffnet in dem steht "DOS ERROR File Not Found"
Macht es eigentlich einen Unterschied ob ich die Include Datei oben ins programm einfüge oder ob ich den #include <P16F627.INC> Befehl nehme?
Das Programm soll 6 Leds mit 2 Schaltstellungen blinken lassen (ich habe ein vellemann Testboard von meiner arbeit übers wochenende ausgeliehen)

Danke schon im vorraus

mfg Smokey

XDavidX
19.02.2006, 20:20
Hi,
in was für eine Dateiebene liegt die .asm Datei?
Leg sie Direkt auf C:\ oder D:\ und versuch es noch mal.
Darf nicht in einer zu tiefen Ebene liegen und der Dateiname darf maximal 8 Zeichen lang sein! (DOS)

Hab mir Dein Programm aber noch nicht angeschaut.
Versuchs erst mal wie oben.

Gruß David

Smokey
05.03.2006, 12:42
Hi ich habe jetzt die ASM Dateien direkt auf C: gelegt und die Dateinamen
auf weniger als 8 Zeichen gekürzt jedoch zeigt mir MPASM immer noch 6 Errors an. Diese kann ich ich mir aber nicht erklären weil ich für den Anfang den programmkopf des anfangs des Vellemann Demo1 programmes verwendet habe(das ist ein beispielprogramm von meinem programmier board) .Im programmkopf sind Resetroutine und Delayroutine inbegriffen.Das einzigste was ich dazu geschrieben habe ist der Effect.
Bei Sprut habe ich gelesen das die list datei bei einer Fehlersuche hilfreich sein kann was kann man den damit machen?

mfg Smokey

kalledom
05.03.2006, 14:34
Hallo Smokey,
schau dir mal folgendes Assembler-Beispiel-Programm an, da ist eine richtige Initialisierung am Anfang: http://www.domnick-elektronik.de/picasm.htm

PS: wenn es dann noch nicht klappt, kopiere die Datei P16F627.INC mit in das aktuelle Programm-/ASM-Verzeichnis.

Smokey
05.03.2006, 19:17
Den tipp mit der include Datei habe ich schon ausprobiert. Ich habe jetzt die list Datei mit Mplap geöffnet er zeigt mir dort folgende Errors an:


Warning[209]: Missing quote
Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct.
Error[113] : Symbol not previously defined (TIMER2)
Error[113] : Symbol not previously defined (TIMER1)
Error[113] : Symbol not previously defined (TIMER1)
Error[113] : Symbol not previously defined (TIMER2)
Error[113] : Symbol not previously defined (DELAY)
Error[113] : Symbol not previously defined (ROUTINE)


Kann mir jemand sagen was das zu bedeuten hat. Hat das mit der Include Datei zu tun das der pic nicht genau weiß wo sich die Timer befinden?

Semmelchen
05.03.2006, 20:57
Hi, die Zeilen mit "Message..." kannst du getrost ignorieren, das ist nur eine Aufforderung, das Umschalten der Bank zu überprüfen.
Bei den anderen zeilen fehlt im Setup des MPLAB eine Datei, evtl eine **.lst oder **.inc .
Ich hatte auch lange zeit Probleme, ehe ich MPLAB korrekt initialisiert hatte und das Projekt korrekt assembliert/deassemliert wurde...

Semmelchen
05.03.2006, 21:05
Nachtrag: Hab in die asm-Datei geschaut:
1.:schreibst du einmal Delay-Routine und einmal Delay_Routine, aufpassen!
2.:scheint es keine Register Timer1 und Timer2 zu geben. Wenn es selbstdefinierte Sachen sind,
dann bitte mit angeben: equ timer1 0x20. (0x20 ist dann die adresse, wo die Variable gespeichert wird).
Sollen es Register im PIC sein, dann nochmal im Datenblatt die Schreibweise prüfen..

Ich hoffe, ich habe alles richtig verstanden und dich nicht mit offensichtlichem genervt..

kalledom
05.03.2006, 22:20
Sollen es Register im PIC sein, dann nochmal im Datenblatt die Schreibweise prüfen.. oder in die Datei P16F627.INC reischauen, da steht alles drin, was dieser PIC so hat.
errorlevel 1 ; Meldungen ignorieren

PICture
06.03.2006, 01:30
Hallo Smokey!

Ich habe Dein Programm angeschaut und korriegiert. Ich hoffe das es jetzt mit der Assemblierung klappt. Die Fehlerhafte Zeilen habe ich mit "<<<...<<<" gezeichnet. Du musst aber vorher noch die Adressen der Speicherstellen Timer1 und Timer2 definieren (z.B. 0x20, 0x21).

MfG


;**************** ************************************************** ******************
; * Erster Assembler Versuch *
;************************************************* **********************************


list P=16F627 ;Das ist die Bezeichnung des Pics den ich programmieren moechte
#include <P16F627.INC> ;Das ist die Include Datei in der die Adressen der Aliasnamen stehen

;Bsp: TRISA EQU H'0085
; TRIB EQU H'0086'
; STATUS EQU H'0003'

TIMER1 EQU 0x20 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
TIMER2 EQU 0x21 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;================================================= =======================================
; Programmanfang
;================================================= =======================================

ORG 0 ;Das ist die startadresse nach dem Reset hier Startet der pic nach dem Einschalten
;
goto RESET ;Hier springt der pic zur Reset routine(Label)



;================================================= ======================================
; RESET (BOOT VORGANG)
;================================================= ======================================

RESET



BSF STATUS,RP0 ;Setzt im Status Register RP0 auf "1" und wechselt so auf Specherbank 1 um dort verschiedene
; Optionen einzustellen

MOVLW B'11


MOVLW B'11111111' ;Kopiert den wert"255" in das Arbeitsregister(W) um spaeter damit PortA als Eingaenge zu definieren
;
MOVWF TRISA ;Jetzt sind RA0 bis RA3 Eingaenge(Die 4 Taster auf dem Vellemann Board)
;
CLRW ;In das Arbeitsregister W wird eine "0" geschrieben
;
MOVLW B'00000000' ;Kopiere den wert"0" in das Arbeitsregister
;
MOVWF TRISB ;RB0 bis RB7 sind als Ausgaenge definiert(RB0-RB5=LED1-LED6)

;
CLRF INTCON ;Ausschalten der Interrupt Funktion (Disable Interrupt)

BCF STATUS,RP0 ;kehrt wieder zu Bank 1 zurück(Die benötigten Optionen wurden programmiert)

;================================================= =======================================
; DELAY ROUTINE (Zeitschleife)
;================================================= =======================================


DELAY_ROUTINE

MOVLW D'255' ;Kopiert die dezimale Zahl 255 in das W Register
;
MOVWF TIMER2 ;Kopiert den inhalt des W registers in den Timer2

DEL_LOOP1

MOVLW D'255' ;Kopiert die dezimale Zahl 255 in das W Register
;
MOVWF TIMER1 ;Kopiert den inhalt des W registers in den Timer1

DEL_LOOP2

DECFSZ TIMER1,F ;Dieser Befehl verringert den Wert des timer 1 um 1(ist der Wert 0 überspringt er den
;folgenden Befehl


GOTO DEL_LOOP2 ;hier geht das programm wieder nach Loop 2 um den wert wieder um 1 zu verringern bis er null ist

DEL_LOOP3

DECFSZ TIMER2,F ;wenn der Wert Null ist wird der GOTO Befehl Übersprungen und das programm verringert den TIMER2 um 1


GOTO DEL_LOOP3 ;hier geht das programm wieder nach Loop 3 um den wert wieder um 1 zu verringern bis er null ist


RETLW 0 ;Hier ist das Unterprogramm zu ende im W Register steht jetzt eine Null.Das Programm arbeitet
; beim Call befehl weiter



;================================================= =========================================
; *Effect(Aktionen)*
;================================================= =========================================

EFFECT_1


MOVLW B'01010101' ;Hier schreibt das programm den wert D'170' in das W(Work) Register

MOVWF PORTB ;Hier wird der Wert aus dem W Register nach Port B geladen und jede 2 Led Leuchtet

CALL DELAY_ROUTINE ;Hier geht das Programm in das Unterprogramm Delay_Routine um eine zeitverzögerung hervor zu rufen

MOVLW B'10101010' ;das selbe wie oben nur das der wert D'85' beträgt

MOVWF PORTB ;S. o.

CALL DELAY-ROUTINE ;S. o. <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<soll DELAY_ROUTINE sein

GOTO EFFECT_1 ;Das Programm fängt wieder von vorne an (s. o.)

END

Smokey
07.03.2006, 15:41
Erstmal Danke für die hilfe.
Ich habe aber Leider immer noch 4 Errors an (schon 2 weniger) die sich aber alle auf die Timer beziehen müssten.

Error[113] : Symbol not previously defined (TIMER2)
Error[113] : Symbol not previously defined (TIMER1)

Komischerweise habe ich die Definition der Timer aber genau so durchgeführt wie es mir gesagt wurde.

Timer1 EQU 0x20 ;Definition der Speicheradresse des Timer1
Timer2 EQU 0x21 ;Adresse Timer2

liegt es vielleicht an der der Schreibweise das der pic nicht erkennt das es sich bei der adresse um das Hexadezimale Zahlensystem handelt?

Semmelchen
07.03.2006, 19:45
Bitte beachte die Schreibweise:

Error[113] : Symbol not previously defined (TIMER2)
Timer1 EQU 0x20 ;Definition der Speicheradresse des Timer1

Einmal TIMER und einmal Timer, kann es damit zusammenhängen?
Unter MPLAB kann man einstellen, ob eine Groß-/Kleinschreibweise geprüft oder ignoriert wird.
Evtl. ist das ja schon das letzte Problem?

(bei MPLAB:im Menü unter Project/Build Options/Project/MPASM Assembler: Disable case sensitivity)

PICture
08.03.2006, 08:12
Hallo Smokey!

Semmelchen hat recht. Ich habe den MPASM nicht umgestellt und die Befehle schreibe ich klein (z.B. goto), aber die definierte Speicherstellen muss man konsequent in ganzem Programm so schreiben wie bei dem Definieren. Ich habe den Unterschied zwischen dem definiertem TimerX und dem im Program benutztem TIMERX übersehen. Jetzt ändere ich Dein Program noch mal (in meinem letztem Beitrag). Versuch, bitte, noch mal. :)

MfG

Smokey
14.03.2006, 10:49
Danke an alle die hier regelmässig posten!!!!
Nur mal eine Frage nebenbei habt ihr alle mit so vielen Fehlversuchen angefangen oder stell ich mich blöd an?
Weil ich mich erst 2 wochen (Durch lesen der Sprut Seite) aufs programmieren vorbereitet habe und jetzt schon mehrere Wochen an einem eigentlich simplen Programm sitze. :-s

kalledom
14.03.2006, 13:15
Es ist noch kein Meister vom Himmel gefallen und der Sprung ins 'kalte Wasser' hat auch noch keinem geschadet.
Du solltest ganz besonders aus solchen Fehlern lernen, denn zu wissen, wie es NICHT funktioniert, ist sehr wichtig.

PICture
15.03.2006, 06:23
Hallo Smokey!

Das sind eigentlich keine Fehler. Das kommt, weil Du den Mpasm noch nicht kennst. Nach einiger Zeit werdest Du umfangreiche Programme so schnell wie SMS schreiben. Mir ist ganz am Anfang nicht anders gegangen. Du musst unterscheiden zwischen Ungewissheit und Fehler. Für mich ist mein Fehler erst dann, wenn ich alles weiss und das von mir geschriebenes Program trotzdem nicht funktioniert. Und der Spruch "Übung macht Meister" stimmt.

Viel Erfolg :)

MfG

Smokey
21.03.2006, 18:13
Ich konnte das programm jetzt erfolgreich assemblieren O:) !!!!!
Der Fehler war das die Komentarzeilen zu Lang waren.Ich dachte eigentlich das diese zeilen nicht assembliert werden.Naja jetzt muss ich das hex file nur noch übertagen.

Smokey
21.03.2006, 18:14
Ach ja noch mal danke für eure hilfe!!!

Smokey
26.03.2006, 00:18
Das Programm macht doch noch probleme.Wenn ich das Programm in den pic übertrage und starte leuchten alle 6 LED´s. Das Tris Register ist aber richtig eingestellt.


mfg Smokey

PICture
26.03.2006, 10:20
Hallo Smokey!

Das Problem kenne ich sehr gut aus eigener Erfahrung. Die einzige Programme die keine Probleme machen , sind die, die man selber geschrieben hat, weil die Probleme, wurden nacheinander, während des Schreibens beseitigt.

Ich habe mich schon mehrmals sehr gefreut, dass ich mir viel arbeit ersparen kann, weil ich im Internet eine Schaltung mit Software gefunden habe, was ich mir bauen wollte. Meine Freude hat leider meistens nur bis zum Versuch das Programm zu assemblieren, gedauert...

Dann habe ich es selber geschrieben und wahrscheinlich hat es kürzer, als die Fehlersuche in dem "fertigen", gedauert.

Wenn Du wirklich programmieren willst, würde ich Dir raten, keine "Lernbeispiele" verwenden, sondern gleich eigene Gedanken ins Programm umzusetzen. Wenn Du mit eigenem Programm nur eine LED zum blinken bringst, lernst Du sicher mehr, und vor allem schneller, weil Du genau weisst, was jeder Befehl macht.

Du brauchst keine Angst haben, dass der PIC wegen ein Fehler im Programm kaputt geht, dass hast Du ja schon gelernt, oder ? :).

Ich programiere PICs erst ca. ein Jahr, vorher habe ich andere Prozessoren programmiert. Nach dem erlernen der PIC-Befehlen, konnte ich meine ganze Erfahrung sofort nutzen. Und man weiss ja heute noch nicht, was man morgen programmieren wird. Es zeigt also, dass die Erfahrung nicht vom Prozessortyp abhängig ist.

Ich habe mir schon zwei "Werkzeuge" erstellt, die mir das Programmieren deutlich erleichtern (keine Simulation). Von Hardware ist dazu der Miniterminal von Thema "Kein Problem, sondern 2-pin Matrixdisplay für MC" notwendig. Wenn Du mir Deine Meinung über meine "Werkzeuge" aus Deinem Thema "Programmiertool für Assembler" äussern könntest, würde ich Dir sehr dankbar. :)

MfG