www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Blinkende LED an 8051


Autor: Mathias D. (pfmd86)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe meine ersten Erfolge mit dem 8051 zu verzeichnen. Sprünge mit jmp 
und bedingte Sprünge und der Befehl mov sind erkundet. Eine leutende LED 
an sich ist aber langweilig. Wie bekommt man jetzt ein blinken hin??? 
dazu muss ich sicher an den Timer des µC, oder? Kann mir das einer näher 
erklären=

Autor: norad (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Mathias Denzin


>Wie bekommt man jetzt ein blinken hin???
>dazu muss ich sicher an den Timer des µC, oder? Kann mir das einer näher
>erklären=

Ein Timer ist nicht unbedingt nötig, denn mit ner Warteschleife gehts 
auch.

Siehe Anhang!

Aber Warteschleifen haben den Nachteil das der µC auch nichts anderes 
tut als die Warteschleife abzuarbeiten.

Eine bessere Lösung wäre einen Timer zu verwenden der alle 50ms einen 
Ausgang toggelt.

Dann könnte µC auch andere Dinge erledigen.


MFG
norad

Autor: Mathias D. (pfmd86)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also mein Assembler kann damit nix anfangen: soll "0h" die 0 in HEX 
sein??? Ich bekomme es nichtmal simuliert um mir das anzugucken, wie es 
geht...

Warnungen/Fehler:
Zeile 1:5     DelayCounter0           DATA      0h ;>err6: unbekannter 
Befehl bzw. Sprungziel nicht gefunden
Zeile 1:6     DelayCounter1           DATA      1h ;>err6: unbekannter 
Befehl bzw. Sprungziel nicht gefunden
Zeile 1:7     DelayCounter2           DATA      2h ;>err6: unbekannter 
Befehl bzw. Sprungziel nicht gefunden
Zeile 1:10 ORG 0h ;>err11: Adresse liegt in eventuell beschriebenem 
Bereich
Zeile 1:27         PUSH  DelayCounter0 ;>err7: Variable nicht erkannt
Zeile 1:28         PUSH  DelayCounter1 ;>err7: Variable nicht erkannt
Zeile 1:29         MOV   DelayCounter1, #86H ;>err1: ungültige 
Operandenkombination
Zeile 1:31         MOV   DelayCounter0, #29H ;>err1: ungültige 
Operandenkombination
Zeile 1:40         DJNZ  DelayCounter0, ____2_Delay0 ;>err1: ungültige 
Operandenkombination
Zeile 1:41         DJNZ  DelayCounter1, ____1_Delay0 ;>err1: ungültige 
Operandenkombination
Zeile 1:42         POP   DelayCounter1 ;>err7: Variable nicht erkannt
Zeile 1:43         POP   DelayCounter0 ;>err7: Variable nicht erkannt

 45 Zeilen übersetzt. Code Ende bei 002Bh.
 4 Labels:
  Main: 0003h
  Delay0: 000Bh
  ____1_Delay0: 0014h
  ____2_Delay0: 0017h

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Neee, an den Timer musst Du da auch nicht. Kannst Du ebenfalls mit 
Zeitschleife machen (auch genannt: "busy waiting"). Es gibt einen 
asm-Befehl namens "complement bit", müsst in 8051asm "cpl" sein. Damit 
änderst Du den Status des Pins. Also aus 1 wird 0 u.u.

Grütze,

t


pseudocode:

endlos:
cpl led_pin
verzögerung_nach_wahl
ljmp endlos

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
argh
Bitte letzten post ignorieren  :)

Autor: lontano (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Augen weit aufmachen: 50 ms ! Turbo Impulse! oder mehrere delays 
hintereinender...fuer den Anfang ;-)

Autor: jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Bitte letzten post ignorieren  :)

Du mußt ja nur ljmp durch sjmp ersetzen.

Autor: Mathias D. (pfmd86)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas wrote:

> pseudocode:
>
> endlos:
> cpl led_pin
> verzögerung_nach_wahl
> ljmp endlos

Das mit dem cpl hab ich glaub ich gerallt... Kann ich damit auch 
komplette Ports umdrehen, also bewirkt

mov P0,#10101010b
cpl P0

dann P0 = 01010101 ???

Richtig verstanden???
Aber wir bekomme ich denn die Verzögerung von z.B. 1 Sekunde oder 0,5 
Sekunde hin???

Autor: jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warten:
  djnz R2, Warten
  djnz R3, Warten
  djnz R4, Warten
ret

