www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Der Output Capture 2 (OC2-) Timerinterrupt beim HC12


Autor: J. R. (cia_man)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe dieses Programm hier das für den MC9S12D64 geschrieben wurde!

//--------------------------------------------------------------
#include <stdio.h>
#include "hcs12dp256.h"
//--------------------------------------------------------------
#pragma interrupt_handler isrOC2
void isrOC2(void) {
TFLG1 = 0x04; // clear OC2 Intr Flag
TC2 += 31250u; // 1 interrupt every 31250 timer ticks (0.5s)
PTH ^= 0x80; // toggle LED
}
//--------------------------------------------------------------
void main(void) {
// install OC2 pseudo vector in RAM
// (if running with TwinPEEKs monitor)
*((unsigned char *)0x3fe2) = 0x06; // JMP opcode
*((void (**)(void))0x3fe3) = isrOC2;
// make PTH[7] an Output to drive the LED
DDRH |= 0x80;
// Timer Setup
TSCR1 = 0x80; // Timer enable
TSCR2 = 0x07; // Prescaler = 128 (1 timer tick every 16μs)
TCTL2 = 0x00; // TC2 disconnected from Pin
TIOS |= 0x04; // TC2 is Output Compare
TIE |= 0x04; // TC2 Interrupt enable
// enable Interrupts
asm("cli");
// loop endless (and let the interrupt work)
while(1) ;
}
//==============================================================

Ich habe es für meinen MC68HC912DG128A folgendermaßen umgeschrieben:

//--------------------------------------------------------------
#include <stdio.h>
#include "mc912d128.h"
//--------------------------------------------------------------
#pragma interrupt_handler isrOC2
void isrOC2(void) {
TFLG1 = 0x04; // clear OC2 Intr Flag
TC2 += 31250u; // 1 interrupt every 31250 timer ticks (0.5s)
DDRH ^= 0x80; // toggle LED
}
//--------------------------------------------------------------
void main(void) {
// install OC2 pseudo vector in RAM
// (if running with TwinPEEKs monitor)
*((unsigned char *)0x3fe2) = 0x06; // JMP opcode
*((void (**)(void))0x3fe3) = isrOC2;
// make PTH[7] an Output to drive the LED
DDRH |= 0x80;
// Timer Setup
TSCR1 = 0x80; // Timer enable
TSCR2 = 0x07; // Prescaler = 128 (1 timer tick every 16ìs)
TCTL2 = 0x00; // TC2 disconnected from Pin
TIOS |= 0x04; // TC2 is Output Compare
TIE |= 0x04; // TC2 Interrupt enable
// enable Interrupts
asm("cli");
// loop endless (and let the interrupt work)
while(1) ;
}
//==============================================================

Doch ich bekomme immer noch Fehlermeldungen!

