Forum: PC-Programmierung PIC18F4550 Assembler Programmieren


von Markus S. (markus_sch)


Lesenswert?

"
list p=18f4550
;*****************************************************
; Das erste Programm, Version 2b
; Der Programmspeicher
;*****************************************************

#include <P18f4550.INC>

;*****************************************************
; Variablen deklarieren (RAM)
    VAR1       EQU  0x00     ; VAR1 an Adresse H'00'


;*****************************************************
; Interruptvektoren
; 0x800 Offset bei Verwendung des USB Bootloaders auf dem
; Board
    ORG    0x800         ; Reset Einsprung
    goto   initmain
    ORG    0x808         ; HP-Interrupt Einsprung
    goto   initmain
    ORG    0x818         ; LP-Interrupt Einsprung
    goto   initmain

;*****************************************************
; Initialisierung
      ORG    0x828
initmain
    movlw  B'11111111'   ; PortB auf Eingang
    movwf  TRISB
    movlw  B'00000000'   ; PortD auf Ausgang
    movwf  TRISD
    movlw  H'0D'         ; Alle optionalen Analogeingänge mit Ausnahme 
von AN0,AN1 (PA0,PA1)
    movwf  ADCON1        ; werden auf digital In/Out initialisiert
    bcf    INTCON2,7     ; PortB mit Pull up Widerstaenden

;*****************************************************
; Hauptprogramm
mainloop
    movf   PORTB,W       ; PortB (Schalter) auslesen
    movwf  LATD          ; und an PORTD (LED) ausgeben
    goto   mainloop

    END

"

Hallo zusammen,

zuerst möchte ich sagen das Oben ist das Basisprogramm, darauf soll ich 
Veränderungen vornehmen, leider hab ich Probleme mit Assembler und bin 
totaler Anfänger. Die Aufgabe hatten wir natürlich über die Feiertage 
auf und ich kapier nichts.

Die Aufgabe:

Eine Weihnachtbaumbeleuchtung soll über einen Mikrocontroller 
angesteuert werden. Es müssen 8 Leuchtmittel angesteuert werden. Das 
Leuchtmuster muss mit Hilfe von zwei Schaltern seriell eingelesen 
werden.
Entwickeln Sie das entsprechende Programm. Beachten Sie dabei folgendes:

1. Das Leuchtmuster wird seriell ausgewählt, wenn „Schalter PB.2“ = 0 
ist.
    Details:
    Liefert „Schalter PB.0“ eine L/H Flanke, wird der von „Schalter 
PB.1“ gelieferte Wert als „Bit x“ des Musters genommen (0..7, beginnend 
mit dem LSB "least significant bit").
    Nach acht eingegebenen Bits ist das Muster komplett.
2. Schreiben Sie ein Unterprg. für eine Zeitverzögerung. Die Zeit wird 
vom Lehrer vorgegeben.  Die Rechnung ist im Unterprogrammkopf 
darzustellen.
3. Wurde das Leuchtmuster eingegeben und liefert „Schalter PB.2“ = 1, 
wird das Muster ausgegeben.
    Mit zwei Schaltern (PB.4, PB.3) lässt sich die Ausgabeart 
umschalten. Es gilt:
    00 = statische Anzeige, 01 = blinken, 10 = rechts rotierend, 11 = 
von innen nach außen aufbauend .

Zwischen jeder Ausgabe  muss das Unterprogramm “Delay“ aufgerufen 
werden.
Nutzen Sie die Dokumentationen und die zur Verfügung gestellte 
Simulatorsoftware.

Ob mir das jemand programmieren kann bzw. noch besser erklären könnte 
wäre einfach MEGA. Ich kapier nichts und wenn mir das jemand erklären 
könnte wäre das sehr hilfreich. Ich werd wahrscheinlich bis zum 
Abgabeteermin nichts haben und die schlechteste Note wohl kriegen aber 
ich will es verstehen.

Danke jetzt schonmal, falls sich jemand meldet.

von Adem B. (elektronik_neuling)


Lesenswert?

Hey,

ich würde dir raten, selber an der Aufgabe rumzuprobieren, hier wird dir 
keiner die vollständige Lösung für dich machen. Davon hast du nix und am 
ende muss du es so oder so drauf haben. Folgende Links kann ich dir 
dabei weiterempfehlen.   Du musst konkret sagen wo genau du 
Verständnisprobleme hast.

