Ich versuche gerade, den Overflow Interrupt des Timer4 vom STM8S zum
laufen zu kriegen. Nach dem der Timer voll ist, läuft das Programm in
eine "_iar_unhandled_exception" (siehe Anhang). Meine Timer
Initialisierung:
Die Initialisierung des Displays in der Interrupt Routine lässt mich
ahnen, dass das Programm strukturelle Mängel hat. Falls du keinen
wirklich wichtigen Grund dafür hast, schlage ich Dir vor, den gesamten
Quelltext zu zeigen, dann können wir Dir helfen, ihn zu verbessern.
auskommentiere lande ich nach dem Overflow nicht in der Exception,
allerdings auch nicht in der Interrupt Funktion. Der Timerwert erhöht
sich nun nur nach jedem 21. Step im Debug-Modus (aber auch erst, nach
dem er einmal mit +6 / Step durchgelaufen ist). Das UIF-Bit wird nach
dem Overflow gesetzt.
Stefan U. schrieb:> Falls du keinen> wirklich wichtigen Grund dafür hast, schlage ich Dir vor, den gesamten> Quelltext zu zeigen, dann können wir Dir helfen, ihn zu verbessern.
Ich hab die Funktionen von oben nochmal umbenannt, nicht wundern:
1
/*
2
* main.c - Datei
3
*/
4
#include"MAX7219SPI.c"
5
#include"stdbool.h"
6
#define H 0x0C
7
#define E 0x0B
8
#define L 0x0D
9
#define S 0x0A
10
11
booldidInit=false;
12
13
uint8_tbuffer[]={
14
H,E,L,L,0,S,S,S,S,1,3,3,7,S,S,S,S
15
};
16
17
voidapplyBuffer(){
18
uint8_tcounter;
19
for(counter=0;counter<8;counter++){
20
SPISendData(counter+1,buffer[8-counter]);
21
}
22
}
23
24
voidshuffleRight(){
25
uint8_tcounter,temp;
26
for(counter=0;counter<sizeof(buffer);counter++){
27
if(counter!=0){
28
uint8_ttemp2=buffer[counter];
29
buffer[counter]=temp;
30
temp=temp2;
31
}else{
32
temp=buffer[counter];
33
buffer[counter]=buffer[sizeof(buffer)-1];
34
}
35
}
36
}
37
38
#pragma vector = 23
39
__interruptvoidTIM4_UPD_OVF_IRQHandler(void){
40
if(!didInit){
41
initMAX7219();
42
didInit=true;
43
}
44
applyBuffer();
45
shuffleRight();
46
TIM4_SR&=~(1<<0);//Clear Interrupt
47
}
48
voidinitGPIOs(){
49
PD_DDR=(1<<MOSI)|(1<<SCK)|(1<<CS);
50
PD_CR1=(1<<MOSI)|(1<<SCK)|(1<<CS);
51
PD_ODR|=(1<<MOSI)|(1<<CS);
52
PD_ODR&=~(1<<SCK);//set SCK to low otherwise first clock isn't generated
Das fehlerträchtige Konstrukt würde ich nochmals überdenken:
#include "MAX7219SPI.c"
Ich habe mal Deine Version übernommen und im IAR kompiliert. Laut
map-file landet die Interrupt-Routine an der richtigen Stelle. Im
Simulator passiert nichts. Damit kenne ich mich allerdings auch nicht
gut aus. Was macht Dein Programm auf der realen Hardware?
Allerdings hätte ich dann erwartet, dass an der Adresse des
Interrupt-Vektors mit der Nr. 23 die Sprungadresse meiner Funktion
steht, aber die ganze Interrupt-Tabelle zeigte im Disassembly auf die
unhandled-exception. Das
1
asm("rim");
ist auch schwer bis unmöglich im Datenblatt zu finden. Naja, STM
typisch.