LPC1769 Kompass Sensor auslesen mit timer0 interrupt

OP #4149095
Lesenswert?
• ▲
▼
Hallo zusammen,

ich habe einen Kompass Sensor HMC6352 per I2C an meinem LPC1769 
angeschlossen, der mit 100 MHz läuft.
Als IDE verwende ich CooCox.

Die Datenübertragung funktioniert super und die gemessenen Daten sollen 
nach einem Tasterdruck über den CAN-Bus ausgegeben werden, was auch 
einwandfrei funktioniert.

Der Knopfdruck wird bisher über einen GPIO-Interrupt registriert.
Da der Taster aber mordsmäßig prellt, möchte ich sowohl Taster mit 
Timer0 periodisch abfragen (und somit entprellen), sowie auch das Timing 
der Kompassdatenabfrage regeln.

Mit Timer1 wird eine kleine Delay-Funktion realisiert, die einwandfrei 
funktioniert.

Problem: Der Timer0 Interrupt will einfach nichts machen!

Kann jemand das Problem erkennen, warum der nicht anspringt?
Ich tippe auf einen fiesen Anfängerfehler (der ich bezüglich 
ARM-Interrupts auch bin).

Ich Danke und viele Grüße
Stefan
Angehängte Dateien:
#4149099
Lesenswert?
• ▲
▼
Verwendest Du einen Debugger? Wenn nein besoge Dir einen:
1
  LPC_TIM0->MCR = (0x3 << 3);  /* Timer interrupt and reset */
2
  LPC_TIM0->TCR = 1; /* start timer */
3
  while (LPC_TIM0->TCR & (1 << 0));

Das Programm hängt in der while() Schleife beim Init des Timer0. Die hat 
da nix zu suchen, der Timer soll ja niemals anhalten sondern Interrupts 
auslösen.
OP #4149109
Lesenswert?
• ▲
▼
Hallo Jim,

danke, das war dann wohl ein copy-paste-Fehler.
Funktioniert aber auch nicht nach Löschen der betreffenden Zeile.

Hab noch einen viel dooferen Fehler gefunden: Die timer0_init(void) 
steht jetzt auch in der main, geht aber trotzdem noch nicht.

Viele Grüße
Stefan
#4149501
Lesenswert?
• ▲
▼
Ursache ist mal wieder zuviel magic Numbers:
1
LPC_TIM0->MCR = (0x3 << 3);  /* Timer interrupt and reset */

Obiger Code benutzt MR1, Du wolltest aber MR0 benutzen. Wenn man keine 
Konstanten (oder Makros) benutzt, findet man das praktisch nie.

Korrekt wäre also:
1
LPC_TIM0->MCR = 0x3;

Oder besser:
1
LPC_TIM0->MCR =  TIM_INT_ON_MATCH(0) | TIM_RESET_ON_MATCH(0);
OP #4149536
Lesenswert?
• ▲
▼
Hallo Jim,

super! Danke dir für den Hinweis, werd ich heute Abend mal ausprobieren.
Sieht aber gefühlsmäßig so aus, als würde das funktionieren.
Fehler nachvollzogen und daraus gelernt (siehe user manual: Table 430).
Melde mich dann nach dem Test nochmal.
"zuviel magic numbers" :D werd ich mir auch mal merken.

Danke und Gruß
Stefan
OP #4150412
Lesenswert?
• ▲
▼
So, noch kurze Rückmeldung:
1
LPC_TIM0->MCR =  TIM_INT_ON_MATCH(0) | TIM_RESET_ON_MATCH(0);
hat all meine groben Probleme gelöst.
Kleinere Fehler in der delayMs wurden noch behoben und die Funktion 
sieht jetzt so aus:
1
void delayMs(uint32_t delayInMs)
2
{
3
  LPC_TIM1->TCR = TIM_RESET;  /* reset timer */
4
  LPC_TIM1->PR  = 0x00;       /* set prescaler to zero */
5
  LPC_TIM1->MR1 = (SystemCoreClock / 4) / (1000 / delayInMs); //enter delay time
6
  LPC_TIM1->MCR = TIM_STOP_ON_MATCH(1);      /* stop timer on match */
7
  LPC_TIM1->TCR = TIM_ENABLE;        /* start timer */
8
  while (LPC_TIM1->TCR & (1 << 0));  /* wait until delay time has elapsed */
9
}

Danke Jim!

Viele Grüße
Stefan

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.