Forum: Mikrocontroller und Digitale Elektronik Lauflicht Pic 16f877


von Alexander S. (picistsuper)


Lesenswert?

Hallo, könnt ihr mir mit dem Lauflicht helfen?
Ich weiß einfach nicht wo mein fehler ist...
Wäre sehr dankbar!!!

1
    list        p=16F887        ; PIC Typ festlegen
2
    #include    <p16f887.inc>   ; passende Include Datei nachladen
3
4
    __config _CONFIG1, _LVP_OFF&_FCMEN_OFF&_IESO_OFF&_BOR_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC
5
    __config _CONFIG2, _WRT_OFF&_BOR40V
6
7
;**********    Variablen deklarieren    **********
8
  
9
    Zaehler1      EQU    H'20'
10
    Zaehler2      EQU    H'21'
11
;**********    Vektoren setzen    **********
12
13
  org    0x0000        ; Einsprungadresse bei Start/Reset  
14
  goto  Start    
15
16
  org    0x0004        ; Einsprungadresse für den Interrupt
17
  retfie  
18
19
;**********    Hauptprogramm    **********
20
21
  org    0x0010  
22
23
Start:
24
25
  
26
;Init
27
28
movlw    B'00000000'      
29
BANKSEL  TRISB            
30
movwf   TRISB    
31
32
Ausgabe:
33
34
35
movlw   B'00000001'
36
movwf  PORTB
37
38
Loop:
39
40
bcf    STATUS,C
41
rrf    PORTB,F
42
goto  Loop
43
44
45
46
;**********    Unterprogramme    **********
47
Warte:                  ;
48
 movlw      D'255'      ;
49
 movwf      Zaehler1    ;
50
51
Schleife1:              ;
52
 movlw      D'255'      ;
53
 movwf      Zaehler2    ;
54
55
Schleife2:
56
 decfsz     Zaehler2,f  ;
57
 goto       Schleife2   ;
58
 decfsz     Zaehler1,f  ;
59
 goto       Schleife1   ;
60
61
 return
62
63
;**********    Ende    **********
64
    
65
  end

von stepp64 (Gast)


Lesenswert?

- Warteschleife wird nicht aufgerufen
- Du löscht Carry und schiebst dieses in den Port? Da sollte also
  nach 8 Durchläufen alles auf 0 stehen...
- sofern Port B auch analoge Ports hat (das weiß ich nicht aus dem Kopf)
  musst du die Ports erst noch auf digital initialisieren
- schau bei sprut nach

von Ingo (Gast)


Lesenswert?

Auweia, ich hoffe du stellst dein Auto nicht irgendwann mal vor die 
Werkstatt  mit einem Zettel auf dem steht: "Bitte reparieren". Wie wäre 
es denn mit ner Fehlerbeschreibung du Witzbold???



Ingo

von Alexander S. (picistsuper)


Lesenswert?

Entschuldige Ingo, bin nicht so vertraut mit Foren aber du hast schon 
recht.
Habe jetzt das Programm bischen umgeändert. Resultat: eine LED blinkt 
und das wars.
1
Start:
2
  org    0x0010    
3
;Init
4
5
movlw    B'00000000'      
6
BANKSEL  TRISB            
7
movwf   TRISB    
8
9
Ausgabe:
10
movlw   B'00000001'
11
movwf  PORTB
12
13
Loop:
14
call  Warte
15
rrf  PORTB,F
16
goto  Loop

von Dennis S. (Gast)


Lesenswert?

Hi,

wie bereits geschrieben:

Loop:

bcf    STATUS,C
rrf    PORTB,F
goto  Loop

DIese Schleife läuft unendlich, das ist schon mal der richtige Start. Du 
setzt nun vorher das Bit ganz rechts, und schiebst es im ersten 
Durchlauf nach rechts raus. Also erstmal rlf nutzen, oder vorhher das 
Bit ganz links setzen.
Dann musst du noch dafür sorgen das es wenn es ganz links angekommen ist 
wieder rechts gesetzt wird, damit das LL im "Kreis" läuft.
Damit man das ganze dann noch sieht sollte man ein großes Wait einbauen. 
Zählen bis 1Mio sollte erstmal ausreichén damit du überhaupt was 
siehtst, ansonsten leuchten alle 8 LED recht dunkel und du siehst das LL 
nicht...

DS

von Ingo (Gast)


Lesenswert?