http://www.microcontroller-online.de

https://www.youtube.com/watch?v=G226w4tHNZI

MFG

elektronik_Neuling

: Bearbeitet durch User
von Hr. Ceil (Gast)


Lesenswert?

Nanana Hr. "Schuster", was haben wir denn da?!

Ich würde sie gerne mal in der 2. Pause nach den Ferien im Lehrerzimmer 
sprechen.

Beim nächsten mal würde ich ihnen empfehlen, den Namen etwas 
unauffälliger zu wählen :^)

von Markus S. (markus_sch)


Lesenswert?

Adem B. schrieb:
> Hey,
>
> ich würde dir raten, selber an der Aufgabe rumzuprobieren, hier wird dir
> keiner die vollständige Lösung für dich machen. Davon hast du nix und am
> ende muss du es so oder so drauf haben. Folgende Links kann ich dir
> dabei weiterempfehlen.   Du musst konkret sagen wo genau du
> Verständnisprobleme hast.
>
> http://www.microcontroller-online.de
>
> https://www.youtube.com/watch?v=G226w4tHNZI
>
> MFG
>
> elektronik_Neuling

Danke für die Links vielleicht helfen die mir weiter.

Wollte aber nicht einer der mir das programmiert, sondern mir helfen 
kann, bzw. meine Fragen beantworten kann.

von Vloki (Gast)


Lesenswert?

Markus S. schrieb:
> Wollte aber nicht einer der mir das programmiert, sondern mir helfen
> kann, bzw. meine Fragen beantworten kann.

Dann fang doch einfach mal mit der Bearbeitung des ersten Punktes an und 
stell dazu detaillierte Fragen

Da du ja wirklich hilflos zu sein scheinst:
-var 1 umbenennen in Leuchtmuster
- leucht Muster löschen - clrf
- sicherstellen dass b0 Low ist mit btfsc Schleife
- warten auf Flanke - btfss Schleife
- Muster setzen oder nicht - btfsc bsf
... Nächstes bit

Kann man sicher auch relativ elegant mit einer Schleife lösen, aber für 
den Anfang..
.

von Markus S. (markus_sch)


Angehängte Dateien:

Lesenswert?

Vloki schrieb:
> Markus S. schrieb:
>> Wollte aber nicht einer der mir das programmiert, sondern mir helfen
>> kann, bzw. meine Fragen beantworten kann.
>
> Dann fang doch einfach mal mit der Bearbeitung des ersten Punktes an und
> stell dazu detaillierte Fragen
>
> Da du ja wirklich hilflos zu sein scheinst:
> -var 1 umbenennen in Leuchtmuster
> - leucht Muster löschen - clrf
> - sicherstellen dass b0 Low ist mit btfsc Schleife
> - warten auf Flanke - btfss Schleife
> - Muster setzen oder nicht - btfsc bsf
> ... Nächstes bit
>
> Kann man sicher auch relativ elegant mit einer Schleife lösen, aber für
> den Anfang..
> .

Danke für die Tipps nur arbeitete ich mit der Befehlsliste im Anhang.
Ich verstehe da nicht was ich dahinter angeben muss ?
Einfach:

clrf leuchtmuster,0

Das ist so mein Problem zurzeit. Ich weiß nicht ob das richtig ist...

: Bearbeitet durch User
von Vloki (Gast)


Lesenswert?

Markus S. schrieb:
> clrf leuchtmuster,0
>
> Das ist so mein Problem zurzeit. Ich weiß nicht ob das richtig ist...

Ist leuchtmuster im access ram oder nicht?
Was/Wo ist das access ram?

von Vloki (Gast)


Lesenswert?

Du hat hoffentlich da ganze Datenblatt und nicht nur Ausschnitte...

von Markus S. (markus_sch)


Angehängte Dateien:

Lesenswert?

Ich hab diese Befehlsliste die im Anhang ist.

von Volker S. (vloki)


Lesenswert?

Das Datasheet (woraus auch einige der Abbildungen sind)
http://www.microchip.com/wwwproducts/Devices.aspx?product=PIC18F4550

Kann mir ehrlich gesagt nicht vorstellen, dass der "Lehrer" nicht schon 
mal darauf verwiesen hat.


