Hallo Forum! Ich steh leider furchtbar am Schlauch, der Tag war lang und mein Hirn ist ein Knoten... Ich möchte TIM5 so konfigurieren dass ich von den 32bit mindestens 14bit davon abgreifen kann die im Sekundentakt zählen. Meine taktfrequenz ist 72 Mhz. Irgendwie krieg ich da mit dem Prescaler keine geraden werte zusammen, Beispiel: bit17 zählt in Sekunden somit hab ich 72/65536 = 1098,632813 takte (geht natürlich nicht..) pro bit17 und dem Prescaler kann ich nur ganze Werte geben. Ich hab das nämlich im Urin dass sich das sowieso mit dem 16bit prescaler nicht gerade ausgeht, nur weiss ich nicht wie ich das beweisen kann um mit diesem unsinnigen Experiment aufzuhören... Danke fürs lesen euer Mikrocontrollerlehrbub.
beschreib mal näher was du machen willst, mit einem 16bit Vorteiler kommst du nie auf gerade Sekunden-werte aber der TIM5 hat ja zwei 16bit Vorteiler (Prescaler und Periode) warum stellst du nicht einfach mit denen ein gerades Verhältnis ein
1 | z.B. für 1 Sek (72MHz / 36000 / 2000) = 1Hz |
2 | oder für 1 ms (72MHz / 720 / 100) = 1 kHz |
und in der ISR inkrementierst du eine Globale uint32_t variable die du dann für deine Auswertung nutzen kannst. Uwe
Danke ich bn selbst drauf gekommen dass das nicht geht. Mit dem 16bit Prescaler kann ich nicht soweit runter teilen dass ich miteinem 2^n prescaler (was ja bitpositionen sind) auf 1Hz komme. Die 1Hz brauch ich ohne ISR als downcounter selbsttätig, deswegen kann ich das Event (Periode) nicht verwenden. Meine Lösung (ohne APB prescaler) ist jetzt so und ist ganz einfach:
1 | // Init
|
2 | TIM_TimeBaseInitTypeDef TimerInitStructure; |
3 | |
4 | RCC_APB1PeriphClockCmd(MD_TIMER_APB, ENABLE); |
5 | |
6 | // prescaler fuer bit7= 25Hz
|
7 | TimerInitStructure.TIM_Prescaler = 45000; // fuer 72Mhz |
8 | TimerInitStructure.TIM_CounterMode = TIM_CounterMode_Down; |
9 | TimerInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; |
10 | TIM_TimeBaseInit(MD_TIMER_DEVICE, &TimerInitStructure); |
11 | |
12 | TIM_Cmd(MD_TIMER_DEVICE, DISABLE); |
13 | TIM_InternalClockConfig(MD_TIMER_DEVICE); |
14 | TIM_UpdateDisableConfig(MD_TIMER_DEVICE, DISABLE); |
15 | TIM_GenerateEvent(MD_TIMER_DEVICE, TIM_EventSource_Update); |
16 | |
17 | // Start
|
18 | TIM_Cmd(MD_TIMER_DEVICE, DISABLE); |
19 | TIM_ClearFlag(MD_TIMER_DEVICE, TIM_FLAG_Update); |
20 | /*
|
21 | * weil bit 7 mit 25 Hz schaltet multipliziere ich
|
22 | * Die Sekunden mit 25 und schiebe sie auf bit 7
|
23 | */
|
24 | TIM_SetAutoreload(MD_TIMER_DEVICE, (((uint32_t) (25 * (measurement_interval))) << 6)); |
25 | TIM_SetCounter(MD_TIMER_DEVICE, 0); |
26 | TIM_Cmd(MD_TIMER_DEVICE, ENABLE); |
Grund: der erste ganzzahlige adlib-Prescalerwert von dem aus man dann mittels 2^n prescaler auf 1Hz kommen würde wäre 140625 und das ist > 2^16.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.