Forum: Mikrocontroller und Digitale Elektronik Problem mit PWM aus Timer2 mit ATmega8535


von Eingehirner (Gast)


Lesenswert?

So langsam krieg ich die Krise hier (sonst würd ich ja nicht schreiben 
;) )...

Ich versuche seit einigen Tagen, den Timer2 des ATmega8535 für eine 
schnellstmögliche PWM zu konfigurieren. Der aktuelle Stand sieht so aus, 
vielleicht fällt hier wem ein offensichtliches Brett vorm Kopf auf:
1
; Clear Timer on Compare Match (CTC) mode (WGM-Bits=2), toggle on each 
2
; match (COM-Bits=1) und interner Taktquelle ohne Prescaling (CS-Bits=1)
3
  ldi tmp2, 128 ; kürzestmögliches Intervall für CTC
4
  out OCR2, tmp2
5
  ldi tmp1, 1 << WGM21 | 1 << COM20 ; noch nicht die Uhr starten
6
  out TCCR2, tmp1
7
  ; starten via Setzen des Clock Bits
8
  ori tmp1, (1 << CS20)
9
  out TCCR2, tmp1
10
11
; PWM an OC2/PD7 initialisieren als Takt für LCD
12
  sbi DDRD, 7 ; PD7 = OC2 wird als Output konfiguriert, damit er 
13
        ; als PWM-Ausgang dienen kann
14
15
; reset timer to just before overflow, to get a little extra time
16
  ldi tmp1, 254
17
  out TCNT2, tmp1

Fein, das compiliert auch und ich hab mehrmals nachgeschaut, ob ich 
WIRKLICH die Drähte am richtigen Pin hab, ob der Sockel Kontakt zum AVR 
hat, ob die Spannungen alle stimmen etc etc... was Irrtümer nicht 
ausschließen soll. Durch diverse LED-Tests hab ich aber verifiziert, daß 
der AVR tut und das aktuelle Programm kriegt.

Im Datenblatt hab ich zigmal den Artikel über den Timer2 gelesen... 
COM21:0 soll 1 sein, damit "toggle on each match" passiert, WGM21:0 soll 
2 sein, damit CTC passiert. Das Datenblatt sagt auch, daß all diese Bits 
wirklich in TCCR2 sind... Spannend ist hier auch, daß im TEXT des 
Datenblattes gesagt wird, COM21:0=1 wäre für "toggle on each match", 
aber in der entsprechenden Tabelle steht nur "reserved"... als ob diese 
Kombination nicht implementiert wäre. Was stimmt jetzt?

OK, zum wirklichen Problem: Schließe ich nun an Pin PD7/OC2 eine LED 
über 1kO nach GND an, leuchtet sie einfach. Nicht halb so hell wie an 
einem dauernd auf HIGH gesetzten Pin, nicht blinkend (egal, welcher 
Prescaler, welcher PWM-Modus und welcher OCR2-Wert), sondern genauso 
hell (also keine PWM mit 50% duty, wie anfangs erwartet). Ein Voltmeter 
zeigt keinen Wechselstrom an. Es ist auch wirklich PIND7.

Simuliere ich das Ganze im AVR Simulator (AVR Studio 4.18.716 SP3), wird 
schonmal gleich der PWM-Modus falsch erkannt... bekanntes, nicht in 
absehbarer Zeit zu lösendes Problem seitens ATMEL, wie eine kurze 
Recherche ergab. Prima. Der CTC funktioniert aber auch dann nicht, wenn 
der Simulator behauptet, CTC sei aktiviert (der Timer wird bei 
Match-Flag NICHT zurückgesetzt).

Ich hab auch Fast PWM (WGM21:0 = 3) versucht, mit demselben "Erfolg". 
Auch mit COM21:0 = 1 und = 2... erfolglos.

Die AppNotes von Atmel zum Timer und zur PWM hab ich gelesen... 
ebenfalls kein Erfolg.

Kann mir irgendwer sagen, was ich falsch mache? Ich wäre für jeden 
Hinweis SEHR dankbar!

(Der Timer-Reset auf 254 am Schluß war ein letzter Notanker, als alles 
andere nicht geklappt hat... weder mit OCR2=0, 1, 2 oder 128. Ich 
dachte, vielleicht liegt es an irgendwelchen Delays... nö. Nicht so 
jedenfalls.)

