Forum: Mikrocontroller und Digitale Elektronik ISR macht mucken


von Joachim .. (joachim_01)


Lesenswert?

Moin,
ich mach hiern bisschen Spielerei, hab nen alten 6522 aus meiner 
Jugendzeit an nen ATMega 1284P angehängt der einwandfrei läuft. 
Knuffiges Teilchen.

Über ISR(INT2_vect) kommt nen Interrupt rein. Dort wird ein Bit für 
Zähler++ im Hauptprogramm (Ausgabe auf ein Touch-Display) gesetzt das 
zyklisch in main aufgerufen werden soll. Gleichzeitig wird in der ISR 
ein 16bit-Zähler im 6522 neu justiert. Da ich aber die ISR nicht noch 
größer machen will hab ich das Unwichtige ausgelagert und setze nur ein 
Erkennungsbit.

Seitdem ich das Hauptprogramm  schneller gemacht habe kommt das Bit 
nicht mehr durch. Vorher funktionierte das, auch ohne 
'volatile'-Deklarierung (die ich ohnehin noch nie so ganz verstanden 
hab', was hier aber nicht das Thema ist). Ich benutze noch den Timer 0 
Interrupt, aber selbst den abzuhängen ändert gar nichts.
Irgendne Idee?
1
C-Code
2
3
 ISR(INT2_vect) {
4
  DDRD = 0xFF; //Data out
5
  PORTC = VIA_CHIP_SEL + VIA_T2C_L * 4;
6
  VIA_WRITE();
7
  PORTD = 0x9;      
8
  _delay_us(20); //settle down
9
10
  PORTC = VIA_CHIP_SEL + VIA_T2C_H * 4;
11
  VIA_WRITE();
12
  PORTD = 0x0;  
13
  _delay_us(20); //settle down
14
  DDRD = 0x0; //Data in for next read cycle
15
  IRQflag6522 = 1;  // <- kommt in Hauptprogramm nicht an. Zeitkritisch?  
16
17
}
18
19
im Moment ruft main nur: 
20
21
while (1) {  
22
read6522Register2();
23
}
24
25
26
/************************************************************************
27
 *
28
 * read6522Register2: 6522 register dump
29
 * blank = xx bewirkt austasten (blinken) des zu editierenden Inhalts
30
 *
31
 ************************************************************************/
32
void read6522Register2 (void) {
33
  unsigned int  T2 = 0; 
34
  static uint16_t irq6522 = 0;
35
  
36
  static int8_t count1 = 0;  //blink 5x
37
  static int8_t count2 = 1;  //15 items
38
  static  unsigned long old = 0;
39
  
40
  
41
  //Timer ISR, calculate a nick of time
42
  if ((eternal - old) == 1)  {
43
                count1++;
44
  }  
45
  old = eternal;  
46
  
47
  if (count1 == (2*5)) {
48
            count1 = 0;
49
            count2++;
50
  }          
51
        
52
  if (blink == 1)  {            
53
            blank = count2;
54
  }            
55
  else  blank = 0;   
56
  if (count2 > 15) count2 = 1;
57
  
58
59
  regStatus = read6522 (VIA_IOR_A);  
60
  convDecToHex (255-regStatus); 
61
  if (blank == 1 ) SendAscii(Touch160x104, 4* FONTWIDTH , 1*FONTHEIGHT,"  ");
62
  else        SendAscii(Touch160x104, 4* FONTWIDTH , 1*FONTHEIGHT, buf2);
63
  
64
.
65
.
66
.
67
  
68
  regStatus = read6522 (VIA_T2C_H);
69
  T2 = 65535 - (256 * regStatus + T2) ;
70
  convDecToHex (regStatus);
71
  if (blank == 14) SendAscii(Touch160x104, 8*FONTWIDTH , 7*FONTHEIGHT, "  ");
72
  else        SendAscii(Touch160x104, 8*FONTWIDTH , 7*FONTHEIGHT, buf2);
73
  regStatus = read6522 (VIA_T2C_L);
74
  T2 = regStatus;
75
  convDecToHex (regStatus);
76
  if (blank == 15) SendAscii(Touch160x104, 10*FONTWIDTH +3, 7*FONTHEIGHT , "  ");
77
  else        SendAscii(Touch160x104, 10*FONTWIDTH +3, 7*FONTHEIGHT , buf2);
78
79
80
//check for interrupts ...funktioniert nicht
81
   if (IRQflag6522) {
82
     sprintf( buf1, "IRQs: %i", ++irq6522);  //
83
     SendAscii(Touch160x104, 0, 8*FONTHEIGHT, buf1);
84
    IRQflag6522 = 0;  //release
85
  }

von Walter S. (avatar)


Lesenswert?

Joachim ... schrieb:
> Vorher funktionierte das, auch ohne
> 'volatile'-Deklarierung

Zufall!
volatile muss sein

von Martin K. (maart)


Lesenswert?

Wo wird denn die globale Interruptfreigabe gemacht?

von Joachim .. (joachim_01)


Lesenswert?

>Wo wird denn die globale Interruptfreigabe gemacht?

Vorm Aufruf. Wie gesagt, der Interrupt ist nicht das Problem, der kommt 
ja - ich seh's an der Aktualisierung des Counters im 6522. Lediglich das 
Weiterreichen von IRQflag6522 funktioniert nicht. Ich hab mindestens 
drei mal den Code danach abgesucht ob das der Zustand von IRQflag6522 
irgendwo beeinflusst werden könnte. Hab nix gefunden.

von holger (Gast)


Lesenswert?

Einen Chip in der ISR und in der main()
zu beackern ist ne ziemlich bescheuerte Idee.

von Joachim .. (joachim_01)


Lesenswert?

Wieso? Wie willst'n zeitkritische Probleme außer in nem Nebenprogramm 
handhaben? Ich hab den Code zum debuggen stark vereinfacht, deswegen das 
aufrufen von main aus.

von Joachim .. (joachim_01)


Lesenswert?

Hardware-Problem. Grrrr!

Alles klar jetz.

von ... (Gast)


Lesenswert?

Joachim ... schrieb:
> Hardware-Problem. Grrrr!

Was wars denn?

von Karl H. (kbuchegg)


Lesenswert?

Joachim ... schrieb:
> Wieso? Wie willst'n zeitkritische Probleme

gerade weil es zeitkritisch ist, gehört es in die ISR

Aber solange in deiner ISR ein
   _delay_us(20); //settle down
rumlungert, brauchen wir uns gar nicht länger weiter unterhalten.

zeitkritisch und _delay passen nicht zusammen.

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.