R4 muß vor Aufruf der Warteschleife auf 20 bis 100 eingestellt werden,
damit das Ganze nicht zu lang wird.

mov R4, #20d
Warten

Autor: jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Verzögerung kannst Du ja mal zur Übung ausrechnen ;-)

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JA, cpl invertiert auch komplette Ports.
Die Verzögerung kann durch zwei Zählvariablen und entsprechend auch zwei 
ineinander verschachtelte Schleifen erreicht werden.

Pseudocode: (Ohne Garantie)
mov register1, startwert1
mov register2, startwert2
:schleife2
:schleife1
djnz register1, schleife1;
mov register1, startwert1;
djnz register2, schleife2;

Die Startwerte sind von Null verschiedene Byte-Zahlen. Es wird rückwärts 
gezählt.
Nebenbei gesagt, die Fehler "ungültige Operandenkombination" könnten 
daher kommen, daß Register statt RAM-Variablen verwendet werden müssen.

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mathias Denzin wrote:

> Das mit dem cpl hab ich glaub ich gerallt... Kann ich damit auch
> komplette Ports umdrehen, also bewirkt

Versuchst du gerade Assembler ohne Docu zu lernen? Das geht bestimmt 
nicht gut. Ich würde dir dieses PDF ans Herz legen wollen:

http://www.atmel.com/dyn/resources/prod_documents/...


> mov P0,#10101010b
> cpl P0
>
> dann P0 = 01010101 ???

Nein, laut Doku kann der 8051 nur den Accu oder eine einzelne Bitadresse 
"complementieren" als invertieren. Oben beschriebender Code dürfte nicht 
das tun, was man erwarten würde, da man mit P0 einen ganzen 8-Port 
adressiert.

Du müsstest also P0 erst in den Accu holen, diesen dan mit "cpl a" 
invertieren und dann den Accu wieder in P0 schreiben, um das zu tun, was 
du möchtest.

Was pausenschleifen betrifft, eigenet sich der DJNZ (Decrement and jump 
on not-zero) Befehl. Bei höheren Taktraten sollten die Warteschleifen 
verschachtelt werden, um Frequenzen zu erzeugen, die innerhalb des 
sichtbaren Bereiches liegen..

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian wrote:
> JA, cpl invertiert auch komplette Ports.

Entweder ist das nicht richtig oder ich hab einen Passus in der 
Assemblerreferenz überlesen...

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja, sorry. Daß man einen ganzen Port komplementieren kann, war wohl 
ein Trugschluß.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian wrote:
> Ach ja, sorry. Daß man einen ganzen Port komplementieren kann, war wohl
> ein Trugschluß.

Nö, kann man:

xrl p0, #0FFh


Peter

Autor: MC (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man kann einen ganzen Port invertieren, wenn man über den Akku geht:

mov a,p0
cpl a
mov p0,a

(wenn ich mich nicht irre).

Autor: norad (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Mathias Denzin


>Also mein Assembler kann damit nix anfangen: soll "0h" die 0 in HEX
>sein??? Ich bekomme es nichtmal simuliert um mir das anzugucken, wie es
>geht...


Also bei mir funzts.

Ich kann nur vermuten das Du die Include Datei deines µC vergessen hast 
einzutragen.

Ich hatte es absichtlich weg gelasssen da ich nicht wusste welchen µC 
und Entwicklungsumgebung Du verwendest. Sorry.

mfg
norad

Autor: norad (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Mathias Denzin

    DelayCounter0           DATA      0h    entspricht R0
    DelayCounter1           DATA      1h    entspricht R1
    DelayCounter2           DATA      2h    entspricht R3

Im Anhang habe ich ein Dokument hinterlegt die die Speicherorganisation 
des 8051er aufzeigt. Ich hoffe Du kannst damit was anfangen bzw. mal 
näher
ansehen und dich damit beschäftigen.

Da die Delay0 routine Automatisch erstellt wurde, sieht es auch etwas 
verwirrend aus. Man hätte es auch so machen können.


Delay0:
        PUSH PSW
        MOV  R1, #86H
____1_Delay0:
        MOV  R0, #29H
____2_Delay0:
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        DJNZ  R0, ____2_Delay0
        DJNZ  R1, ____1_Delay0
        POP   PSW
        RET

Da man Register nicht direkt mit dem Namen R0 oder R1
PUSHen und POPen kann, muss man einen Namen vereinbaren.
Z.b.   REG0   DATA  0h  für Register 0  (R0)  siehe Anhang


Jetzt bist Du dran.  ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.