"
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.
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
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 :^)
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.
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.. .
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...
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?
Du hat hoffentlich da ganze Datenblatt und nicht nur Ausschnitte...
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)
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.




