K
Kai Ebersbach
Guest
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:
http://www.kai-ebersbach.de/avr/12-2313.bas
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
--
Die angegebene Mailadresse ist replyfähig, sie verfällt
jedoch zum Ende eines jeden Quartals und wird durch eine
neue nach dem Muster usenetQQYYYY@kai-ebersbach.de ersetzt.
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:
http://www.kai-ebersbach.de/avr/12-2313.bas
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
--
Die angegebene Mailadresse ist replyfähig, sie verfällt
jedoch zum Ende eines jeden Quartals und wird durch eine
neue nach dem Muster usenetQQYYYY@kai-ebersbach.de ersetzt.