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!