www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Inkrementalgeber verliert Schritte beim senden über uart


Autor: Kostja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich arbeite mit einem AtMega32 und paar Inkrementalgeber(Code aus dem 
Forum & Handbetrieb), die UART lib nutze ich von Peter Fleury.
Ich Sende mit 9600 Baud da ich mit Bluetooth arbeite. Alles funktioniert 
gut solange ich die Position anfahre dann halte und erst dann Sende 
(Aufbau mit Taster...). Sobald ich aber ununterbrochen sende verliert 
der Sensor die Position!
Ich wollte aber gern das, dass senden im Hintergrund läuft und am 
liebsten ununterbrochen.
Jetzt habe ich im Forum gesucht nach einer Möglichkeit so zu senden das 
es funktioniert aber ohne Erfolg!
#include .....


/* 9600 baud */
#define UART_BAUD_RATE      9600  


#define PHASE_A1  (PINC & 1<<PINC2)  // PINC.0
#define PHASE_B1  (PINC & 1<<PINC3)  // PINC.1


volatile int16_t  enc_delta1;  


char sendString1[4];

//-------------------------




int main(void){
  
      uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 
  
  sei();

  while(1){
    asm volatile("nop");

      static char enc_last1 = 0x01;
          char i1 = 0;

          if( PHASE_A1 )
              i1 = 1;

          if( PHASE_B1 )
              i1 ^= 3;        // convert gray to binary

            i1 -= enc_last1;      // difference new - last

          if( i1 & 1 ){        // bit 0 = value (1)
              enc_last1 += i1;      // store new as next last

              enc_delta1 += (i1 & 2) - 1;    // bit 1 = direction (+/-)
          }


      if(!(PINB &(1<<PB0))){


        itoa(enc_delta1,sendString1,10);

        uart_puts(sendString1);
        uart_putc('x');

      }
  }
}

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich wollte aber gern das, dass senden im Hintergrund läuft und am
>liebsten ununterbrochen.

Dann musst du das auch so programmieren.
itoa(enc_delta1,sendString1,10);
uart_puts(sendString1);
uart_putc('x');

Das verplempert so ziemlich viel Zeit und versperrt den µC..

Autor: Kostja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dachte immer die freie Zeilen würden nichts ausmachen da der Compiler 
das später alles zusammenfasst!
Ist auch bei der Simulation so das er die  freien Zeilen nicht 
abklappert oder Irre ich mich da??

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Dachte immer die freie Zeilen würden nichts ausmachen

;-) Nein, den Tipp hast du falsch verstanden.

Die 3 Zeilen bezogen sich auf

>Das verplempert so ziemlich viel Zeit und versperrt den µC..

Während er deine Zahl in einen String wandelt und sendet,
verpaßt er Inkremente.

Deswegen solltest du dich mal mit (Timer-)Interrupts beschäftigen,
um eine (quasi-)parallele Abarbeitung oder wie du sagst "im Hintergrund"
stattfinden zu lassen.

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.