...wie man mit Interrupts umgeht, würde mich als nächstes interessieren...
Mal etwas vereinfacht formuliert:
Jeder AVR besitzt mehr oder weniger interne Hardware, die in der Lage ist, einen entsprechenden Interrupt auszulösen. Ist der entsprechende Interrupt freigegeben (Interrupt enable), die Interrupts global zugelassen (globales Interrupt-enable -> I in SREG), und das triggernde Ereignis eingetreten (welches auch ein Flag setzt - sind also alle 3 Flags aktiv->), dann wird nach Abarbeitung der gerade laufenden Maschinencodeinstruktion die nächste Programmposition (Programmzähler) auf den Stack geschrieben, die globalen Interrupts gesperrt (I in SREG=0) und der Programmzähler auf den Bereich im Flash gesetzt, der dem jeweiligen Interrupt zugeordnet ist. Diese sind quasi "fest mit dem Interrupt verbunden", Suchstichwort fürs Datenblatt: "IVT" "Interruptvektortabelle". Da dort nur eine/zwei word-Befehle platz haben, steht dort üblicherweise ein Sprungbefehl, der zur jeweiligen Interrupt-Service-Routine verzweigt. In dieser platzierst Du dann Deinen Code, abgeschlossen wird die ISR durch ein ReturnFromInterrupt (RETI), wodurch die Rücksprungadresse wieder vom Stack geholt wird, und wieder dem Programmzähler zugewiesen, und die Interrupts global wieder zugelassen werden.
Eine Hochsprache wie C oder Bascom legt diese Codesegmente mehr oder weniger automatisch an, wenn Du die entsprechenden Befehle einfügst, da sollte vielleicht jemand der C kann noch was zu sagen - aber ich meine, daß Du trotzdem wissen solltest, was der Controller da wirklich macht.
...Beherrschen die ATmega's MultiTasking?
Ich weiß leider noch nicht wie ich den Timer bzw. Counter benutze, aber ich habe mir überlegt, das man eine Funktion schreibt, die den Timer startet, man nebenbei in dem Hauptprogramm weiterarbeitet, aber erst in einen nächsten Schritt übergeht, wenn im Timer ein bestimmter Wert erreicht ist.
Klingt das machbar oder rede ich da Unsinn?
Die Frage kann man so nicht beantworten...
Kommt darauf an, was genau Du unter Multitasking verstehst.
Der Controller selbst hat nur eine ALU (Arythmetic Logical Unit oder so), einen Programmzähler -> einen Rechenkern quasi -> kann also immer nur einen Befehl gleichzeitig abarbeiten. (Strenggenommen ist das bei singleCoreCPUs ja auch so). Wenn Du sowas wie Multitasking simulieren willst, mußt Du halt zwischen den Tasks hin und her springen. Das ist dann aber keine Fähigkeit des Controllers, sondern des Programmes. Wie sagt Dino immer: Ein Mikrocontroller ist kein PC - Du schreibst das Programm, das Betriebssystem und alle Treiber selbst (bzw kopierst die Dir irgendwoher zusammen). Damit läßt sich auch in einem AVR sowas wie preamptives/competetives Multitasking realisieren. Manfred Schwabl-Schmidt hat da bereits dicke Bücher drüber geschrieben.
Jetzt kommt das große ABER:
Neben dem simplen Probrammlogik beherbergt jeder AVR mehr oder weniger integrierte Hardware. Und diese ist mehr oder weniger autark:
-wenn Du 'ne Analog Digital Conversion startest, kann das Hauptprogramm weitermachen, der ADC arbeitet unabhängig davon, und schreibt irgendwann seinen Status und das ergebnis in entsprechende Register (man kann ihn auch im Dauerlauf arbeiten lassen...)
-wenn Du den UART entsprechend konfiguriert hast, und ein byte an den Transmitter übergibst, beginnt der (entsprechend seinen Einstellungen) dieses Byte über den TxD zu senden - während Dein Programm weitermacht
-ahnliches beim UART-Reciever, beim SPI, beim TWI...
-wenn du einen der Timer konfigurierst und startet, läuft der (entsprechend) im Hintergrund durch, unabhängig von Deinem Programm. Insbesondere mit den OutputCompareUnits lassen sich da im Hintergrund interessante Dinge einrichten, PWM etc).
Du kannst jetzt einerseits lesenden/schreibenden Zugriff auf diese Hardware nehmen (zB den Timer lesen, das letzte ADC-ergebnis lesen, den PWM-duty umsetzen etc), andererseits kannst Du aber der Hardware auch die Fähigkeit geben, dein Laufendes Programm gegebenenfalls zu unterbrechen (mit den Interrupts eben) - zB wenn ein Timer überläuft, wenn der ADC ein ergebnis hat, wenn über UART/SPI/TWI ein Byte empfangen/gesendet wurde , ...
Ich empfehle Dir ganz stark, Dir mal so'n (komplettes) Datenblatt eines Kontrollers durchzulesen (überfliegen reicht, die interessanten Stellen liest man dann eh genauer), ggf mehrmals - damit Du überhaupt erstmal ein Gefühl für die Möglichkeiten, das Konzept eines AVR bekommst - das ist dann nämlich bei allen AVR irgendwie ähnlich...