Ich glaube du schiebst in die falsche Richtung...

von Dennis S. (Gast)


Lesenswert?

...das Wait zählt bis 255*255 schon mal ganz gut, wird wohl erstmal 
ausreichen :-) jenachdem was für einen Systemtakt du dort hast. PIC 
teilt inter erstmal durch 4, zumindest die 16er machen das...

von Dennis S. (Gast)


Lesenswert?

Ingo: du glaubst richtig, wie bereits geschrieben...

von Alexander S. (picistsuper)


Lesenswert?

Danke schon mal für eure Antworten!

habe jetzt das Programm bischen umgeändert aber funktionieren tut es 
nicht.
Es leuchtet kurz die rechte LED auf und das wars... :(
1
Start:
2
  org    0x0010  
3
;Init
4
5
movlw    B'00000000'      
6
BANKSEL  TRISB            
7
movwf   TRISB    
8
9
;Bereite
10
11
BANKSEL  PORTB
12
movlw   B'00000001'
13
movwf  PORTB
14
bcf    STATUS,C
15
16
Lauf:
17
18
call  Warte
19
rlf    PORTB,f
20
btfsc  STATUS,C
21
goto  Lauf

von Chris B. (dekatz)


Lesenswert?

So wirst du das Carry-Flag nie zürück auf Bit#0 bekommen weil ganz 
sicher in deiner "Warte"-Routine das C irgendwann verändert wird.
Definiere für das Lauflicht eine Variable z.B. <lauflicht>

movlw b'00000001'
movwf lauflicht

Lauf
BANKSEL lauflicht
rlf   lauflicht,F   ;aktuelles Muster verschieben
btfsc STATUS,C      ;wenn "0" ins CARRY rutsch nix machen
bsf   lauflicht,0   ;ansonst Übertrag der "1" aus Bit #7 in Bit #0
movf  lauflicht,W
BANKSEL PORTB
movwf PORTB
call  Warte
goto  Lauf

ungetest so aus dem Stegreif... ausserdem hat MPLAB auch 'n Simulator 
der bei solchen trivialen Dingen ganz sicher funkteoniert....

von Chris B. (dekatz)


Lesenswert?

Ach so....vor <BANKSEL lauflicht> gehört noch ein <bcf STATUS,C> rein...

von Dennis S. (Gast)


Lesenswert?

immer besser.
schau dir den Befehl:

btfsc
http://www.sprut.de/electronic/pic/assemble/befehle.html#btfsc
mal an.

der überspringt den Folgebefehl wenn das getestete bit = 0 ist.

Was steht in deinem Programm wenn man den Befehl nach dem btfsc 
überspringt? :-)

http://www.sprut.de/electronic/pic/assemble/befehle.html#rlf

Wenn dir das Bit nach links "raus" läuft, dann ist es weg. Ein weg ist:

routieren.
ausgeben.
warten.
prüfen ob bit ganz links gesetzt
Ja: lade 0000 00001
nein: gehe nach oben.

DS

von Alexander S. (picistsuper)


Lesenswert?

Viel Dank für eure Antworten!!
Habe jetzt das hier rausbekommen aber klappt immer noch nicht...
Zuerst leuchtet die linke LED und dann alles auf ein mal...
Bin ich irgendwie zu doof dafür?!


Start:
  org    0x0010

;Init

movlw    B'00000000'
BANKSEL  TRISB
movwf   TRISB

Bereite:
BANKSEL  PORTB
movlw  B'00000001'
movwf  PORTB
bcf     STATUS,C

Lauf:
rlf  PORTB,f
movwf  PORTB
call  Warte
btfsc  STATUS,Z
goto  Bereite
goto  Lauf

von Chris B. (dekatz)


Lesenswert?

Wozu testest du das ZERO-Flag????
Völlig sinnlos nach der Warteschleife (wäre auch nach dem "rlf" sinnlos, 
weil die Rotate-Befehle keinen Einfluß auf das ZERO-Flag haben).

Vielleicht solltest du dir mal das Datenblatt und darin die 
Befehlsübersicht vornehmen....

von Dennis S. (Gast)


Lesenswert?

hi,

guter Ansatz. Nur wie schon beschrieben, Zeroflag wird nicht beeinfluss 
:-) ansosten schon ein guter Ansatz. Ist ganz normal, aus Fehlern lernt 
man, zumal es nicht ersichtlich ist, wenn man Anfänger ist :-)

