Forum: Mikrocontroller und Digitale Elektronik Motorola 6809 und Timer 6840


von Man N. (manman)


Lesenswert?

Ich habe Probleme mit der Lösung eines Programms für den Motorola 6809 
mit dem Timer 6840.

Das Programm sollte folgende Funktion haben: Der Timer (Zähler) soll 
extern über den Eingang C3 ohne Frequenzteiler (1/8) getaktet werden. 
Dabei soll der Ausgang CB2 des Portbausteins MC6821 mit dem Takteingang 
C3 des Bausteins MC6840 (Timer) verbunden werden. Der Ausgang CB2 soll 
die Funktion eines Rechteckgenerators haben (also eine 
Rechteckschwingung ausgeben).
Das Auffangregister des Zählers soll dabei mit dem Wert $00FF geladen 
werden. Über den Signalausgang O3 des Zählers soll ein  Impuls ab dem 
Zählerstand $00F0 des Auffangregisters bis zum Zählerstand $0000 
ausgegeben werden.
Zuvor, also ab Zählerstand $00FF bis 00F1 soll eine Impulspause am 
Signalausgang 03 sein.
Das Auffangregister wird beim Ablaufen des Zählzyklus  automatisch 
erneut (also zyklisch) mit dem Wert $00FF geladen.

Ich habe  mein Programm unten angefügt. Der Timer wird zwar über den CB2 
Ausgang getaktet, jedoch erscheint der Impuls am Ausgang O3 nur in jedem 
2. Zählzyklus, statt in jedem Zyklus.
Vielleicht hatte schon jemand das Vergnügen den Motorla 6809 zu 
programmieren und kann mir hoffentlich weiterhelfen.



BD F1 10   JSR CLRDISP  ; hier wird die Anzeige gelöscht

7F F0 19      CLR $F019    ;hier wird der Timer #3 selektiert
86 00         LDA #$00  ;Steuerregister des Timer #3 programmieren
B7 F0 18      STA $F018

CC 00 FF      LDD #$00FF  ;Auffangregsiter des Timer #3 laden
FD F0 1E      STD $F01E

86 01         LDA #$01  ;hier wird der Timer gestartet
B7 F0 19      STA $F019
7F F0 18      CLR $F018

10 8E 00 55   LDY #$0005  ;für Erzeugen des Impulses/Impulspause an CB2
86 34         LDA #$34  ;Led von CB2 aus, also Impulpause
B7 F0 03      STA $F003
BD F1 60      JSR DLY1MS  ;Verzögerung für die Länge der Impulspause
86 3C         LDA #$3C  ;Led von CB2 jetzt an, also Impula
B7 F0 03      STA $F003
BD F1 60      JSR DLY1MS  ;Verzögerung für die Länge des Impulses

FC F0 1E      LDD $F01E  ;Zählerstand des Auffangregisters laden
8E 00 04      LDX #$0004  ;und in der Anzeige zeigen
BD F1 23      JSR SHOWD7SG

C1 F0        CMPB #$F0  ;Vergeich ob Zählerstand bereits $00F0
27 06        BEQ    ;wenn ja, dann Impuls an Signalausgang O3
C1 00        CMPB #$00  ;Vergleich ob Zählerstand bereits $0000
27 0C        BEQ    ;wenn ja, dann Impulspause an Signalausgang O3
20 DD        BRA    ;zurück zu Impuls und Impulspause an CB2

7F F0 19     CLR $F019  ;selektieren von Timer #3
86 80        LDA #$80  ;Steuerregister von Timer für Impuls an O3
B7 F0 18     STA $F018
20 D3        BRA    ;zurück zu Impuls und Impulspause an CB2

7F F0 19     CLR $F019  ;selektieren von Timer #3
86 00        LDA #$00  ;Steuerregister von Timer für Impulspause an O3
B7 F0 18     STA $F018
20 C9        BRA    ;zurück zu Impuls und Impulspause an CB2

13           SYNC



Vielen Dank für Eure Hilfe

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> 27 06        BEQ    ;wenn ja, dann Impuls an Signalausgang O3
> 27 0C        BEQ    ;wenn ja, dann Impulspause an Signalausgang O3
> 20 DD        BRA    ;zurück zu Impuls und Impulspause an CB2


Irgendwie fehlt da was.

von Man N. (manman)


Lesenswert?

Rufus t. Firefly schrieb:
>> 27 06        BEQ    ;wenn ja, dann Impuls an Signalausgang O3
>> 27 0C        BEQ    ;wenn ja, dann Impulspause an Signalausgang O3
>> 20 DD        BRA    ;zurück zu Impuls und Impulspause an CB2
>
>
> Irgendwie fehlt da was.



Ja möglich, ich frage mich nur was.

Wenn ich den Timer stoppe und danach die Signalausgang O3 auf High 
stelle
und den Timer wieder starte, dann funktioniert er auch nicht korrekt.


Vielleicht sollte ich versuchen den Takt, welcher ja durch den Ausgang 
CB2 ausgegeben wird zu stoppen, wenn ich die Signalausgabe ändere.

Aber vielleicht hat noch jemand einen besseren Tipp.

Vielen Dank

von Edi (Gast)


Lesenswert?

Was Rufus t. Firefly meint, ist: Hier fehlt das Sprungziel. Es gibt auch 
keine symbolischen Adressen, sogar die absoluten Adressangaben fehlen.

Der Codeausschnitt schaut eher aus wie ein disassemblierter Code, der 
nachträglich kommentiert wurde, weil so schreibt niemand seinen 
Quelltext. Ist auch wesentlich schwerer zu lesen und zu verstehen.

von Man N. (manman)


Lesenswert?

Man Nnn schrieb:
> Ich habe Probleme mit der Lösung eines Programms für den Motorola 6809
> mit dem Timer 6840.
>
> Das Programm sollte folgende Funktion haben: Der Timer (Zähler) soll
> extern über den Eingang C3 ohne Frequenzteiler (1/8) getaktet werden.
> Dabei soll der Ausgang CB2 des Portbausteins MC6821 mit dem Takteingang
> C3 des Bausteins MC6840 (Timer) verbunden werden. Der Ausgang CB2 soll
> die Funktion eines Rechteckgenerators haben (also eine
> Rechteckschwingung ausgeben).
> Das Auffangregister des Zählers soll dabei mit dem Wert $00FF geladen
> werden. Über den Signalausgang O3 des Zählers soll ein  Impuls ab dem
> Zählerstand $00F0 des Auffangregisters bis zum Zählerstand $0000
> ausgegeben werden.
> Zuvor, also ab Zählerstand $00FF bis 00F1 soll eine Impulspause am
> Signalausgang 03 sein.
> Das Auffangregister wird beim Ablaufen des Zählzyklus  automatisch
> erneut (also zyklisch) mit dem Wert $00FF geladen.
>
> Ich habe  mein Programm unten angefügt. Der Timer wird zwar über den CB2
> Ausgang getaktet, jedoch erscheint der Impuls am Ausgang O3 nur in jedem
> 2. Zählzyklus, statt in jedem Zyklus.
> Vielleicht hatte schon jemand das Vergnügen den Motorla 6809 zu
> programmieren und kann mir hoffentlich weiterhelfen.
>
>



Sorry, ich habe das Programm mit den Sprungmarken ergänzt.


BD F1 10            JSR CLRDISP  ; hier wird die Anzeige gelöscht

7F F0 19            CLR $F019    ;hier wird der Timer #3 selektiert
86 00               LDA #$00  ;Steuerregister des Timer #3 programmieren
B7 F0 18            STA $F018

CC 00 FF            LDD #$00FF  ;Auffangregsiter des Timer #3 laden
FD F0 1E            STD $F01E

86 01               LDA #$01  ;hier wird der Timer gestartet
B7 F0 19            STA $F019
7F F0 18            CLR $F018

10 8E 00 55         LDY #$0005  ;für Erzeugen des Impulses/Impulspause 
an C
86 34     Zurück    LDA #$34  ;Led von CB2 aus, also Impulspause
B7 F0 03            STA $F003
BD F1 60            JSR DLY1MS  ;Verzögerung für die Länge der 
Impulspause
86 3C               LDA #$3C  ;Led von CB2 jetzt an, also Impuls
B7 F0 03            STA $F003
BD F1 60            JSR DLY1MS  ;Verzögerung für die Länge des Impulses

FC F0 1E            LDD $F01E  ;Zählerstand des Auffangregisters laden
8E 00 04            LDX #$0004  ;und in der Anzeige zeigen
BD F1 23            JSR SHOWD7SG

C1 F0               CMPB #$F0  ;Vergeich ob Zählerstand bereits $00F0
27 06               BEQ Impuls   ;wenn ja, dann Impuls an Signalausgang 
O3
C1 00               CMPB #$00  ;Vergleich ob Zählerstand bereits $0000
27 0C               BEQ Pause   ;wenn ja, dann Impulspause an 
Signalausgang
20 DD               BRA    ;zurück zu Impuls und Impulspause an CB2

7F F0 19  Impuls    CLR $F019  ;selektieren von Timer #3
86 80               LDA #$80  ;Steuerregister von Timer für Impuls an O3
B7 F0 18            STA $F018
20 D3               BRA Zurück    ;zurück zu Impuls und Impulspause an 
CB2

7F F0 19  Pause     CLR $F019  ;selektieren von Timer #3
86 00               LDA #$00  ;Steuerregister von Timer für Impulspause 
an
B7 F0 18            STA $F018
20 C9               BRA Zurück   ;zurück zu Impuls und Impulspause an 
CB2

13                  SYNC



Vielen Dank für Eure Hilfe

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.