Forum: Compiler & IDEs timer und interrupt


von lisa (Gast)


Lesenswert?

Hallo,
ich bin Anfängerin in c und schreibe in c Code für die Steuerung eines 
Kamera.
Die Steuerung hat bis jetzt ganz gut geklappt, nur mit meine 
Zoom-Routine habe ich einem Problem.

Ziel:
Ich wollte die Zoom meine Kamera steuern so weit, dass beim Tasten-Druck 
die Zielposition des Zooms sich alle Sekunde um 100 --> 0x64 erhöht.

Habe ich mir dann gedacht meine Routine in einer Timer-interrupt zu 
schreiben. (Siehe Code unten).

Problem:
Beim Tasten-druck tut die Kamera nichts und hängt.

vielen dank für Ihre Hilfe
1
#include <avr/io.h>
2
#include <avr/eeprom.h>
3
#include <avr/interrupt.h>
4
5
#include "Kam54g10_menueOSD.h"
6
#include "Kam54g10_usart.h"
7
#include "Kam54g10_CRC.h"
8
9
//Zoom routine--------------
10
#define BYTES_IN_COMMAND 19
11
#define NR_ZOOM_COMMAND 655
12
13
static unsigned short crc_16;
14
static unsigned int ADIteiler=0;
15
16
// Timer IInterrupt Initialisation
17
void initall()
18
{
19
  //interrupt
20
  TCNT0 = 5;        //Set Timer/counter
21
  TIMSK |= (1<<TOIE0);  //Enable Timer/counter0 overflow interrupt
22
  TCCR0 |= (1<<CS01);
23
  TCCR0 |= (1<<CS00);  //Select the clock source to be used by the timer/counter --> CPU Takt  --> 4MHz/64 
24
  TIFR |= (1<<TOV0);  //interrupt starts with each overflow   
25
}//End initall()
26
27
//Interrupt Service Routine für AD Wandlung
28
ISR(TIMER0_OVF_vect) 
29
{
30
  ADIteiler++;             //clocks interrupt counter value on each ms 
31
  if(ADIteiler >= 60)        //Counter cycle for all ms 60
32
  {
33
    ADIteiler=0;          //counter 0 set
34
        
35
  static unsigned char k; //static ist nur in dieser Funktion sichtbar
36
  static unsigned char i;
37
  static unsigned char j;
38
  static unsigned char zommValue = 0;
39
  unsigned char Zoom[NR_ZOOM_COMMAND][BYTES_IN_COMMAND];
40
      
41
    crc_16         = 0;  
42
43
  for(k = 0; k < NR_ZOOM_COMMAND; k++ )
44
  {
45
46
  
47
    Zoom[k][0] = 0x02;
48
    Zoom[k][1] = 0x21;
49
    Zoom[k][2] = 0x45;
50
    Zoom[k][3] = 0x00;
51
    Zoom[k][4] = (unsigned char)(zommValue >>8);
52
    Zoom[k][5] = (unsigned char)zommValue & 0xFF;
53
    Zoom[k][6] = 0x00;
54
    Zoom[k][7] = 0x00;
55
    Zoom[k][8] = 0x00;
56
    Zoom[k][9] = 0x00;
57
    Zoom[k][10] = 0x00;
58
    Zoom[k][11] = 0x00;
59
    Zoom[k][12] = 0x00;
60
    Zoom[k][13] = 0x00;
61
    Zoom[k][14] = 0x00;
62
    Zoom[k][15] = 0x00;
63
    Zoom[k][16] = 0x00;
64
    Zoom[k][17] = 0x00;
65
    Zoom[k][18] = 0x00;
66
67
    for  (i = 1; i < 17; i++ )
68
      crc_16 = update_crc_16(crc_16, Zoom[k][i]); //calculate crc for the command
69
  
70
    Zoom[k][i]   = (unsigned char)(crc_16 >> 8); // add crc value to [17] and [18] Buf position
71
      Zoom[k][i+1] = (unsigned char)crc_16 & 0xFF;
72
73
74
      for  (j = 0; j < BYTES_IN_COMMAND; j++ )
75
        UART_Putc( Zoom[k][j] );
76
77
    zommValue=zommValue+100;
78
  }
79
  
80
  }
81
}//End ISR(TIMER0_OVF_vect) 
82
83
void Send_ZoomCommand( void )
84
{
85
  initall();
86
  cli();
87
  sei();
88
}
89
90
//Main---------
91
#include <stdlib.h>
92
#include <avr/io.h>
93
#include <util/delay.h>
94
#include <avr/interrupt.h>
95
96
#include "Kam54g10_Zoom.h"
97
98
#define BYTES_IN_COMMAND 19
99
100
unsigned int  iState;
101
102
103
104
int main(void)
105
{
106
107
  DDRC = 0x00;    // PORTB auf Eingang
108
  PORTC = 0xFF;      // pull ups for key inputs  PortD2 and portD3
109
  
110
  DDRB = 0xFF;       // outputs for LEDs
111
  PORTB = 0x00;      // LEDs off
112
113
  UART_Init();
114
    
115
  sei();
116
  
117
  
118
  iState = 0;
119
  for(;;)
120
  {
121
  if (iState != PINC)  // Key state changed ?
122
  {
123
    _delay_ms(50);  // dirty "debounce"
124
125
   PINC = PINC & 0xFF;
126
   if ((PINC & 0x01) == 0x00)        // one key
127
   {
128
    Send_MenueCommand(0);
129
    PORTB = 0xFE;
130
   }
131
  
132
   else if ((PINC & 0x02) == 0x00)    // other key
133
   {          
134
    PORTB = 0xF7;
135
    Send_ZoomCommand();
136
   }
137
      
138
   else    // no key
139
   {
140
    PORTB = 0xff;
141
   }
142
   iState = PINC;
143
       }  
144
  }
145
    
146
}