btfsc hast du also verstanden :-) klasse.

Versuche es mal nach meiner letzten beschreibung. Teste das 7te Bit im 
Port nach der ausgabe und nach dem wait.

Am besten ist es wenn du dir mal einen PAP machst.

http://de.wikipedia.org/wiki/Programmablaufplan

übrigens: soetwas geht auch

btfsc   Register,Bit
call    Funktion
goto    Label_x

dabei musst nur bedenken dass am ende immer zum Label_x gegangen wird, 
egal wie das Bit steht, denn call kommt aners als ein goto an die stelle 
zurück :-)

Zur Lösung brauchst du das Carryflag nicht.

DS

von Ottmar K. (wil1)


Angehängte Dateien:

Lesenswert?

Hallo Alexander,

beigefügt ist Dei Lauflicht, welches zumindest im Watchfenster von MPLAB 
SIM durchläuft.
Das Lauflicht wird mit Hilfe des Carrybits von STATUS "am Leben" 
gehalten. Lies Dir den Code durch, lese dazu die verwendeten Befehle im 
Datenblatt nach, bis Du die Funktion der Befehle zueinander verstanden 
hast.
Du kannst ja noch "Warten" durch das Einfügen einer weiteren äußeren 
Schleife welche auf 6 Zählt (4MHz-Quarz) auf ca. 1 s erweitern.

mfG Ottmar

von Dennis S. (Gast)


Lesenswert?

du bist selbst kurz vor der Lösung :-) Ich würde nicht "abschreiben".

DS

von Alexander S. (picistsuper)


Lesenswert?

Ottmar vielen Danke für das Programm!

Dennis, habe jetzt bei btfsc PORTB,7 geschrieben aber irgendwie will es 
immerno noch nicht...habe noch bischen rumetestet aber klappte einfach 
nichts....ich weiss nicht mehr weiter.

von John B. (johnbauer)


Lesenswert?

rlf   PORTB,F
 Das Ergebnis von rlf wird in das Ausgangsregisgter von Port B 
gespeichert
movwf PORTB
 und hier wird es gleich wieder überschrieben.

von Ottmar K. (wil1)


Angehängte Dateien:

Lesenswert?

Hallo Alexander,

nein, Du sollst nicht abschreiben, aber lesen und verstehen! Noch besser 
in MPLAB, mit dem Simulator und dem Watch-Fenster den Code Befehl um 
Befehl durchgehen und dabei die Inhalte der einzelnen Register (einfach 
in das Watchfenster ziehen) beachten.
Wenn Du ein Programm schreiben willst, solltest Du (falls noch nicht 
geschehen), die umfangreichen, auch mächtigen Hilfsmittel der MPLAB-IDE 
nutzen (lernen).

mfG Ottmar

von D.S. (Gast)


Lesenswert?

entweder so:

rlf  PORTB,w
movwf  PORTB

oder so:

rlf  PORTB,f

wobei erstes dazu gebraucht wird wenn das verschobene Ergebnis im 
Arbeitsregister weiterverarbeitet werden soll,wie bei einer 
Multiplikation oder wenn es in einer anderen Ram Zelle abgelegt werden 
soll.

Das Banksel musst du übrigens auch nicht ständig machen. Ich kenne 
jedoch diese Schreibweise:

BANKSEL  PORTB

nicht, bzw weiß nicht was dahinter steckt. Eigentlich geht es um die 
RP/RS Bits im Status reg, die passen müssen.

Habe ich gerade mal nachgesehen:

http://www.sprut.de/electronic/pic/grund/adress.htm#banksel

das ist ja furchtbar. Der Controller ist dann nur noch mit dem Setzen 
der Banksel Bis zu machen....

Tip: Schreibe das komplette Programm auf Bank0 und nur wenn du mehr 
brauchst oder mal etwas aus einer anderen Bank, schalte kurz darauf um 
und schnell wieder zurück. Dann muss man sich um die Bank auch nicht 
wirklich gedanken machen...

Tip2: Steige auf Atmel um :-) ist die bessere Wahl meiner Meinung nach. 
Es gibt dazu aber wirklich viele Diskussionen - muss man letztendlich 
selber wissen.

DS.

von Ottmar K. (wil1)


Lesenswert?

D.S. schrieb:
> das ist ja furchtbar. Der Controller ist dann nur noch mit dem Setzen
> der Banksel Bis zu machen....