Vielen Dank schonmal!
Eingehirner

von Guru (Gast)


Lesenswert?

Einen direkten Fehler sehe ich nicht.

Ich würde mal versuchen, das Datenrichtungsbit zu setzen bevor die 
Timerinitialisierung gemacht wird. Es steht zwar nirgendwo das es so, 
wie Du es gemacht hast, nicht geht, aber man könnte es mal probieren.
Schreib mal bitte ob das geholfen hat.

Ein kleiner Hinweis noch:
>Spannend ist hier auch, daß im TEXT des
>Datenblattes gesagt wird, COM21:0=1 wäre für "toggle on each match",
>aber in der entsprechenden Tabelle steht nur "reserved"... als ob diese
>Kombination nicht implementiert wäre. Was stimmt jetzt?

Du hast wahrscheinlich in der falschen Tabelle geguckt. Tabelle Nr. 53, 
die aussagt, das COM21:0=1 reserviert ist, gilt nur für den 
Fast-PWM-Modus. Tabelle 52 ist für den CTC-Modus massgebend.

In einer Application Note zur PWM wirst Du zum CTC-Modus wahrscheinlich 
nichts relevantes finden. Denn der CTC Modus ist was anderes. Das ist 
überhaupt etwas, was mich ein wenig irritiert. Du sprichst von PWM 
stellst aber einen CTC-Modus ein. Meinst Du, Du willst eine PWM mit dem 
CTC-Modus erzeugen oder willst Du wirklich einen PWM-Modus des Timers 
benutzen?

von Guru (Gast)


Lesenswert?

Eine LED zum testen zu verwenden kann bei schnellen Takten irreführend 
sein. Vielleicht kannst Du Dir doch irgendwo ein Oszilloskop leihen. Das 
ist wesentlich verlässlicher als eine LED oder ein Multimeter.

von spess53 (Gast)


Lesenswert?

Hi

> Spannend ist hier auch, daß im TEXT des
>Datenblattes gesagt wird, COM21:0=1 wäre für "toggle on each match",
>aber in der entsprechenden Tabelle steht nur "reserved"... als ob diese
>Kombination nicht implementiert wäre. Was stimmt jetzt?

Du redest erst von PWM und dann von CTC. Für CTC gilt die Tabelle

*Table 52 Compare Output Mode, non-PWM Mode*

>Simuliere ich das Ganze im AVR Simulator (AVR Studio 4.18.716 SP3), wird
>schonmal gleich der PWM-Modus falsch erkannt... bekanntes, nicht in
>absehbarer Zeit zu lösendes Problem seitens ATMEL, wie eine kurze
>Recherche ergab.

Falsch. Dein Programm macht genau das, was du programmiert hast. Sogar 
im Simulator.

MfG Spess

von Eingehirner (Gast)


Lesenswert?

@ Guru: Hab ich auch schon probiert... es wird empfohlen, das Bit danach 
zu setzen (irgendwas mit "do the setup before setting the pin as output" 
oder so), aber auf beide Weisen klappts nicht.

