" 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
:
Bearbeitet durch User
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...
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.