Forum: Mikrocontroller und Digitale Elektronik Lauflicht mit 16f88 pic


von Denis (Gast)


Angehängte Dateien:

Lesenswert?

Hey zusammen,

ich habe mein lauflicht so weit Programmiert das die Led nach der
Reihe an gehen und bleiben ann ,jetzt komm ich nur nicht mehr aus
der schleife raus .So das alle led´s wieder ausgehen und von vorne
das Lauflicht loslegt. Vill hat jemand von euch eine ansatz lösung oder 
so

von Holger W. (holgerw)


Lesenswert?

Hallo,

mach dir um die Befehle
call schleife ; Wartezeit
rlf PORTB,f ; laufen zur nächsten LED

eine Schleife, ähnlich wie in den Wartezeiten,
also neue Variable mit Wert laden, deinen Port bedienen, danach die 
Variable erniedrigen und wenn nicht 0 dann wieder deinen Port bedienen.
Ist die Schleife 0 dann kannst du so ähnlich die LED in einer weiteren 
Schleife wieder zurücklaufen lassen.

Ganz am Ende springst du wieder nach m1 und der Ablauf geht von vor los.

Das wäre zumindest erstmal der einfachste Ansatz.
Später dann mit Statemachine und Timer...

Holger

von Denis (Gast)


Lesenswert?

Hey

habe versucht deine Idee um zu setzten habe es leidern icht hin 
bekommen,
stehe immer noch vor dem Problem das Lauflicht von vorne Starten zu 
lassen.
Vill kurz schreiben un mir zeigen wie es aussehen soll oder so
danke

gruß
denis

von Holger W. (holgerw)


Lesenswert?

Hallo,

also ein Listing als PDF dranzuhängen ist keine gute Idee, das kann man 
nicht richtig rauskopieren.
Da ich nur noch mit 18F programmiere hoffe ich die Befehle vom 16F 
stimmen noch. Das unten ist ungetestet, sollte aber zumindest das 
Prinzip erklären.
Was du mit der LED machst, vorher setzen, löschen usw. musst du dir 
selbst ausdenken und testen.

DECFSZ zieht von counter1 immer 1 ab und wenn das 0 ergibt (Zero 
gesetzt) wird der nächste Befehl übersprungen, ansonsten springt er 
immer wieder zu m1 bzw. m2 zurück.

RLF und RCF rotieren immer durchs Carry, du kannst also das was 
reingeschoben wird (0 oder 1, vorn oder hinten, LOL) durch setzen und 
rücksetzen des Carry Flag bestimmen. Da das Carry von der vorhergehenden 
Operation beeinflusst werden kann, solltest du es im Code direkt immer 
setzen oder löschen.


Also versuch mal selbst das einzufügen, wenn es nicht klappt dann als 
Textfile anhängen

- neue variable z.b. counter1  im cblock einfügen
1
mainloop:
2
3
     bcf PORTB,0 ; LED an RB0 einschalten
4
    
5
     movlw 0x08  ; 8 x durchlaufen lassen
6
     movwf counter1
7
8
m1:  call schleife ; Wartezeit
9
     bsf STATUS,C  ; immer eine log. 1 nachschieben
10
     rlf PORTB,f ; laufen zur nächsten LED
11
     decfsz counter1  ; counter1 - 1 und übergehe nächst. befehl, wenn 0
12
     goto  m1
13
     
14
15
     bcf PORTB,7 ; LED an RB0 einschalten (sicherheitshalber)
16
17
     movlw 0x08  ; 8 x durchlaufen lassen
18
     movwf counter1
19
20
m2:  call schleife ; Wartezeit
21
     bsf STATUS,C  ; immer eine log. 1 nachschieben
22
     rrf PORTB,f   ; zurückrotieren
23
     decfsz counter1  ; counter1 - 1 und übergehe nächst. Befehl, wenn 0
24
     goto  m2
25
26
; weitere spielereien.....
27
28
     goto mainloop

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.