' 'Testprogramm fuer Bootloader-Aufrufe aus dem Programm heraus ' 'compiler: '--------- 'luna 2015r1 or newer ' 'history: '-------- '2013-02-12 demel start '2015-02-09 Anpassung an 2015r1 or newer ' 'references: '----------- 'Luna Bootloader: http://avr.myluna.de/doku.php?id=de:bootloader 'TaskMgr: http://avr.myluna.de/doku.php?id=de:taskmgr 'ATmega88/168/328/32 doku: http://www.atmel.com 'LunaAVR doku: http://avr.myluna.de/doku.php?id=de:download ' avr.device = atmega168 avr.clock = 20000000 avr.stack = 64 #library "Library/TaskTimer.interface" #library "Library/TaskMgr.interface" const USE_SERIAL = 1 'Die Baudrate muss mit der im Bootloader uebereinstimmen!! #if USE_SERIAL uart.baud = 19200 uart.Recv.enable uart.Send.enable #endif 'Je nach Kontroller START_BOOTLOADER und die Fuses anpassen #if avr.device = "atmega88" const START_BOOTLOADER = FOURTHBOOTSTART #endif #if avr.device = "atmega168" const START_BOOTLOADER = FOURTHBOOTSTART #endif #if avr.device = "atmega328p" const START_BOOTLOADER = THIRDBOOTSTART #endif #if avr.device = "atmega32" const START_BOOTLOADER = THIRDBOOTSTART #endif #define STATUS_LED as portd.5 'Status LED gruen, nur zum testen STATUS_LED.mode = output,low 'Benutzereingabe RS232 Konsole Dim chars as string part TaskManager_initialisieren 'Task usw. fuer TaskMgr definieren #define TIMED_TASKS as 2 '2 Tasks im TaskTimer #define TIMED_TIMESLICE as 1 'TaskTimer lauft mit 1 ms #define MAXIMUM_TASKS as 2 '2 Tasks im TaskManager const FLASH_TIME1 = 150 '150 * 1ms = 150ms 'TaskMgr initialisieren TaskMgr.Init(MAXIMUM_TASKS) TaskMgr.TaskAdd( task_led1_toggle().Addr, FLASH_TIME1) 'TaskMgr.TaskAdd( task_led_gruen_toggle().Addr, FLASH_TIME2) 'TaskTimer initialisieren mit 1 Task und einem Intervall von 1 ms. TaskTimer.Init(Timer2, TIMED_TASKS, TIMED_TIMESLICE) '1 Tasks, 1 ms 'TaskTimer-ISR soll nur die selbst veraenderten Register sichern. 'Dies weil wir eine Methode aus einer Library setzen, welche ihrerseits ebenfalls 'ihre veraenderten Register sichert. Dies spart Stack-Speicher. TaskTimer.SaveMode = selfused 'Die PollRoutine des TaskMgr in den TaskTimer eintragen TaskTimer.Task(0) = TaskMgr.Poll().Addr endpart ' Enable all Interrupt Avr.Interrupts.Enable #if USE_SERIAL print "Test Bootloader" print avr.device #endif do 'Konsolenfunktion fuer Bootloader-Bearbeitung 'hier koennen bei Bedarf natuerlich noch mehr Befehle stehen. Print "Bootloader Demo > " chars = uart.InpStr() select case chars case "reset" jump START_BOOTLOADER case "cls" print 12; case "help" call help() default print "Kein gueltiges Komamndo" endselect loop idle 'Eigenen Programmcode hier einfuegen if TaskMgr.Tick then '1ms Takt vom TaskManager TaskMgr.Schedule() 'Scheduler aufrufen endif endidle procedure task_led1_toggle() STATUS_LED.toggle taskmgr.TaskAdd( task_led1_toggle().Addr, FLASH_TIME1 ) endproc procedure Help() print " Kommando Funktion" print "--------------------------------------------" print " help Befehlsuebersicht" print " cls Bildschirm loeschen" print " reset Neustart durchfuehren" print endproc