von holger (Gast)


Lesenswert?

#define BYTES_IN_COMMAND 19
#define NR_ZOOM_COMMAND 655


  unsigned char Zoom[NR_ZOOM_COMMAND][BYTES_IN_COMMAND];

Welcher AVR hat denn 12kB RAM?

  static unsigned char k; //static ist nur in dieser Funktion sichtbar
  for(k = 0; k < NR_ZOOM_COMMAND; k++ )

Na, wenn das mal alles so richtig ist.

von lisa (Gast)


Lesenswert?

>#define BYTES_IN_COMMAND 19
>#define NR_ZOOM_COMMAND 655
>
>
>  unsigned char Zoom[NR_ZOOM_COMMAND][BYTES_IN_COMMAND];
>
>Welcher AVR hat denn 12kB RAM?
>
>  static unsigned char k; //static ist nur in dieser Funktion sichtbar
>  for(k = 0; k < NR_ZOOM_COMMAND; k++ )
>
>Na, wenn das mal alles so richtig ist.

Danke,
ich habe nicht drauf geachtet.
ich Benutze Atmega8 1k RAM
jetzt habe ich mein Programm geändert.
1
define NR_ZOOM_COMMAND 50
2
...
3
zommValue=zommValue+1500;

von Stefan E. (sternst)


Lesenswert?

1
   PINC = PINC & 0xFF;
Auch eine extrem sinnvolle Codezeile. ;-)

von Stefan E. (sternst)


Lesenswert?

Es ist doch völlig unnötig so ein großes mehrdimensionales Array 
anzulegen. Jedes Kommando wird zusammengebastelt, zur Kamera gesendet 
und dann nicht mehr gebraucht. Warum also für jedes Kommando ein extra 
Puffer? Warum nicht ein Puffer, der wiederverwendet wird? Dann kannst du 
auch praktisch beliebig viele Kommandos in der Schleife an die Kamera 
senden.

Warum werden überhaupt so viele Kommandos an die Kamera geschickt? Ich 
denke, der Zoom soll sich alle Sekunde nur einmal erhöhen?

von lisa (Gast)


Lesenswert?

>Es ist doch völlig unnötig so ein großes mehrdimensionales Array
>anzulegen. Jedes Kommando wird zusammengebastelt, zur Kamera gesendet
>und dann nicht mehr gebraucht. Warum also für jedes Kommando ein extra
>Puffer? Warum nicht ein Puffer, der wiederverwendet wird? Dann kannst du
>auch praktisch beliebig viele Kommandos in der Schleife an die Kamera
>senden.

Danke
genau so dachte ich mit auch aber wie soll ich den programmieren!?!?
ich habe nicht so viel Kenntnisse in C und bin noch dabei zu lernen.

von Stefan E. (sternst)


Lesenswert?

1
unsigned char Zoom[NR_ZOOM_COMMAND][BYTES_IN_COMMAND];
Entferne hier das "[NT_ZOOM_COMMAND]".

Und bei allen "Zoom[k][..." entfernst du das "[k]".

von lisa (Gast)


Lesenswert?

danke
war schon hilfreich ist aber nicht die lösung
Beim Tasten-druck tut die Kamera immer nichts und hängt.

von Torsten (Gast)


Lesenswert?

static volatile unsigned int ADIteiler=0;

von Torsten (Gast)


Lesenswert?

void Send_ZoomCommand( void )
{
  cli();
  initall();
  sei();
}

von Stefan E. (sternst)


Lesenswert?

Weil in dem Code-Verhau noch diverses anderes im Argen liegt. Z.B. 
berechnet der Code im Augenblick nur für das erste Kommando in der 
Schleife eine korrekte CRC.

von Stefan E. (sternst)


Lesenswert?

Torsten schrieb:
> static volatile unsigned int ADIteiler=0;

Es besteht keine Notwendigkeit für ein "volatile".

von lisa (Gast)


Lesenswert?

