Also Mega8 und interne 4MHz Takt...
Warum 4MHz???
Dir ist doch bewusst, dass die automatische Calibration des internen
Oszillators nur bei 1MHz intern funktioniert, oder?
Das Datenblatt des Mega8 meint dazu auf Seite 29:
During Reset, the 1 MHz calibration value
which is located in the signature row High byte (address 0x00) is
automatically loaded
into the OSCCAL Register. If the internal RC is used at other
frequencies, the calibration
values must be loaded manually.
Wenn es also keinen zwingenden Grund für einen anderen Takt als 1MHz
gibt, dann nimm 1MHz, das erspart die manuelle Calibration.
Warum eigentlich BASCOM???
In Assembler hast du viel mehr Übersicht, da du nachvollziehen kannst,
was du tust. BASCOM macht soviel Unfug im Hintergrund und ist viel zu
weit von der Hardware entfernt. Und für Interruptprogrammierung taugt
es nix, da es dir den erzeugten Code nicht in ASM zeigt, du also nicht
nachvollziehen kannst, warum bestimmte Dinge nicht funktionieren.
Falls du es doch in ASM versuchen willst, dann schau mal ins Datenblatt
auf Seite 67 bis 73. Dort erfährst du alles über Timer0.
- Auf Seite 70 siehst du, wie man den Timer einschaltet, indem man
einen Vorteilerwert in das Steuerregister TCCR0 schreibt.
- Auch auf Seite 70 erfährst du, wie man durch Setzen eines Bits im
Register TIMSK den Interrupt aktiviert.
- Auf Seite 44 und 45 erfährst du, dass du ab Adresse 0 nicht einfach
mit dem Programmcode beginnen kannst, weil da nämlich die Interrupt-
Sprungtabelle hin mus, die zu den Interrupt-Service-Routinen (ISR)
verzweigt, die du selbst schreiben musst.
- Hinter den Interrupt-Sprüngen folgt die Reset-Routine. Hier muss
zuerst der Stackpointer initialisiert werden. Danach die verwendeten
I/O-Ports und der Timer0 (TCCR0 und TIMSK setzen). Nach allen
anderen Initialisierungen ist mittels SEI der Interrupt allgemein
freizuschalten.
- Hinter der Reset-Routine wird die Mainloop platziert. Diese enthält
im einfachsten Fall eine Endlosschleife. Später kann da noch
Programm dazu, und vor allem der Sleep-Befehl. Aber erst später,
wenn du den Rest verstanden hast.
- Dann kommt die ISR. Sie bekommt das Label, zu dem der zugehörige
Sprung in der Sprungtabelle zeigt. In der ISR muss man:
* das SREG sichern und wiederherstellen
* den Timer mit dem Startwert (n Ticks vor 256) laden
* das tun, weshalb man den Interrupt braucht
Vorschlag:
- Timer0 so konfigurieren, dass der Interrupt alle 10ms erfolgt.
- In der ISR ein Register hochzählen.
- Dieses mit 50 vergleichen und bei Gleichstand den Portpin setzen
- Mit 100 vergleichen und bei Gleichstand auf 0 setzen und den
Portpin löschen
- Versuchen, den Ablauf zu verstehen (der Simulator des AVR-Studio
ist da sehr hilfreich)
- Änderungen vornehmen, eigene umfangreichere Programme schreiben...
...