Markus S. schrieb:
> clrf leuchtmuster,0
>
> Das ist so mein Problem zurzeit. Ich weiß nicht ob das richtig ist...

Eigentlich ist es zumindest mal nicht falsch. Besser wäre aber
   clrf leuchtmuster,ACCESS

ACCESS ist in p18f4550.inc definiert und man braucht sich nichts merken.
Da sind übrigens noch mehr Sachen angelegt ;-)
1
    ...
2
    FAST            EQU 1
3
4
    W               EQU 0
5
    A               EQU 0
6
    ACCESS          EQU 0
7
    BANKED          EQU 1
8
    ...
Weil leuchtmuster ja als Konstante 0x00 angelegt wurde, verweist es auf 
einen Speicherplatz im ACCESS Bereich, wenn man es entsprechend benutzt.
(Eine Variable im eigentlichen Sinne wurde aber nicht angelegt.
Bei Programmierung im Steinzeitstil (absolut), kann man theoretisch 10 
(oder beliebig viele) "Variablen" auf die selbe Adresse legen)

von Markus S. (markus_sch)


Angehängte Dateien:

Lesenswert?

list p=18f4550
;*****************************************************

#include <P18f4550.INC>
;************************************************* ****
; Variablen deklarieren (RAM)
bitposition EQU 0x0A
zaehler EQU 0x0B
flanke EQU 0x0C
wert EQU 0x0D
loopzaehler1 EQU H'00'
loopzaehler2 EQU H'01'
loopzaehler3 EQU H'02'


;************************************************* ****
; Interruptvektoren
; 0x800 Offset bei Verwendung des USB Bootloaders auf dem
; Board
ORG 0x800       ; Reset Einsprung
goto initmain
ORG 0x808       ; HP-Interrupt Einsprung
goto initmain
ORG 0x818       ; LP-Interrupt Einsprung
goto initmain

;************************************************* ****
; Initialisierung
ORG 0x828
initmain
movlw B'11111111'        ; PortB auf Eingang
movwf TRISB
movlw B'00000000'     ; PortD auf Ausgang
movwf TRISD
movlw H'0D'   ; Alle optionalen Analogeingänge mit Ausnahme von 
AN0,AN1 (PA0,PA1)
movwf ADCON1     ; werden auf digital In/Out initialisiert
bcf INTCON2,7       ; PortB mit Pull up Widerstaenden

;************************************************* ****
; Hauptprogramm
mainloop
btfss PORTB,2
goto input
goto mod

input
clrf WREG,0
clrf LATD,0
bsf bitposition,7
goto egalwo


egalwo
btfsc PORTB,0
goto highflanke ;=1
goto egalwo

highflanke
movlw B'0001'
movwf flanke,0
movf PORTB,WREG
cpfseq flanke,0
goto lowflanke
goto highflanke

lowflanke
clrf flanke
movf PORTB,WREG
cpfseq flanke,0
goto trolololo
goto lowflanke

trolololo
addlw B'0001'
addwf zaehler,1,0
btfsc zaehler,3
goto mainloop
btfss PORTB,1       ;Abfrage von PB.1
goto inputlow     ;Wenn 0 dann Sprung zu "einlesenlow"
goto inputhigh

inputhigh         ;Abfrage welches Bit als 1 eingelesen werden soll
btfsc bitposition,7     ;Abfrage von LATD.7
bsf wert,7       ;Wenn LATD.7 gesetzt dann muster.7 auf 1 setzen
btfsc bitposition,6     ;Abfrage von LATD.6
bsf wert,6       ;Wenn LATD.6 gesetzt dann muster.6 auf 1 setzen
btfsc bitposition,5     ;Abfrage von LATD.5
bsf wert,5       ;Wenn LATD.5 gesetzt dann muster.5 auf 1 setzen
btfsc bitposition,4     ;Abfrage von LATD.4
bsf wert,4       ;Wenn LATD.4 gesetzt dann muster.4 auf 1 setzen
btfsc bitposition,3     ;Abfrage von LATD.3
bsf wert,3       ;Wenn LATD.3 gesetzt dann muster.3 auf 1 setzen
btfsc bitposition,2     ;Abfrage von LATD.2
bsf wert,2       ;Wenn LATD.2 gesetzt dann muster.2 auf 1 setzen
btfsc bitposition,1     ;Abfrage von LATD.1
bsf wert,1       ;Wenn LATD.1 gesetzt dann muster.1 auf 1 setzen
btfsc bitposition,0     ;Abfrage von LATD.0
bsf wert,0       ;Wenn LATD.0 gesetzt dann muster.0 auf 1 setzen
rrncf bitposition,1     ;Rotieren von LATD um 1 nach rechts
goto trolololo       ;Sprung zu "hlschleife"

