Forum: Compiler & IDEs XPLAIN mit Atxmega128a1 - Problem mit C


von Cru (Gast)


Angehängte Dateien:

Lesenswert?

Hallo erstmal,

ich habe so ziemlich gar keine Ahnung von Mikrokontroller-Programmierung 
und C, das vorneweg erstmal.

Meine Aufgabe zu formulieren ist ein wenig kompliziert deshalb, aber ich 
versuch es einfach mal.

Ich soll für den Atxmega128a1 eine Timer Interruptservice-Routine 
schreiben, die ca. jede Milisekunde ein Interrupt auslöst.
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
void initTimerinterrupt(void);
5
6
int main (void) {
7
8
  sei();          //Interrupts werden zugelassen
9
  PMIC.CTRL |= (1<<PIN0) | (1<<PIN1) | (1<<PIN2);  //High-, Medium und Low-Level freigeben
10
  PORTE.DIR = 0xff;
11
  
12
  TCF0.CNT = 0x00;      //Counter-Register
13
  TCF0.PER = 3999;      //Timer-Topwert auf 3999 gesetzt
14
  TCF0.CTRLA = 0x05;      //Vorteiler auf 1/8 gesetzt
15
  TCF0.INTCTRLA = 0x03;      //Interrupt konfigurieren
16
17
}
18
19
ISR (TCF0_OVL_vect)  {
20
   PORTE.DIRTGL = 0xff;
21
}

Das ist zwar noch keine Millisekunde in der der Interrupt auftritt, aber 
die Logik des Programmes funktioniert.

Nun soll das Alles auch noch einen tieferen Sinn haben. Es soll nämlich 
jede Millisekunde eine Variable hochzählen(timerMilliSec). Das ganze 
soll sozusagen später die Systemzeit sein.

Auf dem Controller wird nämlich zusätzlich noch eine VM gebrannt(bajvm), 
die Java-Code ausführt. (Bajos)

Wenn dann in dem Java-Code steht: System.currentTimeMillis(); soll er 
dann die Millisekunden ausgeben.

Dafür habe ich schon vorgefertigte Klassen bekommen(in C), und einfach 
meinen Code hinzugefügt.
1
//...
2
3
void initHW()  {
4
  sysclk_init();
5
  board_init();
6
  uart_enable_clock(UART_ID);
7
  uart_ctrl_init_defaults(UART_ID);
8
  uart_enable(UART_ID, UART_FLAG_RX | UART_FLAG_TX);
9
10
  // Light up a LED to show that we are ready
11
  led_activate(CONFIG_BOARD_LED_READY);
12
  led_activate(BOARD_LED7_ID);
13
  
14
  bool led_on = true;
15
16
  //Interrupt init
17
  sei();          //Interrupts werden zugelassen
18
  PMIC.CTRL |= (1<<PIN0) | (1<<PIN1) | (1<<PIN2);  //High-, Medium und Low-Level freigeben
19
  
20
  // Konfigurieren des Timers unter Port F  
21
  TCD0.CNT = 0x00;
22
  TCD0.PER = 3999;      //Timer-Topwert auf 3999 gesetzt
23
  TCD0.CTRLA = 0x05;      //Vorteiler auf 8 gesetzt
24
//   TCD0.CTRLB = 0x00;      //Normalmodus
25
  TCD0.INTCTRLA = 0x01;      //Interrupt konfigurieren
26
  
27
//...
28
}
29
ISR (TCD0_OVL_vect)  {
30
    timerMilliSec++;
31
    led_deactivate(BOARD_LED7_ID);  //LED erlischt bei 1. Interrupt
32
}
33
34
//...

Das Ganze klappt natürlich überhaupt nicht. Wieso weiß ich leider nicht.

Deshalb meine Frage: Wo liegt mein Fehler? Ich habe wirklich gar keine 
Ahnung...

Im Anhang befinden sich die beiden *.c-Dateien.

Danke im voraus!

von Florian G. (stromflo)


Lesenswert?

Hi,

wo hakt es denn genau?

Funktioniert die Interruptroutine?

Gruß Flo

von Thomas B. (thomas_b10)


Lesenswert?

Die Routine funktioniert, wenn noch ...
1
while(1) {
2
//endlos
3
}
4
return 0;
hinzugefügt wird.

Das kann ich aber leider in keinster Weise im anderen Code unterbringen. 
Es finden einfach keine Interrupts statt(z.B. die LED7 erlöscht nie).

Ich weiß leider nicht wieso und weshalb. Meine Vermutung ist das die 
Endlossschleife dran Schuld ist.

Edit: Deine Webseite war übrigens sehr hilfreich, danke ;)

von Florian G. (stromflo)


Lesenswert?

Hi,

muss dieser Vector TCD0_OVL_vect nicht eher TCD0_OVF_vect heißen?

Gruß Flo

von Thomas B. (thomas_b10)


Lesenswert?

Das könnte es womöglich sein...ich werde das, sobald ich wieder die 
Möglichkeit habe überprüfen...danke :)

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
Noch kein Account? Hier anmelden.