Der Output Capture 2 (OC2-) Timerinterrupt beim HC12

OP #2084059
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!
OP #2084192
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!
#2084549
Lesenswert?

1
// install OC2 pseudo vector in RAM
2
// (if running with TwinPEEKs monitor)
3
*((unsigned char *)0x07e2) = 0x06; // JMP opcode
4
*((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.
1
// install OC2 pseudo vector in RAM
2
// (if running with TwinPEEKs monitor)
3
*((unsigned char *)0x3FE2) = 0x06; // JMP opcode
4
*((void (**)(void))0x3FE3) = isrOC2;

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

Karl L. schrieb:
>
1
> // install OC2 pseudo vector in RAM
2
> // (if running with TwinPEEKs monitor)
3
> *((unsigned char *)0x07e2) = 0x06; // JMP opcode
4
> *((void (**)(void))0x07e3) = isrOC2;
5
>
>
> 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.
>
>
1
> // install OC2 pseudo vector in RAM
2
> // (if running with TwinPEEKs monitor)
3
> *((unsigned char *)0x3FE2) = 0x06; // JMP opcode
4
> *((void (**)(void))0x3FE3) = isrOC2;
5
>
>
> 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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren