Hallo,
bei meinem ersten AVR-Projekt bin ich nun an einer Stelle zum Stehen gekommen, wo ich nicht mehr weiter weiss und mal um Euren Rat fragen möchte.
Gebaut werden soll eine Motorsteuerung mit einem At90S2313. Zum Programmieren nutze ich BASCOM AVR, geflasht wird mit WinAVR. Der Motor ist über einen BUK 100 am PWM Ausgang PB3 angeschlossen. Timer1 ist so konfiguriert:
Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Durch Verändern des Wertes von Compare1a wird die Motordrehzahl gesteuert. Einfluss auf die Motordrehzahl haben 2 Tasten UP/DOWN, ankommende Befehle des UART (RS-232) und 4bit Informationen, die auf Int0 an den Eingängen PB0,PB1,PB2,PB4. Mit den Tasten wird der gesamte mögliche Wertebereich für Compare1a (byte) durchschritten, bei den übrigen Ereignissen wird Compare1a auf einen Wert zwischen 0-255 gesetzt (Tabelle).
Es läuft soweit alles, die Ansteuerung über Tasten, UART und auch von extern 4bit+strobe an Int0 klappen.
Als nächstes sollen Geschwindigkeits- und Zeitinformationen als Sequenz im EEPROM abgelegt werden. Das Schreiben (Writeeeprom) und das Auslesen (Readeeprom) der Daten funktioniert bereits.
Aber nun kommt das Problem:
Das Programm soll bis zum Auslesen des nächsten Befehls eine definiert lange Pause machen, bis der nächste Wert geholt wird. Dabei darf aber der sonstige Programmablauf nicht angehalten werden wie das bei einem WaitMs der Fall ist. Als Geschwindigkeitsinformation dient das obere nibble, als Zeitinformmation das untere nibble des im EEPROM hinterlegten bytes.
Ich suche also eine Möglichkeit, im Hintergrund eine Zeit verstreichen zu lassen (einstellbare Dauer). Ich habe dabei an den noch vorhandenen timer0 gedacht... der sollte doch in der Lage sein, unabhängig von allen anderen Ereignissen einen internen Interupt auszulösen wenn die voreingestellte Zeit verstrichen ist und so das Übernehmen des nächsten EEPROM Wertes einleiten können (Subroutine). Aber genau hier komme ich nicht weiter... Wer hat eine Idee, wie ich das Auslesen des EEPROM in den Hintergrund legen kann, ohne dass mit einem WaitMS das ganze Programm angehalten wird?
Hier mein bisheriges Quellcodegewurstel zum Angucken:
Für Verbesserungsvorschläge am gesamten Code bin ich natürlich auch jederzeit dankbar... wie gesagt, es ist mein erstes AVR Projekt und ich stelle mich bestimmt noch ungeschickt dabei an...
Danke
Kai