Na ja, so tragisch ist dies bei den PICs auch wieder nicht:
1. Mann (Frau..) weiß, dass die Datenrichtungsregister (TRISA, TRISB 
usw) in Bank 1 sind.
2. In jedem Datenblatt ist eine Übersicht enthalten aus der ersichtlich 
ist in welcher Bank das jeweilige Register sich befindet.
3. 90% oder mehr des Codes lwerden mit den Registern in Bank 0 
abgewickelt.
4. Diskussionen "Atmel besser als PIC" oder umgekehrt, sind überflüssig 
und können zigfach mit der Suchfunktion im Forum nachgelesen werden.

Zum Lernverfahren hier im Thread:
Das "Hinwerfen" einzelner Codezeilen bringt kaum einen Lerneffekt. 
Besser ist es einen funktionierenden Code, übersichtlich und 
zusammenhängend dargestellt, durchzuarbeiten und zu verstehen.
Unabdinglich ist es dazu, im Datenblatt die Funktionsmöglichkeiten der 
einzelen Register, sowie der Assemblerbefehle nachzulesen.
Dazu ist es nicht schlecht sich über die Hilfen welche die 
Entwicklungsumgebung (MPLAB-IDE) bietet zu nutzen.

Im MPLAB-Simulator (Einzelschritt, Animation Breakpoints usw) + 
Watchfenster (Registerinihalte) ist z.B. die Funktin von RRF bzw RLF, 
die Auswirkung hierbei auf STATUS,C (Carrybit) und der Zustand der 
PORTB-Ausgängen RB7-RB0 problemlos und einleuchtend zu erkennen.

Schon mit den vorgenannten Hilfsmitteln sind je nach Komplexität des 
Codes fast alle Fehler zu erkennen.

Weitere Hilfsmittel der MPLAB-IDE:
_Stimulus (Eingänge High- Low setzen, Pin- Register Aktionen usw)
-File-Register-Fenster (Adressen, Inhalte)
-Programm-Memory-Fenster
-*.LST-Files  (Programmaufbau, Adressen usw)

@Alexander
...also ran an den Speck, das zielgerichtete, systematische Lernen der 
Programmierung von Microcontroller macht doch Spass und ist wirklich 
kein Hexenwerk :-) !

mfg Ottmar

von Dennis S. (Gast)


Lesenswert?

>>Na ja, so tragisch ist dies bei den PICs auch wieder nicht.

Naja, wenn ich vor jedem Ram Zugriff ein Banksel mache, dann ist das je 
nach Programm ganz schön tragisch, weil immer 2 Befehlszyklen verloren 
gehen, man verschenkt zeit, schau dir das bei sprut mal an. Zudem teilt 
der Pic ja vorher den Systemtakt eh noch durch 4...Aber das können wir 
dann ja mal an anderer Stelle weiterführen...

>>Das "Hinwerfen" einzelner Codezeilen bringt kaum einen Lerneffekt.

das sind keine Codezeilen sondern einzelne Assemblerbehle die wir hier 
durchgehen und Alex macht das schon recht gut. Man sieht eben nicht auf 
den ersten Blick das ein rlf keinen Einfluss auf das Zerobit hat.
Alex hat sich bis jetzt ganz gut verbessert und er steht kurz vor seiner 
Lösung :-) Es ist auch ein gutes Ziel für das erste Programm.
Eine Erklärung wie er sein Programm simulieren kann wäre doch auch eine 
gute Unterstützung.

DS.

von Ottmar K. (wil1)


Lesenswert?

Dennis S. schrieb:
> Eine Erklärung wie er sein Programm simulieren kann wäre doch auch eine
> gute Unterstützung.

@Alexander
Ich nehme diese Anregung von Dennis an, solltest Du konkrete Fragen zur 
Simulation in MPLAB haben, frage einfach!

Dennis S. schrieb:
> wenn ich vor jedem Ram Zugriff ein Banksel mache, dann ist das je
> nach Programm ganz schön tragisch, weil immer 2 Befehlszyklen verloren
> gehen, man verschenkt zeit
Das ist doch einseitig betrachtet und übertrieben! Reden wir doch hier 
besser über das Programm von Alexander! Pro und Contra Atmega/PIC Ist 
ätzend und m.E. Ansichts- und Gewöhnungssache! Mehr Kommentar zu diesem 
Themaa gibt es von meiner Seite hier nicht mehr.

mfG Ottmar

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.