www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zeitraffer Programm (Probleme mit UART)


Autor: Horst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,
bin grad dabei nen motion-ctrl Programm für nen Zeitraffer Kamerakopf 
auf dem ATM8 zu schreiben.

Allerdings tritt ein merkwürdiges Problem auf:
Die Funktion, welche ich zum einlesen von Werten im UART verwendet habe 
hört nicht mehr auf einzulesen....
case '1':   uart_puts_P("\fSet Movielength[s]:");
            for (int i=0; i < 7; i++) buffer[i] = '\0';
            for (int j=0; j < 4; j++){
              while(buffer[j] == '\0') buffer[j] =  uart_getc();
              uart_putc(buffer[j]);
            }
            movielength = atoi(buffer);
            status = 0;
            break;

Benutze die UART-Funktionen von Peter Fleury.
Was mache ich falsch? bis vor kurzem hat diese Fkt. noch funktioniert.

Gruß
Horst

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Horst schrieb:

> Benutze die UART-Funktionen von Peter Fleury.
> Was mache ich falsch? bis vor kurzem hat diese Fkt. noch funktioniert.

Dann hast du wohl irgendwas verändert, was die Funktion abwürgt.
Interrupts irgendwo disabled und vergessen sie wieder anzustellen?

Autor: Horst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also Interrupts sind immer an.
  //UART
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 

  //Timer1 ------ Shutter Ctrl config
    TCCR1B |= (1<<WGM12); // CTC1 Modus
    TCCR1B |= (1<<CS11) | (1<<CS10); // Prescaler 64
    // ((8000000/64)/1000) = 125
    OCR1A = 125-1;
    // Compare Interrupt erlauben
    TIMSK |= (1<<OCIE1A);

  //Timer0 ------ Stepper Ctrl config
    TCCR0 = (1<<CS00); // CPU Takt
    // Overflow Interrupt 
    TIMSK |= (1<<TOIE0);

  //Interrupts 
  sei();  

Könnten meine Timer den UART zerschiessen?
//Interruptroutines
ISR (TIMER1_COMPA_vect)
{
    milliseconds++;
    if(milliseconds >= msperframe){
      milliseconds = 0;
    makephoto = 1;
    frames++;
    }
}

ISR (TIMER0_OVF_vect)
{
  if(runsteppers == 1){
      s1eightmicroseconds++;
      if (s1eightmicroseconds >= s1microvelocity){
        PORTC |=(1<<PC2);
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      s1eightmicroseconds = 0;
     }
      else PORTC &=~(1<<PC2);

      s2eightmicroseconds++;
      if (s2eightmicroseconds >= s2microvelocity){
        PORTC |=(1<<PC4);
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      s2eightmicroseconds = 0;
      }
      else PORTC &=~(1<<PC3);
  }
}

das komische ist, das diese Funktion hier soweit funktioniert:
      case '4':   //Set Angle S1
            uart_puts_P("\fSet Angle S1[°]:");
            for (int i=0; i < 7; i++) buffer[i] = '\0';
            for (int i=0; i < 3; i++){
              while(buffer[i] == '\0') buffer[i] =  uart_getc();
              uart_putc(buffer[i]);
            }
            s1angle = atoi(buffer);
            uart_puts_P("\n\rAngle set to:");
            itoa(s1angle, buffer, 10);
            uart_puts(buffer);
            for (int i=0; i < 7; i++) buffer[i] = '\0';
            s1angle = (s1angle*10000)/360;

            //Set Direction S1
            uart_puts_P("\n\rSet Direction S1[l/r]:");
            for (int i=0; i < 7; i++) buffer[i] = '\0';
            while(buffer[0] == '\0') buffer[0] =  uart_getc();
            if(buffer[0] == 'r') PORTC |=(1<<PC3);
            else{ 
              if(buffer[0] == 'l') PORTC &=~(1<<PC3);
              else uart_puts_P("ERROR");
            }
            for (int i=0; i < 7; i++) buffer[i] = '\0';
            status = 0;
            break;

Gruß
Horst

Autor: Magnetus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Von Kommentaren im Programm scheinst du ja nicht viel zu halten.

Gruß,
Magnetus

Autor: Horst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könnten meine Timer den UART zerschiessen?
//Interruptroutines

//Interrupt every millisecond:
ISR (TIMER1_COMPA_vect)
{
    //increase milliseconds
    milliseconds++;
    //compare actual milliseconds to milliseconds per frame
    if(milliseconds >= msperframe){
      milliseconds = 0;
      //make a photo
      makephoto = 1;
      //count up total frames
      frames++;
    }
}

//Interrupt every 32µs
ISR (TIMER0_OVF_vect)
{
  only do something when steppers are active
  if(runsteppers == 1){
      //increase timing counter
      s1eightmicroseconds++;
      //compare microseconds to a previously calculated variable
      if (s1eightmicroseconds >= s1microvelocity){
        PORTC |=(1<<PC2);
        //do nothing (keep the pulselength > 1µs)
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      s1eightmicroseconds = 0;
     }
      else PORTC &=~(1<<PC2);

      s2eightmicroseconds++;
      if (s2eightmicroseconds >= s2microvelocity){
        PORTC |=(1<<PC4);
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      s2eightmicroseconds = 0;
      }
      else PORTC &=~(1<<PC3);
  }
}

das komische ist, das diese Funktion hier soweit funktioniert:
      case '4':   //Set Angle S1
            uart_puts_P("\fSet Angle S1[°]:");
            //clear buffer
            for (int i=0; i < 7; i++) buffer[i] = '\0';
            //read in array of 3 chars
            for (int i=0; i < 3; i++){
              while(buffer[i] == '\0') buffer[i] =  uart_getc();
              uart_putc(buffer[i]);
            }
            //convert to integer
            s1angle = atoi(buffer);
            //give back value
            uart_puts_P("\n\rAngle set to:");
            itoa(s1angle, buffer, 10);
            uart_puts(buffer);
            //clear buffer
            for (int i=0; i < 7; i++) buffer[i] = '\0';
            //calculate steps for the specified move
            s1angle = (s1angle*10000)/360;

            //Set Direction S1
            uart_puts_P("\n\rSet Direction S1[l/r]:");
            //clear buffer
            for (int i=0; i < 7; i++) buffer[i] = '\0';
            //read in 1 char
            while(buffer[0] == '\0') buffer[0] =  uart_getc();
            if(buffer[0] == 'r') PORTC |=(1<<PC3);
            else{ 
              if(buffer[0] == 'l') PORTC &=~(1<<PC3);
              else uart_puts_P("ERROR");
            }
            //clear buffer
            for (int i=0; i < 7; i++) buffer[i] = '\0';
            //set back status
            status = 0;
            break;

Gruß
Horst

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Magnetus schrieb:
> Von Kommentaren im Programm scheinst du ja nicht viel zu halten.
>

Er scheibt auch nciht viel davon zu halten, sich für immerwiederkehrende 
Funktionalitäten Hilfsfunktionen zu bauen.

Dafür beschäftigt er seinen AVR gerne mit 16-Bit Arithmetik, wenn es 
eigentlich nicht notwendig ist.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Horst schrieb:
> Könnten meine Timer den UART zerschiessen?

Sieht nicht so aus. Aber wer kann das schon aus Fragmenten sagen?

Allerdings erschliesst sich mir die Funktion der ISR nicht wirklich. Die 
ganzen Assembler NOP sind IMHO ziemlich sinnlos.

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.