mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Kleines Programm geht nicht


Autor: Avusgalaxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, ist leider ein doppelpost, habs falsch reingeschrieben.

Mit diesem Programm möchte ich erzielen, einfach eine Led mit den 2
Interuppt`s per PWM heller oder dunkler zu machen. Doch mein Problem
ist, das
beim Debugger bei LJMP Init nicht auf Init sondern gleich am Anfang in
den zweiten Interuppt springt. Hab ich da was falsch gemacht?




INCLUDE 89c52.mc




LJMP Init             'Überspringe Interruptroutine nach einem Reset



(0003h): ;Interuppt 0


  INC R0
  IF R0 > #DFh THEN MOV R0,#DFh

  RETI

(0013h): ;Interuppt 1


  DEC R0
  IF R0 < #2Fh THEN MOV R0,#2Fh

  RETI


(000Bh):        'Einsprungadresse Interrupt Timer 0

  MOV TH0,#FFh      'High Byte vom Timer 0 setzen
  MOV TL0,R0      'Low Byte vom Timer 0 setzen
  SETB P0.0
  CLR P0.0



RETI          'Zurück aus der Interruptbehandlung ins Programm


'************************************************


Init:

  MOV SP,#10h      'Stackpointer hinter die Registerbank 1
  MOV R0,#DFh




  'Grundeinstellung des Timer 0 und der dazugehörigen Interrupts:
  MOV TMOD,#01h       'Timer 0 Modus = 1
  MOV TH0,#FFh      'High Byte vom Timer 0 setzen
  MOV TL0,R0      'Low Byte vom Timer 0 setzen
  SETB EA        'Interruptbehandlung aktivieren
  SETB ET0        'Interrupt für Timer 0 aktivieren
  SETB TR0        'Timer 0 Start
  SETB EX0    ;Interuppt 0 ein
  SETB EX1    ;Interuppt 1 ein
  SETB P0.0

'************************************************

Programm:


  JMP Programm

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieht nach 8051-Code aus aber gibs da wirklich so was wie IF und THEN
als Assemblerbefehle???
In Basic OK aber in Assembler?
Oder hast Du da nen Basic-Compiler in dem man direkt ASM-Befehle
schreiben kann?
Wer mir neu.

Gruß
Andi

Autor: Avusgalaxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe das Prog-Studio von Batronix. Da kann man ohneweiters
Basic-Befehle miteinbinden. Die funktionieren 100 Prozentig

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man, bist Du faul ;-)
Die vier ASM-Befehl zum Prüfen und setzen kannst Du doch auch noch rein
hacken.

Gruß
Andi

Autor: Avusgalaxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Andi.

Tut mir leid, ich bin nicht faul. Ich hatte dieses Problem schon öfter,
nur bin ich bis jetzt nicht draufgekommen. Ich meine mit LJMP Init muß
er doch zu Init springen, oder nicht? Hab ich da was übersehen oder von
der Programmstruktur was falsch gemacht?

Warum bezeichnest du mich als faul?

Ich möchte dieses kleine Programm noch bei einem großen Programm
einbinden, und es funktioniert nicht mal so.

Wenn ich dann nach langem nicht draufkomme, dann werde ich doch mal ins
Forum schreiben darfen, damit mir dann klügere Leute weiterhelfen
können.

Gruß Avus

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt nims nicht übel oder hast Du den Wink übersehen?
Habe zwar schon nen Überblick über die ASM-Befehle vom 8051 aber bis
jetzt noch nix mit 8051 gemacht.
Habe bisher "nur" was mit AVR-ASM, 68000-ASM und ganz früher was mit
Z80-ASM gemacht.

Setzt Du mit den Hex-Zahlen in Klammern eigentlich die Prog-Adresse?
Liegts vielleicht daran?

LJMP ist eigentlich ein Long-Jump und müßte damit gehen.
Ansonsten lass doch mal die Adressen in Klammern weg und/oder probiers
mit JMP.

Gruß
Andi

Autor: Avusgalaxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es sind die Programmadressen..

0000h ist z.B. der Reset, also der erste Befehl
0003h ist Externer Interuppt 0
0013h ist Externer Interuppt 1

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da muß wohl doch ein Spezialist ran der sich mit der
Interrupt-Organisation im 8051 auskennt.
HAAAALLLOOOOOOOO!

Gibs beim 8051 nicht ab Adresse 0000h eine Vektor-Liste wo man die
Sprünge zu den Interrupt-Progs setzen muss?

Schau mal im Datenblatt zum 8051 nach zwecks Interrupts.

Gruß
Andi

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

der Interrupt für Timer0 überschreibt den für INT1 teilweise. Du
solltest die Routinen für die INT-Bearbeitung auslagern und vom
INT-Vektor mittels LJMP anspringen.

Matthias

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich vergaß:

Manuelle Zuordnungen werden jetzt dauerhahaft und Positionsunabhängig
in der 3dusrpac.dat gespeichert.

Matthias

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

mift. Falscher Thread. Tabbed Browsing verwirrt manchmal.

Matthias

Autor: Markus_8051 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast vor dem LJMP Init keine Adresse angegeben. Wo soll er nun
anfangen, den Code zu generieren?

Wird in 89c52.mc auch Code erzeugt? Wo wird der hinassembliert?

Gruß,
Markus_8051

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.