Ok, das mit "clear Timer = 1" wird in der Online-Hilfe nur kurz angedeutet, aber nirgends richtig erklärt. Was bewirkt "clear Timer = 0" dann?
Und 'ne Option, die das ICR1 statt des OCR1A verwendet (um beide PWM-Kanäle frei zu haben) finde ich so auch nicht. Egal, ICH kann das ja stattdessene direkt über die I/O-Register machen - und ich weiß dann auch, was wirklich in diesen Registern steht...
Wie ist das jetzt mit Deinem Timer:
- der zählt (mit Systemtakt/64) von 0 bis 600 hoch
- bei 200 erfolgt ein Comparematch mit OCR1B
- bei 201 wird das korrespondierende Interrupt-Flag gesetzt (und somit der Interrupt ausgelöst)
- in der ISR löschst Du jetzt alle LEDs, und kehrst zum (leeren) Hauptprogramm zurück, währenddessen läuft der Timer weiter
- bei 600 erfolgt ein Comparematch mit OCR1B
- bei 601 wird das korrespondierende Interrupt-Flag gesetzt, was hier einerseits den Timer sofort auf 0 setzt (also 601=0), andererseits den entsprechenden Interrupt auslöst
- in der ISR läßt Du jetzt ein paar LEDs leuchten, und kehrst ins (leere) Hauptprogramm zurück - währenddessen läuft der Timer weiter...
Die LEDs leuchten also solange, wie sich der Timer zwischen dem Überlauf und OCR1B befindet (erst an) - von ORC1B bis Überlauf (OCR1A) sind sie aus (dann aus).
Ein größerer wert im OCR1B hat eine höhere Helligkeit (Leuchtdauer) zur Folge, oder?
Quizfrage2: Wie kehrst Du das um? (also erst aus, dann an)
Dabei fällt mir ein, daß Du Frage 1 noch nicht beantwortet hast: Was geschieht, wenn Du im Programm irgendwann mal den Inhalt von OCR1A veränderst?
Der Mega8 hat (oh welch Überraschung):
aus dem Datenblatt schrieb:
8Kbytes of In-System Self-programmable Flash program memory
Das sind erstmal nur Words. Wenn das Programm also in irgendeiner Speicherzelle landet, wird das dortige Word als Befehl interpretiert, und ausgeführt. Speicherzellen, die vom Programm nie erreicht werden, werden logischerweise nie als Befehl ausgeführt. In diesen Zellen können natürlich irgendwelche Daten stehen (Strenggenommen steht ja immer irgendwas drin - und wenns 'ne 0 ist). Der Controller besitzt einen Befehl, mit das Byte einer beliebigen Flash-Adresse (aus dem program-flash) geladen werden kann. In Deinem Programm nutzt Du das zB bei lookup usw. Dort wird der Inhalt dann aber auch gleich an eine Variable weitergereicht - effektiv werden also Daten aus dem Flash ins SRAM kopiert (Variablen sind ja quasi Zeiger auf Adressen im SRAM).
Mit Zuweisungen wie Varname=Wert hast Du was ähnliches. Mit dem Dim-Befehl sagst Du Bascom ja nur, wieviel Platz die Variable im SRAM verwendet, und hast im Programm 'n Namen für den eigentlichen Speicherplatz. Erst die Zuweisung erzeugt dann den Code, im Flash erscheint dann eine Befehlsfolge, die den Wert (als Konstante) in's SRAM kopiert. Der Wert steht mitsamt der Befehlsfolge im Flash. Allerdings in ... ähm ... gepackter Form. Wenn ich das jetzt auch noch ausführen soll, kannst Du auch bald auf Assembler umsteigen, gelt TommyB?!