Projekte
BirgerT
nibo2_MyWorx
nibo2_timer2.c
Projekte
Forum
Doku
Öffentliche Projekte
Startseite
Beispielprogramme
Projekte von anderen
Welcome
Username
Passwort
Eingeloggt bleiben
Zugangsdaten vergessen?
Registrieren
Projektverwaltung
⇨ Please choose! ⇦
——————————————————
✎ Create new project...
★ Browse existing projects...
——————————————————
⚬ MotorTest#1
⚬ C Tutorial 8#1
⚬ NIBO2 C Project#1
⚙ C Tutorial 15#1
⚬ 2010_11_18_el_test001#1
nibo2_MyWorx
liesmich.txt
main.c
nibo2_akku.c
nibo2_akku.h
nibo2_audio.c
nibo2_audio.h
nibo2_audio_titels.c
nibo2_globaldef.h
nibo2_parameter.c
nibo2_parameter.h
nibo2_sensors.c
nibo2_sensors.h
nibo2_timer2.c
nibo2_timer2.h
nibo2_tour.c
nibo2_tour.h
nibo2_xbmgfx.c
nibo2_xbmgfx.h
Studio6_m...x_hex.txt
Project details
Compiler settings
Nachrichten
Sie sind nicht eingeloggt.
Neuigkeiten
★
NiboRoboLib 3.6
2017-01-17: Neue Version 3.6
★
NiboRoboLib 3.4.1
2016-04-16: Neue Version 3.4.1
★
Coding Tutorial
2015-11-22: Jetzt auch für den NIBO burger!
Site-Statistic
7427 private projects
385 public projects
16184166 lines compiled
58226 builds
NIBO
@
nibo2_MyWorx/nibo2_timer2.c [read only]
/****************************************************************** Nibo2 Timer 2 Multitask - BirgerT 16.06.2012 BSD License see "liesmich.txt" ******************************************************************/ #include "nibo2_timer2.h" //#include <util/atomic.h> /*************************************************** TASK TABELLE für 10 Adressen von Funktionen die nacheinander alle 10ms aufgerufen werden */ FunctionPtr_t ISR_T2_tasktable [10]; // Serviceroutine alle ms FunctionPtr_t ISR_T2_taskfast = (FunctionPtr_t) 0xffff; // Index der aufzurufenden Funktion static uint8_t ISR_index = 0; // Merker Timer 2 Setup erfolgt, static uint8_t ISR_isSet = 0; static volatile uint8_t ISR_TCNT2; volatile uint8_t ISR_TCNT2_max = 0; /*************************************************** TIMER 2 INIT timer2_init() Timer 2 für 1ms Interrupt einrichten dass er alle 1ms einen Comparematch auslöst.In die ISR können bis zu 10 Zeiger auf Funktionen eingeklinkt werden, die dann alle 10ms aufgerufen werden. Die beim 1. Init Aufruf übergebene Adresse wird alle 1ms aufgerufen, als FastTask; Soll kein Fasttask eingerichtet werden, muss der erste Aufruf mit Adresse == 0 erfolgen. -> Adresse einer ISR Function, die alle 10ms aufgerufen wird. Die Funktion darf max 1ms lang dauern. Ist Adresse == 0 wird Slot nur belegt, nix ausgeführt. <- Anzahl der eingerichteten Tasks (Index nächster Task) */ uint8_t timer2_init(FunctionPtr_t task){ if((FunctionPtr_t)0xffff==ISR_T2_taskfast){ //Setup Timer 2 fuer 1ms Interrupt im CTC2 Mode // (F_CPU) 16.000.000 Hz/ (CS21|CS20) 64 = 250.000 Hz // 250.000 Hz/ (OCR2+1) 250 = 1000 Hz = 1/1ms TCNT2 = 0; TCCR2 = _BV(CS21) | _BV(CS20) | _BV(WGM21); OCR2 = 249; // Comp_Match Interrupt freigeben TIMSK |= _BV(OCIE2); // FastTask einrichten ISR_T2_taskfast = task; }else{ if(10>ISR_isSet){ // ATOMIC_BLOCK(ATOMIC_RESTORESTATE){ uint8_t tmpSREG = SREG; cli(); ISR_T2_tasktable[ISR_isSet] = task; SREG = tmpSREG; // } ISR_isSet++; return(ISR_isSet); } else { return(0); } } return(0); } //**************************************** TIMER 2 INTERRUPT ISR (TIMER2_COMP_vect){ // Soll Fast Task alle 1ms ausgeführt werden? FunctionPtr_t ISR_task = ISR_T2_taskfast; if(ISR_task != 0){ ISR_task(); } // Array mit Adressen von ISR Routinen if(++ISR_index > 9) ISR_index = 0; ISR_task = ISR_T2_tasktable[ISR_index]; if(ISR_task != 0){ ISR_task(); } // TimerCounter Stand u. Max. bereit stellen ISR_TCNT2 = TCNT2; if(ISR_TCNT2 > ISR_TCNT2_max) ISR_TCNT2_max = TCNT2; }
Compiler results:
Werbung
Online
carindegillern94884
josch
workwind