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


von J. R. (cia_man)


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!

von J. R. (cia_man)


Lesenswert?

Weiß denn niemand was??? Help I need help! ;)

von J. R. (cia_man)


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!

von J. R. (cia_man)


Lesenswert?

Keiner ne kleine Idee .... Hinweis??? :(

von J. R. (cia_man)


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 ???

von Karl M. (movex)


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.

von J. R. (cia_man)


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! :)

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.