(Quelle: Datenblatt S. 120: "The setup of the OC2 should be performed 
before setting the Data Direction Register for the port pin to output." 
Die Output Compare Unit wird ja von CTC und FastPWM verwendet, also hab 
ich gefolgert, daß es so herum am sinnvollsten ist. Weiter unten steht 
noch "The design of the output compare pin logic allows initialization 
of the OC2 state before the output is enabled.")

Weshalb ich teilweise vom CTC-Modus spreche: Laut Datenblatt verhalten 
sich Fast PWM und CTC mit dem Setting COM21:0=1 gleich, wenn man OCR2=0 
setzt (sie geben ein schnellstmöglich oszillierendes Signal aus). Der 
einzige Unterschied ist, daß bei CTC der Wert für OCR2 nicht double 
buffered ist. Ich hatte es erst mit Fast PWM versucht, dann mit CTC. 
Deshalb die bunte Mischung im Code aus CTC und PWM. Beides wurde für 
sich getrennt versucht, beides sollte (mit größerer Fehleranfälligkeit 
für CTC) laut Datenblatt einen ähnlichen Output ergeben... beides tut 
bei mir nicht.

(Quelle: Datenblatt, S. 123: "For generating a waveform output in CTC 
mode, the OC2 output can be set to toggle its logical level on each 
Compare Match by setting the Compare Output mode bits to toggle mode 
(COM21:0 = 1). [...] The waveform generated will have a maximum 
frequency of fOC2 = fclk_I/O/2 when OCR2 is set to zero (0x00)." und S. 
125: "A frequency (with 50% duty cycle) waveform output in fast PWM mode 
can be achieved by setting OC2 to toggle its logical level on each 
Compare Match (COM21:0 = 1). The waveform generated will have a maximum 
frequency of foc2 = fclk_I/O/2 when OCR2 is set to zero. This feature is 
similar to the OC2 toggle in CTC mode, except the double buffer feature 
of the output compare unit is enabled in the fast PWM mode.")

Daß eine LED nicht das ideale Testmittel ist, weiß ich... aber ich hab 
leider keinen Zugang zu einem Oszi. Mein Multimeter erkennt aber 
immerhin die 2kHz von einem NE555, den ich zum Invertieren in derselben 
Schaltung verwende, als Wechselstrom mit der korrekten Spannung; ich 
weiß natürlich nicht, ob es dann bei 7,3728 MHz nicht dicht macht, aber 
einen Versuch war's wert.

Ziel der Schaltung und des Programms ist es letzten Endes, an OC2 den 
Takt für ein LCD-Display zu erzeugen; das hat als erstes nicht 
funktioniert (das Display bekommt offensichtlich keinen Takt). Da beim 
LCD aber mehr Unwägbarkeiten auftreten können -- falsche Ansteuerung, 
falscher ON-Befhel etc etc --, bin ich zu Testzwecken zur LED 
übergegangen. Eine Helligkeitsänderung um 50% sollte damit beobachtbar 
sein.

@ spess53: Zum ersten Punkt: Siehe oben, ich les ja das Datenblatt nicht 
umsonst... zum zweiten: Im AVRFreaks-Forum hat sich einer direkt mit 
Atmel unterhalten, der dasselbe (Teil-)Problem hatte. NEIN, AVR Studio 
ist anscheinend NICHT in der Lage, alle PWM-Modes auf allen µCs korrekt 
darzustellen, das ist ein bekannter Bug, der wohl in nächster Zukunft 
nicht gelöst werden wird (und dummerweise nicht unter den bekannten 
Problemen aufgelistet wird). Die (zahlenmäßig) niedrigen Modes werden 
meist korrekt wiedergegeben, die höheren (insbesondere FastPWM und alles 
darüber) meistens nicht.

Abgesehen davon wird bei mir bei einem WGM21:0-Setting von 3 (beide Bits 
= 1) in AVR Simulator ein CTC-Mode erkannt (das zeigt AVR Simulator ja 
an, wenn man sich die Byte-Werte von Timer2 anschaut), kein FastPWM wie 
im Datenblatt angegeben. Und trotz "CLEAR Timer on compare match" wird 
bei mir der Timer im Simulator NICHT gecleared, obwohl das "Match"-Flag 
nach einem Match gesetzt ist.

von spess53 (Gast)


Lesenswert?

Hi

>Zum ersten Punkt: Siehe oben, ich les ja das Datenblatt nicht
>umsonst... zum zweiten: Im AVRFreaks-Forum hat sich einer direkt mit
>Atmel unterhalten, der dasselbe (Teil-)Problem hatte.

Der Simulator unterstützt keine PWM-Modi mit variablen Topwert. Ist mir 
bekannt. Das betrifft aber eigentlich nur 16-Bit-Timer. Der Timer2 von 
deinem ATMega fällt nicht darunter.

>Abgesehen davon wird bei mir bei einem WGM21:0-Setting von 3 (beide Bits
>= 1) in AVR Simulator ein CTC-Mode erkannt (das zeigt AVR Simulator ja
>an, wenn man sich die Byte-Werte von Timer2 anschaut), kein FastPWM wie
>im Datenblatt angegeben. Und trotz "CLEAR Timer on compare match" wird
>bei mir der Timer im Simulator NICHT gecleared, obwohl das "Match"-Flag
>nach einem Match gesetzt ist.

Das Clear bezieht sich auf der OC-Ausgang nicht auf den Timer!

MfG Spess

von Eingehirner (Gast)


Lesenswert?

NEIN! Warum sollte der Modus denn sonst "Clear TIMER on Compare Match" 
heißen? Auch der Satz im Datenblatt mit der kürzestmöglichen Pulsdauer 
ist sonst nicht sinnvoll.

Zitat: "In CTC mode, the COUNTER is cleared to zero when the COUTER 
value (TCNT2) matches the OCR2. The OCR2 defines the top value for the 
COUNTER, hence also its resolution." (DB, S. 122)

Kleine Info noch, ich hab im Datenblatt nichts gefunden, aber vielleicht 
ist es relevant: Ich habe KEINE Interrupts aktiviert. Die Flag OCF2 wird 
also nur beim ersten Match gesetzt, es erfolgt kein automatischer Reset. 
Wenn ich alles richtig verstanden habe, brauche ich diese Flag aber 
nicht für die Hardware-PWM, sondern ausschließlich, falls ich einen 
Interrupt triggern will (sitzt ja im TIFR). Sollte also kein Problem 
sein, CTC und PWM sollten auch funktionieren, wenn nach dem jeweils 
ersten Auftreten TOV2 und OCF2 dauerhaft gesetzt bleiben.

von spess53 (Gast)


Lesenswert?

Hi

>NEIN! Warum sollte der Modus denn sonst "Clear TIMER on Compare Match"
>heißen? Auch der Satz im Datenblatt mit der kürzestmöglichen Pulsdauer
>ist sonst nicht sinnvoll.

Also vorweg: Ich habe das eben im Simulator getestet. Das wird 
fehlerfrei simuliert. Bei OCR2=128 zählt der Timer bis 127 und fängt 
dann von Null wieder an. Gleichzeitig wird PIND7 getoggled. Absolut 
korrekt.

Was mich irritiert:

>  ldi tmp2, 128 ; kürzestmögliches Intervall für CTC
                   ^^^^^^^^^^^^^^^^

Wie kommst du zu dieser Annahme?

MfG Spess

von Eingehirner (Gast)


Lesenswert?

Hmmmm, interessant. Du hast dieselbe AVR Studio-Version wie ich? Ich 
habs gestern stundenlang probiert. PIND7 wird auch von nichts anderem 
verwendet. PORTA/PORTC werden komplett als Outputs konfiguriert und für 
die LCD-Ansteuerung benutzt, aber erst deutlich später im Code...

Wie weiter oben erwähnt, hatte ich für OCR2 Werte wie 0, 1, 2, 4, 128 
ausprobiert. 128 war der letzte, deshalb steht der noch drin... den 
Kommentar hab ich geschrieben, als ich 0 ausprobiert hab... sorry für 
die Nachlässigkeit. Gleiches Problem wie beim CTC -- die Kommentare 
ignoriert man leicht, wenn man ständig was ändert...

Hast du einfach nur meinen Code kopiert und compiliert? Hast du den 
ATmega8535 als Typ verwendet? Wenn du's zum Laufen gekriegt hast, stell 
doch bitte deinen kompletten Code mal hier rein, vielleicht fällt der 
Groschen dann schneller...

von spess53 (Gast)


Lesenswert?

Hi

>Du hast dieselbe AVR Studio-Version wie ich?

Ja.

>Hast du einfach nur meinen Code kopiert und compiliert?

Ja. Nur das tmp-Gedödel durch r16/r17 ersetzt und assembliert.

>Hast du den ATmega8535 als Typ verwendet?

Ja.
1
      ldi r17, 128 ; kürzestmögliches Intervall für CTC
2
      out OCR2, r17
3
      ldi r16, 1<<WGM21 | 1 << COM20 ; noch nicht die Uhr starten
4
      out TCCR2, r16
5
      ; starten via Setzen des Clock Bits
6
      ori r16, (1 << CS20)
7
      out TCCR2, r16
8
9
    ; PWM an OC2/PD7 initialisieren als Takt für LCD
10
      sbi DDRD, 7 ; PD7 = OC2 wird als Output konfiguriert, damit er 
11
            ; als PWM-Ausgang dienen kann
12
13
    ; reset timer to just before overflow, to get a little extra time
14
      ldi r16, 254
15
      out TCNT2, r16

MfG Spess

von Ralf (Gast)


Lesenswert?

CTC ist doch kein PWM, denke ich mal. Zumindest keine sinnvolle PWM. 
Durch ändern des Topwertes andert sich ja das Tastverhältnis nicht. Das 
bleibt immer 1:1, es ändert sich nur die Frequenz. Eine LED brennt dann 
mit ca 70% Helligkeit gleichmäßig.

von Eingehirner (Gast)


Lesenswert?

@ Spess: Danke, ich werd's daheim nochmal versuchen... wenn du es zum 
Laufen kriegst, MUSS ich ja irgendwo einen Fehler haben, auch wenn ich 
keine Ahnung hab, wo...

@ Ralf: 50%, nicht 70%, oder? Es ist ja kein Sinus (U_eff = 
sqrt(2)*U_max ~ 0.707*U_max), sondern eine Rechteck-Kurve 
(Leuchtleistungsberechnung via P_eff = P_an*duty+P_aus*(1-duty) = 
P_an*0.5+0*0.5 = 0.5*P_an). Und wie aus meiner gewünschten Anwendung 
hervorgeht, ist mir der Modulationsteil egal, ich brauche nur ein 
schnellstmögliches an-aus-an-aus des PIND7. Da tut's CTC genauso wie 
FastPWM. Auch alles siehe oben.

von spess53 (Gast)


Lesenswert?

Hi

Nachtrag:

>Hast du den ATmega8535 als Typ verwendet?

Bist du sicher, das du in den Simulator Options den ATMega8535 
eingestellt hast?

MfG Spess

von Ralf (Gast)


Lesenswert?

@Eingehirner
da gibts diese zwei verschiedenen Ansichten ...
'Variante 70%' gefällt mir besser :-) Ich habe mir allerdings die 
Herleitung nicht gemerkt. Sehen kann man das an der Helligkeit der LED 
(auch an der Drehzahl eines Motors!). In den z.B. ersten 30% leuchtet 
die LED immer heller, in den letzten 30% passiert fast nichts mehr. Die 
Helligkeit (Drehzahl beim Motor) ist nicht linear zum Tastverhältnis. 
Das hat fast nichts mit der Wahrnehmung des Auges zu tuen (bei der LED 
natürlich).

von Eingehirner (Gast)


Lesenswert?

@ Spess: Ich bin mir SEHR sicher, ja. Aber kontrollieren werd ich's auf 
jeden Fall nochmal.

@ Ralf: Es sollte in der Physik eigentlich keine "Ansichten" geben... 
Die effektive Spannung kann ich ganz simpel über den Mittelwert der an- 
und aus-Spannungen berechnen, bei U_aus=0V noch einfacher via U_eff = 
Tastverhältnis*U_an = 0.5*U_an. Die Leistung ist P=U²/R, allerdings 
zeitlich getrennt für U_an und U_aus, also hier P_eff = 
U²/R*Tastverhältnis = 0.5*P_an. Die Ströme, die die LED zum Leuchten 
bringen, sind aber vermutlich die wichtigste Größe (es fällt ja immer 
dieselbe Spannung ab).

Daß das menschliche Auge Lichtstärken logarithmisch wahrnimmt, ist 
nochmal ein anderes Thema, aber erkennen kann man den Unterschied 
trotzdem sehr gut...

Beim Motor sollte aber wegen der linear ansteigenden aufgenommenen 
Leistung ein ungefähr linearer Verlauf der Drehzahl vorliegen!

von Eingehirner (Gast)


Lesenswert?

So, ich habs ausprobiert... mit FastPWM funktionierts in der Schaltung, 
aber im Simulator nicht (dort wird CTC "erkannt"), mit CTC funktionierts 
in beiden Fällen nicht (der Simulator erkennt den Modus "normal"). Ich 
hab überprüft, ob der korrekte µC eingestellt ist (ja), ob die korrekte 
Headerdatei eingebunden wird (ja) und ob ich irgendwo aus Versehen die 
Pins doch anders beschaltet hab (nein). Auch ein Minimalprogramm liefert 
das unerwünschte Ergebnis. Aber wie gesagt, mit FastPWM funktioniert die 
eigentliche Schaltung jetzt wie gewünscht!

Allerdings kann es sein, daß alles "für die Katz" war, denn ich kann die 
Leitung, über die die 3.6MHz-Takte übertragen werden, nicht beliebig 
kurz machen und anscheinend kommen die nur sehr unregelmäßig an, genauso 
wie die Steuerpulse für's LCD. Bin jetzt mit einem Prescaler von 1024 
erfolgreich gewesen, aber das ist natürlich nur suboptimal...

von spess53 (Gast)


Lesenswert?

Hi

>aber im Simulator nicht (dort wird CTC "erkannt"), mit CTC funktionierts
>in beiden Fällen nicht (der Simulator erkennt den Modus "normal").

Interessante Fehlerbeschreibung. Was heisst bei dir 'dort wird CTC 
"erkannt"' oder 'der Simulator erkennt den Modus "normal"'?

Die Simulation funktioniert definitiv für alle vier Modi korrekt. Ich 
bekomme langsam das Gefühl, das du das, was du in der Simulation siehst, 
nicht richtig deuten kannst oder die Funktionsweise von CTC und PWM 
nicht vollständig verstanden hast.

MfG Spess

von Eingehirner (Gast)


Lesenswert?

Wenn ich sage "wird erkannt", bedeutet das, daß der Simulator die 
entsprechende Anzeige für den Timer-Modus anzeigt (rechts in Fenster). 
Ich habe keinerlei Probleme beim Verständnis von CTC und PWM.

Sobald ich daheim bin, werd ich einen Screenshot vom Problem machen, 
dann wird's vielleicht klarer... eventuell reden wir aneinander vorbei.

von M. K. (avr-frickler) Benutzerseite


Lesenswert?

Ich bin in Assembler jetzt nicht ganz so fit, aber ich denke der Fehler 
liegt in der folgenden Anweisung.

Eingehirner schrieb:
> ; PWM an OC2/PD7 initialisieren als Takt für LCD
>   sbi DDRD, 7 ; PD7 = OC2 wird als Output konfiguriert, damit er
>         ; als PWM-Ausgang dienen kann

Ich vermute mal du setzt hier nur die Pins PD0, PD1, PD2 als Augang für 
PD7 müsstest du 128 schreiben.

Gruß
AVR-Frickler

von Eingehirner (Gast)


Lesenswert?

Stimmt -- das könnte der Hauptfehler gewesen sein, es tut ja jetzt... 
ich hab gestern den gesamten PORTD als Ausgang konfiguriert... oh mann, 
wie blöd.

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

Eingehirner schrieb:
> Stimmt -- das könnte der Hauptfehler gewesen sein,
>...
>
Stimmt nicht.

SBI A,b setzt wirklich nur das Bit das mit b im Bereich 0 bis 7 liegt.

SBR Rd,K setzt je nach dem was in der Konstante K (0-255) angebeben ist.

Bernd_Stein

von Eingehirner (Gast)


Angehängte Dateien:

Lesenswert?

OK, um mal etwas Klarheit zu schaffen (hoffentlich!), hab ich vier 
Bilder angehängt.

Zunächst mal: der ATmega8535 ist ausgewählt (AVRSimulator_Options.png).

So wie in CTC_Mode.png sieht es aus, wenn ich das Programm grade 
gestartet hab und eine Anweisung nach dem TCCR2-Setzen bin. Man beachte, 
dass zwar rechts oben "normal" angezeigt wird, die Bits jedoch das 
Bitmuster für CTC anzeigen (WGM21=1, WGM20=0).

Auswahl.png zeigt, daß man zur Laufzeit die Bits für den Timer-Modus 
ändern kann. Die Änderung wird direkt unten in TCCR2 sichtbar.

Dies ist in vonHand_auf_CTC.png zu sehen. Hier habe ich nun CTC 
ausgewählt, das Bitmuster entspricht einer FastPWM (WGM21=1,WGM20=1).

Spess, fällt dir irgendwas ein, was sonst noch bei mir anders sein 
könnte als bei dir?

Übrigens, mal der vollständige Code bis zu diesem Punkt:
1
.include "m8535def.inc"
2
3
.def lcd_command=r16
4
.def lcd_data=r17
5
.def tmp1=r18
6
.def tmp2=r19
7
.def counter=r20
8
.def lcd_page=r21
9
10
.equ FREQ=7372800
11
.equ TIME50MUS=123
12
.equ LCD_COMMAND_PORTC=0b00001110
13
.equ LCD_DATA_PORTC=0b00001111
14
.equ A0=0
15
.equ CS2=1
16
.equ CS1=2
17
.equ READ=3
18
.equ WRITE=4
19
     ; Steuer-Pins:
20
   ; PC0: A0 (0: Command, 1: Data)
21
   ; PC1: CS2 (0: right display active)
22
   ; PC2: CS1 (0: left display active)
23
   ; PC3: /RD (0: read display data/status)
24
   ; PC4: /WR (0: write display data/command)
25
.equ LCD_ON_PORTA=0b10101111
26
.equ LCD_OFF_PORTA=0b10101110
27
.equ LCD_STARTLINE_PORTA=0b1100000 ; use with "OR line#" (0..31)
28
.equ LCD_SETPAGE_PORTA=0b0111000 ; use with "OR page#" (0..3)
29
.equ LCD_SETCOLUMN_PORTA=0b00000000 ; use with "OR column#" (0..79)
30
.equ LCD_SELECTADC_PORTA=0b10100000 ; use with "OR ccw_output" (0/1)
31
.equ LCD_READMODIFYWRITE_PORTA=0b1110000 ; for updating small parts of LCD
32
.equ LCD_END_PORTA=0b11101110 ; end the read-modify-write mode
33
.equ LCD_RESET_PORTA=0b11100010 ; reset display; usually unused, kept on VCC
34
     ; PA0..7: DB7..0, lcd_data byte for writing/lcd_command
35
;===============================
36
; Stackpointer initialisieren
37
  ldi tmp1, HIGH(RAMEND)
38
  out SPH, tmp1
39
  ldi tmp1, LOW(RAMEND)
40
  out SPL, tmp1
41
42
; einfach mal zur Sicherheit 1s warten...
43
    ;rcall wait1s
44
45
; PORTA/PORTC sind Ausgänge für LCD
46
    ldi tmp1, 0xFF
47
  out DDRA, tmp1
48
  out DDRC, tmp1
49
50
; CTC mode (WGM-Bits=10), toggle on each match (COM-Bits=01), interner Takt mit 1024-Prescaling (CS-Bits=111)
51
  ldi tmp2, 0 ; Intervall für CTC
52
  out OCR2, tmp2
53
  ldi tmp1, 1 << WGM21 | 0 << WGM20 | 1 << COM20
54
  out TCCR2, tmp1
55
56
; PWM an OC2/PD7 initialisieren als Takt für LCD (CL-Pin des LCD12232)
57
; Diodenblinker/leuchter an PD6
58
  ldi tmp1, 0xFF
59
  out DDRD, tmp1 ; PORTD wird als Output konfiguriert, damit PD7 als PWM-Ausgang dienen kann (PD7 = OC2)
60
  ldi tmp1, 0x00
61
  out PORTD, tmp1 ; PORTD auf "0" setzen
62
63
; Timer2 starten via Setzen des Clock Bits
64
  in tmp1, TCCR2
65
  ori tmp1, (1 << CS22 | 1 << CS21 | 1 << CS20)
66
    out TCCR2, tmp1

von spess53 (Gast)


Lesenswert?

Hi

>Spess, fällt dir irgendwas ein, was sonst noch bei mir anders sein
>könnte als bei dir?

An dieser Stelle gibt es wirklich einen Bug. Ist mir bis jetzt nicht 
aufgefallen, da ich diese Darstellung nicht benutze. Mir reicht die 
Registeranzeige.
Der Bug betrifft aber nur diese Anzeige. Der Timer wird entsprechend den 
gesetzten WGM-Bits korrekt simuliert.

MfG Spess

von Eingehirner (Gast)


Lesenswert?

OK, danke... dann bin ich noch nicht völlig verblödet... hab mich nur 
irritieren lassen. Komisch, daß so ein Bug nicht sofort behoben wird, 
das sollte ja wirklich nicht schwer sein :/

Jedenfalls vielen Dank für die Hilfe, die CTC-Takterzeugung funktioniert 
jetzt einwandfrei und das Display akzeptiert sie mit einem 5cm-Kabel als 
Takt!

von spess53 (Gast)


Lesenswert?

Hi

> Komisch, daß so ein Bug nicht sofort behoben wird,
>das sollte ja wirklich nicht schwer sein :/

Interessiert wahrscheinlich niemanden mehr. Dieses Simulatormodul wird 
nur bei älteren, teilweise schon obsoleten, AVRs benötigt.

MfG Spess

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.