Hi
Du bist mit dieser Erfahrung nicht allein. Hier hilft vielleicht der folgende Vorschlag von mir
Zerlege dein Programm in kleine Elemente
Zuerst die Initialisierungen jeweils eine Sub für Timer, UART etc.
danach Initialisierungsroutinen und setzen von Default-Werten
weiter eine Sub für's Einlesen der Peripherie
eine Sub für Schnittstellen
eine für Ausgabe an die Peripherie
Löse dich von dem Gedanken, alles in einer Schleife abhandeln zu müssen. Da ich in Assembler programmiere, ist es noch wichtiger, große Programmblöcke zu meiden. Ein Richtwert ist da, das die Routinen auf eine Din A 4 Seite passen. So kann ich in einer Dokumentenmappe auch mal auf Paperware zugreifen und nachlesen. Allerdings gibt's auch da Ausnahmen.
So sieht mein Programm im Prinzip wie folgt aus
Code:
Loop_Main:
RCALL Read_IO
RCALL Read_Com_Buf
RCALL Set_IO_Event
RCALL Chk_IO_Event
RCALL Set_IO_Out
RCALL Send_Com
RJMP Loop_Main
Nun, was auch immer hinter den aufgerufenen Blöcken steht ist erst einmal nicht wichtig. Um ein solches Gerüst ans laufen zu bekommen, werden einfach die Rümpfe der Sub-Routinen geschrieben
]
Code:
Read_IO:
RET
Read_Com_Buf:
RET
usw.
Nach und nach fülle ich nun die Subroutinen mit Inhalt, kann Ergebnisse testen und fertige Subroutinen ablegen und einen Haken dran machen. Muss mal etwas geändert werden... entweder eine neue Sub oder aber eine vorhandene wird erweitert. Bemüh dich dabei, immer nur ein Problem oder Aufgabe in einer Sub zu lösen. Am deutlichsten ist das Einlesen der IO. Nur die Bits aus der Peripherie holen und in Bytes ablegen. Danach ist bis zum nächsten Zyklusdurchlauf nicht wichtig, ob da eine Änderung stattgefunden hat. Und wenn doch, dann musst du sowieso auf Interrupt gehen und die Info anderweitig ins Programm bringen. Am Beispiel der Read_Com:
Read_Com ist nicht die Empfangsroutine, das macht eine Interrupt-Routine eine sogenannte ISR. Diese hat einen Puffer, auf den zwei Zeiger zeigen. Einen Lese- und einen Schreibzeiger. Kommt ein Zeichen, wird es im Puffer auf die Stelle geschrieben, wohin der Schreibzeiger zeigt und der Schreibzeiger erhöht oder auf 0 gesetzt, wenn er die Puffergrenze erreicht. Fertig. um mehr kümmert sich die ISR nicht. Es gibt überhaupt keinen Eingriff ins Hauptprogramm. Der Trick ist nun, und das macht das Hauptprogramm in Read_Com, die beiden Zeiger zu vergleichen und bei einem ferstgestellten Unterschied müssen im Puffer unbearbeitete Informationen aus einem seriellen Empfang vorliegen. Nun kann in aller Ruhe dieses Byte bearbeitet und der Empfangszeiger nachgeführt werden.
So, das waren mal ein paar Beispiele. Auch ich nehme mir ein Blatt Papier oder einfach Powerpoint und male mir da so ein paar Kästen drauf, die dann die Subroutinen symbolisieren. So bekomme ich Überblick, bzw. behalte diesen. Vielleicht hift's dir.
Gruß oldmax