!E C:\Programme\iccv712\EIGENE~1\blink2.c(20): undeclared identifier 
`TSCR1'
!E C:\Programme\iccv712\EIGENE~1\blink2.c(21): undeclared identifier 
`TSCR2'
!E C:\Programme\iccv712\EIGENE~1\blink2.c(24): undeclared identifier 
`TIE'
C:\Programme\iccv712\bin\imakew.exe: Error code 1

In meiner Include-Datei habe ich auch gesehen, dass diese Befehle 
TSCR1,TSCR2,TIE nicht enthalten sind! Doch wie bekomme ich nun das 
Programm zum laufen?

THX!

Autor: J. R. (cia_man)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weiß denn niemand was??? Help I need help! ;)

Autor: J. R. (cia_man)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab jetzt das Programm verändert -> anderes Bsp das gehen soll! Ist aber 
bis auf ein paar Ausnahmen dem obigen sehr ähnlich! Nun bekomme ich 
keine Fehlermeldungen mehr, aber nach dem Laden auf den Controller 
blinkt das Licht nicht wie es soll???? :(


//--------------------------------------------------------------
#include <stdio.h>
#include "mc912d128.h"
//--------------------------------------------------------------
void _HC12Setup(void) {
  COPCTL = 0x08;        // disable Watchdog
  }
//--------------------------------------------------------------
#pragma interrupt_handler isrOC2
void isrOC2(void) {
TFLG1 = 0x04; // clear OC2 Intr Flag
TC2 += 31250u; // 1 interrupt every 31250 timer ticks (0.5s)
PORTH ^= 0x80; // toggle LED
}
//--------------------------------------------------------------
void main(void) {
// install OC2 pseudo vector in RAM
// (if running with TwinPEEKs monitor)
*((unsigned char *)0x07e2) = 0x06; // JMP opcode
*((void (**)(void))0x07e3) = isrOC2;
// make PTH[7] an Output to drive the LED
DDRH |= 0x80;
// Timer Setup
TSCR = 0x80; // Timer enable
TMSK2 = 0x07; // Prescaler = 128 (1 timer tick every 16ìs)
TCTL2 = 0x00; // TC2 disconnected from Pin
TIOS |= 0x04; // TC2 is Output Compare
TMSK1 |= 0x04; // TC2 Interrupt enable
// enable Interrupts
asm("cli");
// loop endless (and let the interrupt work)
while(1) ;
}
//==============================================================

Warum????

Wo steckt der Fehler?

THX!

Autor: J. R. (cia_man)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keiner ne kleine Idee .... Hinweis??? :(

Autor: J. R. (cia_man)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Link: Use the "Custom" Linker Setting with the following options:
//       Program Memory = 0x8000
//       Data Memory    = 0x0200
//       Stack Pointer  = 0x0700

Wenn ich das beim Kompilieren ändere, dann geht die Lampe nach dem Laden 
des Programms aus aber blinkt nicht ???

Autor: Karl M. (movex)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
// install OC2 pseudo vector in RAM
// (if running with TwinPEEKs monitor)
*((unsigned char *)0x07e2) = 0x06; // JMP opcode
*((void (**)(void))0x07e3) = isrOC2;

Laut 912DG128A RM ist dieser Bereich nicht vergeben, dort ist also kein 
RAM.
Im card12v11 Manual Seite 12 ( 
http://elmicro.com/files/elmicro/card12v11_manual_de.pdf )liegen die 
Vektoren 0x3F00- 0x3FFF, also am Ende des RAM welches von 0x2000 - 
0x4000 geht.

D.h. folgendes ist korrekt.
// install OC2 pseudo vector in RAM
// (if running with TwinPEEKs monitor)
*((unsigned char *)0x3FE2) = 0x06; // JMP opcode
*((void (**)(void))0x3FE3) = isrOC2;

Der Linker muss natürlich auch korrekt bedatet werden. Data Memory und 
Stackpointer müssen geändert werden.

Autor: J. R. (cia_man)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl L. schrieb:
>
> // install OC2 pseudo vector in RAM
> // (if running with TwinPEEKs monitor)
> *((unsigned char *)0x07e2) = 0x06; // JMP opcode
> *((void (**)(void))0x07e3) = isrOC2;
> 
>
> Laut 912DG128A RM ist dieser Bereich nicht vergeben, dort ist also kein
> RAM.
> Im card12v11 Manual Seite 12 (
> http://elmicro.com/files/elmicro/card12v11_manual_de.pdf )liegen die
> Vektoren 0x3F00- 0x3FFF, also am Ende des RAM welches von 0x2000 -
> 0x4000 geht.
>
> D.h. folgendes ist korrekt.
>
>
> // install OC2 pseudo vector in RAM
> // (if running with TwinPEEKs monitor)
> *((unsigned char *)0x3FE2) = 0x06; // JMP opcode
> *((void (**)(void))0x3FE3) = isrOC2;
> 
>
> Der Linker muss natürlich auch korrekt bedatet werden. Data Memory und
> Stackpointer müssen geändert werden.

Du bist mein Held für heute!!!! DANKE! ;)

Ich muss sagen, ist wirklich komplex dieser Controller... ein kleiner 
Fehler und schon geht gar nix mehr! :)

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.