>Weil in dem Code-Verhau noch diverses anderes im Argen liegt. Z.B.
>berechnet der Code im Augenblick nur für das erste Kommando in der
>Schleife eine korrekte CRC.

Nein für alle Kommando, ist crc richtig berechnet, habe ich gerade ein 
test gemacht.

weitere Tipp und Kritik akzeptiere ich gerne

von Stefan E. (sternst)


Lesenswert?

lisa schrieb:

> Nein für alle Kommando, ist crc richtig berechnet, habe ich gerade ein
> test gemacht.

Beim obigen Code garantiert nicht.

von lisa (Gast)


Lesenswert?

ja du hast recht, habe ich gerade mitgekriegt
aber warum? weisst du?
1
for(k = 0; k < NR_ZOOM_COMMAND; k++ )
2
  {
3
4
  
5
    Zoom[0] = 0x02;
6
    Zoom[1] = 0x21;
7
    Zoom[2] = 0x45;
8
    Zoom[3] = 0x00;
9
    Zoom[4] = (unsigned char)(zommValue >>8);
10
    Zoom[5] = (unsigned char)zommValue & 0xFF;
11
    Zoom[6] = 0x00;
12
    Zoom[7] = 0x00;
13
    Zoom[8] = 0x00;
14
    Zoom[9] = 0x00;
15
    Zoom[10] = 0x00;
16
    Zoom[11] = 0x00;
17
    Zoom[12] = 0x00;
18
    Zoom[13] = 0x00;
19
    Zoom[14] = 0x00;
20
    Zoom[15] = 0x00;
21
    Zoom[16] = 0x03;
22
    Zoom[17] = 0x00;
23
    Zoom[18] = 0x00;
24
25
    for  (i = 1; i < 17; i++ )
26
      crc_16 = update_crc_16(crc_16, Zoom[i]); //calculate crc for the command
27
  
28
    Zoom[i]   = (unsigned char)(crc_16 >> 8); // add crc value to [17] and [18] Buf position
29
      Zoom[i+1] = (unsigned char)crc_16 & 0xFF;
30
31
32
      for  (j = 0; j < BYTES_IN_COMMAND; j++ )
33
        UART_Putc( Zoom[j] );
34
35
    zommValue=zommValue+10;
36
}

von Stefan E. (sternst)


Lesenswert?

Überlege mal, was mit crc_16 passiert.

von lisa (Gast)


Lesenswert?

einen neuen Wert CRC-16 wir berechenen, basiert der auf dem 
vorhergehenden Wert der zyklischen Blockprüfung und dem folgenden Byte 
der Daten.
Dann in puffer [17] [18] werden die Low und High werte kopiert.

von Muh (Gast)


Lesenswert?

crc_16 = 0;

fehlt da

von lisa (Gast)


Lesenswert?

ouf!!! Danke

stand vor dem for-schleife, jetzt habe ich es drin.
Es funktioniert jetz aber ohne timer, und ist zu schnell und fast nichts 
ist zu sehen.
Mit Timer routine kriege ich nichts
1
void Send_MenueCommand( unsigned char iNo )
2
{
3
  
4
  static unsigned char i; 
5
  static unsigned char j; 
6
  static unsigned char Zoom[BYTES_IN_COMMAND];    //static ist nur in dieser Funktion sichtbar
7
    
8
9
    //C
10
  
11
    for(iNo = 0; iNo < NR_Menue_COMMAND; iNo++ )
12
    {
13
    crc_16         = 0; 
14
    Zoom[0] = 0x02;
15
    Zoom[1] = 0x21;
16
    Zoom[2] = 0x45;
17
    Zoom[3] = 0x00;
18
    Zoom[4] = (unsigned char)(zommValue >>8);
19
    Zoom[5] = (unsigned char)zommValue & 0xFF;
20
    Zoom[6] = 0x00;
21
    Zoom[7] = 0x00;
22
    Zoom[8] = 0x00;
23
    Zoom[9] = 0x00;
24
    Zoom[10] = 0x00;
25
    Zoom[11] = 0x00;
26
    Zoom[12] = 0x00;
27
    Zoom[13] = 0x00;
28
    Zoom[14] = 0x00;
29
    Zoom[15] = 0x00;
30
    Zoom[16] = 0x03;
31
    Zoom[17] = 0x00;
32
    Zoom[18] = 0x00;
33
34
    for  (i = 1; i < 17; i++ )
35
      crc_16 = update_crc_16(crc_16, Zoom[i]); //calculate crc for the command
36
  
37
    Zoom[i]   = (unsigned char)(crc_16 >> 8); // add crc value to [17] and [18] Buf position
38
      Zoom[i+1] = (unsigned char)crc_16 & 0xFF;
39
40
41
      for  (j = 0; j < BYTES_IN_COMMAND; j++ )
42
        UART_Putc( Zoom[j] );
43
44
    zommValue=zommValue+10;
45
46
}

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.