www.mikrocontroller.net

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


Autor: Cru (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

#include <avr/io.h>
#include <avr/interrupt.h>

void initTimerinterrupt(void);

int main (void) {

  sei();          //Interrupts werden zugelassen
  PMIC.CTRL |= (1<<PIN0) | (1<<PIN1) | (1<<PIN2);  //High-, Medium und Low-Level freigeben
  PORTE.DIR = 0xff;
  
  TCF0.CNT = 0x00;      //Counter-Register
  TCF0.PER = 3999;      //Timer-Topwert auf 3999 gesetzt
  TCF0.CTRLA = 0x05;      //Vorteiler auf 1/8 gesetzt
  TCF0.INTCTRLA = 0x03;      //Interrupt konfigurieren

}

ISR (TCF0_OVL_vect)  {
   PORTE.DIRTGL = 0xff;
}


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.

//...

void initHW()  {
  sysclk_init();
  board_init();
  uart_enable_clock(UART_ID);
  uart_ctrl_init_defaults(UART_ID);
  uart_enable(UART_ID, UART_FLAG_RX | UART_FLAG_TX);

  // Light up a LED to show that we are ready
  led_activate(CONFIG_BOARD_LED_READY);
  led_activate(BOARD_LED7_ID);
  
  bool led_on = true;

  //Interrupt init
  sei();          //Interrupts werden zugelassen
  PMIC.CTRL |= (1<<PIN0) | (1<<PIN1) | (1<<PIN2);  //High-, Medium und Low-Level freigeben
  
  // Konfigurieren des Timers unter Port F  
  TCD0.CNT = 0x00;
  TCD0.PER = 3999;      //Timer-Topwert auf 3999 gesetzt
  TCD0.CTRLA = 0x05;      //Vorteiler auf 8 gesetzt
//   TCD0.CTRLB = 0x00;      //Normalmodus
  TCD0.INTCTRLA = 0x01;      //Interrupt konfigurieren
  
//...
}
ISR (TCD0_OVL_vect)  {
    timerMilliSec++;
    led_deactivate(BOARD_LED7_ID);  //LED erlischt bei 1. Interrupt
}

//...

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!

Autor: Florian G. (stromflo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

wo hakt es denn genau?

Funktioniert die Interruptroutine?

Gruß Flo

Autor: Thomas B. (thomas_b10)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Routine funktioniert, wenn noch ...
while(1) {
//endlos
}
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 ;)

Autor: Florian G. (stromflo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

muss dieser Vector TCD0_OVL_vect nicht eher TCD0_OVF_vect heißen?

Gruß Flo

Autor: Thomas B. (thomas_b10)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.