Inkrementalgeber verliert Schritte beim senden über uart

Gast #1065125
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!
1
#include ….....
2

3

4
/* 9600 baud */
5
#define UART_BAUD_RATE      9600  
6

7

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

11

12
volatile int16_t  enc_delta1;  
13

14

15
char sendString1[4];
16

17
//-------------------------
18

19

20

21

22
int main(void){
23
  
24
      uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 
25
  
26
  sei();
27

28
  while(1){
29
    asm volatile("nop");
30

31
      static char enc_last1 = 0x01;
32
          char i1 = 0;
33

34
          if( PHASE_A1 )
35
              i1 = 1;
36

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

40
            i1 -= enc_last1;      // difference new - last
41

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

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

48

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

51

52
        itoa(enc_delta1,sendString1,10);
53

54
        uart_puts(sendString1);
55
        uart_putc('x');
56

57
      }
58
  }
59
}
Gast #1065129
>Ich wollte aber gern das, dass senden im Hintergrund läuft und am
>liebsten ununterbrochen.

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

Das verplempert so ziemlich viel Zeit und versperrt den µC..
Gast #1065185
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??
Gast #1065190
>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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.