inputlow
btfsc bitposition,7     ;Abfrage von LATD.7
bcf wert,7       ;Wenn LATD.7 gesetzt dann muster.7 auf 1 setzen
btfsc bitposition,6     ;Abfrage von LATD.6
bcf wert,6       ;Wenn LATD.6 gesetzt dann muster.6 auf 1 setzen
btfsc bitposition,5     ;Abfrage von LATD.5
bcf wert,5       ;Wenn LATD.5 gesetzt dann muster.5 auf 1 setzen
btfsc bitposition,4     ;Abfrage von LATD.4
bcf wert,4       ;Wenn LATD.4 gesetzt dann muster.4 auf 1 setzen
btfsc bitposition,3     ;Abfrage von LATD.3
bcf wert,3       ;Wenn LATD.3 gesetzt dann muster.3 auf 1 setzen
btfsc bitposition,2     ;Abfrage von LATD.2
bcf wert,2       ;Wenn LATD.2 gesetzt dann muster.2 auf 1 setzen
btfsc bitposition,1     ;Abfrage von LATD.1
bcf wert,1       ;Wenn LATD.1 gesetzt dann muster.1 auf 1 setzen
btfsc bitposition,0     ;Abfrage von LATD.0
bcf wert,0       ;Wenn LATD.0 gesetzt dann muster.0 auf 1 setzen
rrncf bitposition,1     ;Rotieren von LATD um 1 nach rechts
goto trolololo       ;Sprung zu "hlschleife"

mod
btfss PORTB,3
goto firstway
goto secondway

firstway
btfss PORTB,4
goto static
goto rotate

secondway
btfss PORTB,4
goto signal
static
btfss PORTB,3
movff wert,LATD
goto mod

rotate
movff wert,LATD
btfss PORTB,4
goto mod
rrncf LATD
call Delay
goto rotate

signal
movff wert,LATD
call delay
btfss PORTB,3
goto mod
clrf LATD
call delay
goto signal







;****************************************
; Warteschleife für 250ms bei tm = 250ns
; (2+[2+{2+(8*215-1)}*142-1]*9-1)mz = 2.199.448 mz
; 2.199.448 * 250ns = 549.862.000ns ~ 549ms
;****************************************

Delay
bcf STATUS, C
movlw D'009' ; (1)
movwf loopzaehler3,0 ; (1)
Wait1msa movlw D'142'     ; (1)
movwf loopzaehler2,0       ; (1)
Wait1msb movlw D'215'       ; (1)
movwf loopzaehler1,0       ; (1)
Wait1msc nop         ; (1) x 5
nop
nop
nop
nop
decfsz loopzaehler1,1,0       ; (1)/(2)
goto Wait1msc         ; (2)
decfsz loopzaehler2,1,0       ; (1)/(2)
goto Wait1msb         ; (2)
decfsz loopzaehler3,1,0       ; (1)/(2)
goto Wait1msa         ; (2)
return

END


Mein Programm das ich derzeit erreicht habe, nach langer Zeit.
Ich habe nur Probleme bei der Zeitverzögerung.
Wir haben ein Beispiel von 250ms als Zeitverzögerung bekommen, hab ich 
erstmal mit reingenommen.

Nur verstehe ich die Rechnung nicht wirklich auf dem PDF das ich 
gekriegt habe.

: Bearbeitet durch User
von Volker S. (vloki)


Lesenswert?

Markus S. schrieb:
> Mein Programm das ich derzeit erreicht habe, nach langer Zeit.

L**ser - Das habe ich schon mal gesehen
(ich hatte es schon beim ersten Versuch gefunden ;-)

http://www.elitepvpers.com/forum/general-coding/3554222-hilfe-bei-assembler.html



PS: PC-Programmierung  != PIC-Programmierung

: Bearbeitet durch User
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.