www.mikrocontroller.net

Forum: Compiler & IDEs timer und interrupt


Autor: lisa (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <avr/io.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>

#include "Kam54g10_menueOSD.h"
#include "Kam54g10_usart.h"
#include "Kam54g10_CRC.h"

//Zoom routine--------------
#define BYTES_IN_COMMAND 19
#define NR_ZOOM_COMMAND 655

static unsigned short crc_16;
static unsigned int ADIteiler=0;

// Timer IInterrupt Initialisation
void initall()
{
  //interrupt
  TCNT0 = 5;        //Set Timer/counter
  TIMSK |= (1<<TOIE0);  //Enable Timer/counter0 overflow interrupt
  TCCR0 |= (1<<CS01);
  TCCR0 |= (1<<CS00);  //Select the clock source to be used by the timer/counter --> CPU Takt  --> 4MHz/64 
  TIFR |= (1<<TOV0);  //interrupt starts with each overflow   
}//End initall()

//Interrupt Service Routine für AD Wandlung
ISR(TIMER0_OVF_vect) 
{
  ADIteiler++;             //clocks interrupt counter value on each ms 
  if(ADIteiler >= 60)        //Counter cycle for all ms 60
  {
    ADIteiler=0;          //counter 0 set
        
  static unsigned char k; //static ist nur in dieser Funktion sichtbar
  static unsigned char i;
  static unsigned char j;
  static unsigned char zommValue = 0;
  unsigned char Zoom[NR_ZOOM_COMMAND][BYTES_IN_COMMAND];
      
    crc_16         = 0;  

  for(k = 0; k < NR_ZOOM_COMMAND; k++ )
  {

  
    Zoom[k][0] = 0x02;
    Zoom[k][1] = 0x21;
    Zoom[k][2] = 0x45;
    Zoom[k][3] = 0x00;
    Zoom[k][4] = (unsigned char)(zommValue >>8);
    Zoom[k][5] = (unsigned char)zommValue & 0xFF;
    Zoom[k][6] = 0x00;
    Zoom[k][7] = 0x00;
    Zoom[k][8] = 0x00;
    Zoom[k][9] = 0x00;
    Zoom[k][10] = 0x00;
    Zoom[k][11] = 0x00;
    Zoom[k][12] = 0x00;
    Zoom[k][13] = 0x00;
    Zoom[k][14] = 0x00;
    Zoom[k][15] = 0x00;
    Zoom[k][16] = 0x00;
    Zoom[k][17] = 0x00;
    Zoom[k][18] = 0x00;

    for  (i = 1; i < 17; i++ )
      crc_16 = update_crc_16(crc_16, Zoom[k][i]); //calculate crc for the command
  
    Zoom[k][i]   = (unsigned char)(crc_16 >> 8); // add crc value to [17] and [18] Buf position
      Zoom[k][i+1] = (unsigned char)crc_16 & 0xFF;


      for  (j = 0; j < BYTES_IN_COMMAND; j++ )
        UART_Putc( Zoom[k][j] );

    zommValue=zommValue+100;
  }
  
  }
}//End ISR(TIMER0_OVF_vect) 

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

//Main---------
#include <stdlib.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#include "Kam54g10_Zoom.h"

#define BYTES_IN_COMMAND 19

unsigned int  iState;



int main(void)
{

  DDRC = 0x00;    // PORTB auf Eingang
  PORTC = 0xFF;      // pull ups for key inputs  PortD2 and portD3
  
  DDRB = 0xFF;       // outputs for LEDs
  PORTB = 0x00;      // LEDs off

  UART_Init();
    
  sei();
  
  
  iState = 0;
  for(;;)
  {
  if (iState != PINC)  // Key state changed ?
  {
    _delay_ms(50);  // dirty "debounce"

   PINC = PINC & 0xFF;
   if ((PINC & 0x01) == 0x00)        // one key
   {
    Send_MenueCommand(0);
    PORTB = 0xFE;
   }
  
   else if ((PINC & 0x02) == 0x00)    // other key
   {          
    PORTB = 0xF7;
    Send_ZoomCommand();
   }
      
   else    // no key
   {
    PORTB = 0xff;
   }
   iState = PINC;
       }  
  }
    
}

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: lisa (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
define NR_ZOOM_COMMAND 50
...
zommValue=zommValue+1500; 

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
   PINC = PINC & 0xFF;
Auch eine extrem sinnvolle Codezeile. ;-)

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: lisa (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsigned char Zoom[NR_ZOOM_COMMAND][BYTES_IN_COMMAND];
Entferne hier das "[NT_ZOOM_COMMAND]".

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

Autor: lisa (Gast)
Datum:

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

Autor: Torsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
static volatile unsigned int ADIteiler=0;

Autor: Torsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void Send_ZoomCommand( void )
{
  cli();
  initall();
  sei();
}

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Ernst (sternst)
Datum:

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

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

Autor: lisa (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lisa schrieb:

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

Beim obigen Code garantiert nicht.

Autor: lisa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja du hast recht, habe ich gerade mitgekriegt
aber warum? weisst du?
for(k = 0; k < NR_ZOOM_COMMAND; k++ )
  {

  
    Zoom[0] = 0x02;
    Zoom[1] = 0x21;
    Zoom[2] = 0x45;
    Zoom[3] = 0x00;
    Zoom[4] = (unsigned char)(zommValue >>8);
    Zoom[5] = (unsigned char)zommValue & 0xFF;
    Zoom[6] = 0x00;
    Zoom[7] = 0x00;
    Zoom[8] = 0x00;
    Zoom[9] = 0x00;
    Zoom[10] = 0x00;
    Zoom[11] = 0x00;
    Zoom[12] = 0x00;
    Zoom[13] = 0x00;
    Zoom[14] = 0x00;
    Zoom[15] = 0x00;
    Zoom[16] = 0x03;
    Zoom[17] = 0x00;
    Zoom[18] = 0x00;

    for  (i = 1; i < 17; i++ )
      crc_16 = update_crc_16(crc_16, Zoom[i]); //calculate crc for the command
  
    Zoom[i]   = (unsigned char)(crc_16 >> 8); // add crc value to [17] and [18] Buf position
      Zoom[i+1] = (unsigned char)crc_16 & 0xFF;


      for  (j = 0; j < BYTES_IN_COMMAND; j++ )
        UART_Putc( Zoom[j] );

    zommValue=zommValue+10;
}

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Überlege mal, was mit crc_16 passiert.

Autor: lisa (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Muh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
crc_16 = 0;

fehlt da

Autor: lisa (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
void Send_MenueCommand( unsigned char iNo )
{
  
  static unsigned char i; 
  static unsigned char j; 
  static unsigned char Zoom[BYTES_IN_COMMAND];    //static ist nur in dieser Funktion sichtbar
    

    //C
  
    for(iNo = 0; iNo < NR_Menue_COMMAND; iNo++ )
    {
    crc_16         = 0; 
    Zoom[0] = 0x02;
    Zoom[1] = 0x21;
    Zoom[2] = 0x45;
    Zoom[3] = 0x00;
    Zoom[4] = (unsigned char)(zommValue >>8);
    Zoom[5] = (unsigned char)zommValue & 0xFF;
    Zoom[6] = 0x00;
    Zoom[7] = 0x00;
    Zoom[8] = 0x00;
    Zoom[9] = 0x00;
    Zoom[10] = 0x00;
    Zoom[11] = 0x00;
    Zoom[12] = 0x00;
    Zoom[13] = 0x00;
    Zoom[14] = 0x00;
    Zoom[15] = 0x00;
    Zoom[16] = 0x03;
    Zoom[17] = 0x00;
    Zoom[18] = 0x00;

    for  (i = 1; i < 17; i++ )
      crc_16 = update_crc_16(crc_16, Zoom[i]); //calculate crc for the command
  
    Zoom[i]   = (unsigned char)(crc_16 >> 8); // add crc value to [17] and [18] Buf position
      Zoom[i+1] = (unsigned char)crc_16 & 0xFF;


      for  (j = 0; j < BYTES_IN_COMMAND; j++ )
        UART_Putc( Zoom[j] );

    zommValue=zommValue+10;

}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.