Forum: Compiler & IDEs RC5-Auswertung Problem


von Alan (Gast)


Lesenswert?

Um rc5-Code auszuwerten verwende ich folgenden Code:
1
#include "base.h"
2
#include "uart.h"
3
#include <avr/interrupt.h>
4
volatile int oldstate = 0;
5
volatile int state;
6
volatile int samples = 0;
7
volatile int rc5data[29];
8
volatile int pos = 0;
9
volatile int complete =0;
10
volatile int bitcount = 0;
11
12
ISR(TIMER0_OVF_vect) 
13
{
14
  if(pos != 28) {
15
    state = !(PINB & (1<<PINB0));
16
    if(state == oldstate) {
17
      bitcount++;
18
    }
19
    if(state != oldstate) {
20
      if(12 <= bitcount <=  14)  {
21
        rc5data[pos] = state;
22
        pos++;
23
      }
24
      if(26 <= bitcount <=  28)  {
25
        rc5data[pos] = state;
26
        pos++;
27
        rc5data[pos] = state;
28
        pos++;
29
      }
30
      bitcount = 0;
31
      oldstate = state;
32
    }
33
  }
34
  else {
35
    complete = 1;
36
  }
37
    PORTD ^= (1<<PD7);
38
    
39
  
40
}
41
42
43
int main(void) {
44
  uart_init();
45
  DDRD |= (1<<PD7);
46
  TCCR0 |= (1<<CS00);
47
  sei();
48
  TIMSK |= (1<<TOIE0);
49
  uart_putc('a');
50
  while(complete == 0) {
51
    asm volatile ("nop");
52
  }
53
  TIMSK &= ~(1<<TOIE0);
54
  uart_putc('b');
55
  int i = 0;
56
  while(i != 28) {
57
    uart_puts(intToString(rc5data[i], 1));
58
    i++;
59
  }
60
  
61
  
62
}
Der Ansatz: Der Interrupt wird alle 64us aktiviert und misst die Zeit in 
der das Signal konstant ist.
Das Problem: Wenn ich eine Taste auf der Fernbedienung 1x drücke, 
passiert nix. Erst nach fünfmaligem Drücken erhalte ich Datenmüll. Wo 
liegt der Fehler?
Alles @ Atmega32 @ 4MHz

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

1) if(26 <= bitcount <=  28) tut nicht was du denkst
2) 16-Bit-Variablen die zwischen main und ISR geteilt werden müssen 
atomar zugegriffen werden

von Alan (Gast)


Lesenswert?

1) Was tut der Ausdruck denn dann?
2) wie mache ich das?

von Stefan E. (sternst)


Lesenswert?

Alan wrote:

> 1) Was tut der Ausdruck denn dann?

Das Ergebnis des <=-Operators ist 0 oder 1, und der Linke wird zuerst 
ausgewertet. Dann steht dort also (je nach dem Wert von bitcount)
"(0 <= 28)" oder "(1 <= 28)".
"(26 <= bitcount <=  28)" ist also immer wahr.

> 2) wie mache ich das?

((26 <= bitcount) && (bitcount <= 28))

von Stefan E. (sternst)


Lesenswert?

Ach so, das "wie mache ich das?" bezog sich wohl auf die 
16-Bit-Variablen, sorry. ;-)

Indem du außerhalb der Interrupt-Routine vor dem Zugriff auf die 
Variable die Interrupts sperrst, und danach wieder freigibst. Wenn ich 
das richtig sehe, kannst du aber auch aus allen deinen int einfach 
8-Bit-Variablen machen, dann hast du das Problem nicht.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

3) nach der 2. while-Schleife verlässt Du main(). Danach arbeiten nur 
noch die Interrupts. Nach main() fällt das Prog in eine Endlosschleife 
(_exit).

von Alan (Gast)


Lesenswert?

Der TimerInterrupt sollte doch schon dadurch
1
TIMSK &= ~(1<<TOIE0);
 außer Gefecht gesetzt werden. Oder lauern da noch weitere GCC-Fallen?

von Alan (Gast)


Lesenswert?

Nun? Findet wer auch noch logische Fehler, denn nun wird gar nichts mehr 
ausgegeben :(

von Stefan E. (sternst)


Lesenswert?

Dann poste mal den aktuellen Code.

von Alan (Gast)


Lesenswert?

1
#include "base.h"
2
#include "uart.h"
3
#include <avr/interrupt.h>
4
volatile int oldstate = 0;
5
volatile int state;
6
volatile int samples = 0;
7
volatile int rc5data[29];
8
volatile int pos = 0;
9
volatile int complete =0;
10
volatile int bitcount = 0;
11
12
ISR(TIMER0_OVF_vect) 
13
{
14
  if(pos != 28) {
15
    state = !(PINB & (1<<PINB0));
16
    if(state == oldstate) {
17
      bitcount++;
18
    }
19
    if(state != oldstate) {
20
      if((12 <= bitcount) && (bitcount <=  14))  {
21
        rc5data[pos] = state;
22
        pos++;
23
      }
24
      if((26 <= bitcount) && (bitcount <=  28))  {
25
        rc5data[pos] = state;
26
        pos++;
27
        rc5data[pos] = state;
28
        pos++;
29
      }
30
      bitcount = 0;
31
      oldstate = state;
32
    }
33
  }
34
  else {
35
    complete = 1;
36
  }
37
    PORTD ^= (1<<PD7);
38
    
39
  
40
}
41
42
43
int main(void) {
44
  uart_init();
45
  DDRD |= (1<<PD7);
46
  TCCR0 |= (1<<CS00);
47
  sei();
48
  TIMSK |= (1<<TOIE0);
49
  uart_putc('a');
50
  while(complete == 0) {
51
    asm volatile ("nop");
52
  }
53
  TIMSK &= ~(1<<TOIE0);
54
  uart_putc('b');
55
  int i = 0;
56
  while(i != 28) {
57
    uart_puts(intToString(rc5data[i], 1));
58
    i++;
59
  }

bittesehr :)

von Karl H. (kbuchegg)


Lesenswert?

Irgendwie sind mir die hier geforderten Timings
1
      if((12 <= bitcount) && (bitcount <=  14))  {
2
        rc5data[pos] = state;
3
        pos++;
4
      }
5
      if((26 <= bitcount) && (bitcount <=  28))  {

viel zu strikt.
Du erlaubst gerade mal eine Variation in bitcount von 3 Einheiten.
Bei einem voll laufenden 8-Bit Timer sind das gerade mal ~750
Takte. Nicht gerade viel Spielraum für den Sender um das Timing
einzuhalten.

Warum gehst du nicht einfach her und sagst:
Wenn der bitcount < 20 ist, dann werte ich das als Zustand 1
und alles darüber ist Zustand 2.

In deinem Programm passiert ja soweiso nichts, wenn das Timing
ausserhalb der von dir eingeführten Grenze liegt. Wenigstens
eine Fehlerled würde ich anmachen, damit man auch verfolgen kann,
dass das Timing nicht gestimmt hat.

von Alan (Gast)


Lesenswert?

Jetzt bekomme ich: 1011011011011011011011011011 und das egal, welche 
Taste gedrückt wurde. Manchmal passiert auch gar nichts, wenn die taste 
nur kurz gedrückt wurde, wenn ich sie lang drücke, kommt wieder das 
obige :(

von Alan (Gast)


Lesenswert?

Jetzt hab ich nen 16MHz Quarzoszillator genommen (Int wird alle 16us 
aufgerufen) , den code angepasst und es geht immer noch nich :(
1
#include "base.h"
2
#include "uart.h"
3
#include <avr/interrupt.h>
4
volatile int oldstate = 0;
5
volatile int state;
6
volatile int samples = 0;
7
volatile int rc5data[29];
8
volatile int pos = 0;
9
volatile int complete =0;
10
volatile int bitcount = 0;
11
12
ISR(TIMER0_OVF_vect) 
13
{
14
  if(pos != 28) {
15
    state = !(PINB & (1<<PINB0));
16
    if(state == oldstate) {
17
      bitcount++;
18
    }
19
    if(state != oldstate) {
20
      if(bitcount < 83)  {
21
        rc5data[pos] = state;
22
        pos++;
23
      }
24
      if(bitcount > 83)  {
25
        rc5data[pos] = state;
26
        pos++;
27
        rc5data[pos] = state;
28
        pos++;
29
      }
30
      bitcount = 0;
31
      oldstate = state;
32
    }
33
  }
34
  else {
35
    complete = 1;
36
  }
37
    PORTD ^= (1<<PD7);
38
    
39
  
40
}
41
42
43
int main(void) {
44
  uart_init();
45
  DDRD |= (1<<PD7);
46
  TCCR0 |= (1<<CS00);
47
  sei();
48
  TIMSK |= (1<<TOIE0);
49
  /*while(complete != 1) {
50
    asm volatile ("nop");
51
  }
52
  uart_puts("complete!");
53
  asm volatile ("nop");
54
  int j = 0;
55
  uart_puts("\n\r");
56
  while(j < 128) {
57
    uart_puts(intToString(rc5data[j], 1));
58
    j++;
59
  }*/
60
  uart_putc('a');
61
  while(complete == 0) {
62
    asm volatile ("nop");
63
  }
64
  TIMSK &= ~(1<<TOIE0);
65
  uart_putc('b');
66
  int i = 0;
67
  while(i != 28) {
68
    uart_puts(intToString(rc5data[i], 1));
69
    i++;
70
  }
71
  //asm volatile ("nop");
72
  
73
  
74
}

von Alan (Gast)


Lesenswert?

push
Ich bin am verzweifeln... warum geht das nicht?

von Karl H. (kbuchegg)


Lesenswert?

Ich kann dir nicht mehr viel weiterhelfen, weil ich die
Signalform nicht kenne.

Das wirds zwar nicht sein, da du hast mir ein paar if
zuviel, die eigentlich nicht nötig sind.

   if( a == b )
     ...

   if( a != b )
     ...

Das zweite if ist unnötig

  if( a == b )
    ...

  else
    ...

macht dasselobe und ist simpler.

Genauso hier (da ist auch ein kleiner Fehler drin)

   if( a < 81 )
     ...

   if( a > 81 )
     ...

Das > muesste natürlich >= lauten. Aber abgesehen davon,
wenn a nicht kleiner als 81 ist, dann muss a größer/gleich
81 sein. Was solls denn sonst sein?
Also

   if( a < 81 )
     ...

   else
     ...

Ich denke aber nicht, dass das mit deinem eigentlichen Problem
zu tun hat (bitcount exakt 81 könnte aber tatsächlich ein
Problem sein, wenn auch eher unwahrscheinlich)

Bleibt nur noch: Timing noch mal checken. Timereinstellungen.
Läuft der µC auch wirklich mit der Taktfrequenz die du glaubst
und mit der du die Timereinstellungen ausgerechnet hast.

Sonst fällt mir auch nichts ein.

PS: Stimmt da eigentlich, dass eine 1 immer doppelt ins Array
kommt? Schaut irgendwie seltsam aus.

Edit: Ich würde mir höchstens mal die gemessenen bitcount Werte
ausgeben lassen. Vielleicht sieht man da was.

von Karl H. (kbuchegg)


Lesenswert?

Moment.

Die Information steckt doch in der Pulslänge. Oder irre ich mich
da?
Warum speicherst du dann state?
Das ist doch Nonsense. state sagt dir doch nur wie das Signal
zur Zeit aussieht. Klar das das immer abwechselnd 0 oder 1 sein
muss. Was solls denn sonst sein?

Bei der steigenden Flanke setzt du bitcount auf 0, denn da
beginnt der Puls und bei der fallenden Flanke wertest du den
bitcount aus
1
    if( state != oldstate ) {    // eine Flanke
2
3
                                 // welche wars?
4
      if( state )                // es war eine steigende
5
        bitcount = 0;
6
7
      else {                     // es war eine fallende Flanke
8
        if( bitcount < 83 )      // war es ein kurzer 0 Puls ?
9
          rc5data[pos] = 0;
10
        else                     // oder war es ein langer 1 Puls ?
11
          rc5data[pos] = 1;
12
        pos++;
13
      }
14
    }
15
16
    else
17
      bitcount++;

Kann natürlich sein, dass ich völlig falsch liege. Denn wie gesagt:
Ich kenne die Signalcodierung nicht.

von Stefan E. (sternst)


Lesenswert?

Was mir noch auffällt, ist folgendes:
1
  if(pos != 28) {
2
...
3
      if(bitcount > 83)  {
4
        rc5data[pos] = state;
5
        pos++;
6
        rc5data[pos] = state;
7
        pos++;
8
      }
9
...
10
  }
11
  else {
12
    complete = 1;
13
  }

pos = 28 soll wohl die Abbruchbedingung sein. Da pos aber in einem Int 
auch um 2 erhöht werden kann, kann diese Grenze "übersprungen" werden. 
Ich vermute allerdings (genau wie Karl Heinz), dass dieses doppelte 
Abspeichern falsch ist. Es führt ja z.B. auch dazu, dass eine 
unterschiedliche Anzahl an Bits gesampelt wird, je nach dem wie das 
Verhältnis von Nullen zu Einsen ist. Und ich kann mir nicht so recht 
vorstellen, dass das so gewollt ist.

von Alan (Gast)


Lesenswert?

Also erstmal danke für die Mühe...
Den Vorschlag von kbuchegg kann ich nur nicht ganz nachvollziehen.
Hier mal der relevante Code mit Kommentaren
1
  state = !(PINB & (1<<PINB0));
2
    if(state == oldstate) { //keine Flanke
3
      bitcount++;     //bitcount hochzählen
4
    }
5
    if(state != oldstate) { //Flanke
6
      if(bitcount <= 83)  { //kurzer "Puls" vorher
7
        rc5data[pos] = state;  //an der Position den aktuellen Status abspeichern
8
        pos++; //Position inkrementieren
9
      }
10
      else  { //langer Puls
11
        rc5data[pos] = state; //siehe Oben
12
        pos++; //s.o.
13
        rc5data[pos] = state; //s.o.
14
        pos++; //s.o.
15
      }
16
      bitcount = 0; //Bitcount zurücksetzen
17
      oldstate = state; //alter Status = neuer Status
18
    }
19
  }
Entweder habe ich die manchester-Kodierung falsch verstanden oder es hat 
sich ein anderer Fehler eingeschlichen.

von Stefan E. (sternst)


Lesenswert?

Alan wrote:

> Entweder habe ich die manchester-Kodierung falsch verstanden ...

Kommt darauf an, was du eigentlich machen willst. In mir keimt nämlich 
jetzt der Verdacht, dass du das gar nicht dekodieren, sondern eher 
"aufzeichnen" willst. In dem Fall ist aber dein Ansatz, pos als 
Abbruchbedingung heranzuziehen, untauglich.

von Karl H. (kbuchegg)


Lesenswert?

Alan wrote:
> Also erstmal danke für die Mühe...
> Den Vorschlag von kbuchegg kann ich nur nicht ganz nachvollziehen.

Ich wusste bis vor 30 Sekunden nicht, dass du einen Manchester
Code auswerten willst. Ich ging von einem Pulscode aus, der 1/0
über die Pulslänge ermittelt.

Mein Fehler: Ich hätte mich über den RC5 informieren sollen,
bevor ich hier loslege.

von Karl H. (kbuchegg)


Lesenswert?


von Alan (Gast)


Lesenswert?

Fällt mir auch erst jetzt auf, dass das "Auswerten" im Threadtitel ein 
bisschen deplatiert ist ...

Das Auswerten macht dann eine andere Funktion, mir geht es erstmal ums 
Aufzeinchen

Ne fertige Lib nehmen kann ja jeder, mir geht's u.a. um den Lerneffekt 
(weshalb ich BASCOM verabscheue)...

von Stefan E. (sternst)


Lesenswert?

Nach etwas Überlegung muss ich meine obige Aussage revidieren. Dein 
Ansatz sollte prinzipiell funktionieren. Du hast allerdings einen Fall 
nicht abgedeckt. Wenn im letzten Bit der Flankenwechsel zum Ruhepegel 
hin geht, dann hast du nach dem Bit keinen Flankenwechsel mehr. Das 28. 
"Halbbit" ist dann also nicht durch eine Flanke "abgeschlossen".

von Alan (Gast)


Lesenswert?

Vielleicht so lösen: Wenn bitcount größer 240, dann ende?

von Stefan E. (sternst)


Lesenswert?

Ist auch problematisch, oder ist die Pause zwischen zwei Bitfolgen auf 
jeden Fall mindestens so groß?

Ich würde die Tatsache ausnutzen, dass zwischen pos 26 und 27 immer ein 
Flankenwechsel sein muss.
Also etwa so:
1
ISR(TIMER0_OVF_vect) 
2
{
3
  if (pos >= 28)
4
    return;
5
6
  state = !(PINB & (1<<PINB0));
7
  if(state == oldstate)
8
    bitcount++;
9
  else {
10
    ...
11
    (hier Pulslaenge bestimmen und speichern)
12
    ...
13
    if (pos >= 27) {
14
      rc5data[pos] = !state;
15
      complete = 1;
16
    }
17
  }
18
19
  PORTD ^= (1<<PD7);
20
}

von Alan (Gast)


Lesenswert?

3840 uS dürften wohl genug Pause sein...

von neuer (Gast)


Lesenswert?

so sieht es in bascom aus ohne eine lib.
eine routine handgeschnitzt von einem user :

1
'Der Timer wird nicht ausschliesslich für den RC5 benutzt, läuft also immer mit 8kHz durch.
2
'Es wird in Impuls_laenge nur die Anzahl der overflows festgehalten.
3
'Außerdem kann man festlegen, ob mehrfach Empfang ohne loslassen erlaubt ist (wiederholen_erlaubt=1)
4
'oder nicht (wiederholen_erlaubt=0).
5
'Eingehende Impulse werden nach Länge überprüft und dann in die Variable Temp_daten geschoben,
6
'also 14-bit bei einem korrekten Befehl.
7
'Wenn man sich die möglichen Zeiten zwischen zwei steigenden Flanken ansieht,
8
'stellt man fest, dass es drei verschiedenen geben kann:
9
'kurze Impulselänge (1,778ms ~ 14 Überläufe) ->
10
'gleicher Wert empfangen wie beim letzten Impuls, also vorher 0 jetzt 0 oder vorher 1 und jetzt 1
11
'lange Impulselänge (2,677ms ~ 21 Überläufe) ->
12
'vorher war es eine 0, jetzt kommt eine 1 und eine 0 (also 2 bit zusammen)
13
'mittl Impulselänge (3,556ms ~ 28 Überläufe) ->
14
'entweder war es vorher eine 0, dann jetzt eine 1 oder vorher eine 1 dann jetzt eine 1 und eine 0
15
'Wenn dann 14 bit zusammen sind, extrahiere ich daraus die Adresse und den Befehl und überprüfe, ob die Sinn machen.
16
'Dann wird der Befehl ausgegeben, falls er ungleich dem letzten Befehl ist bzw. wiederholen erlaubt ist.
17
18
$regfile = "m32def.dat"
19
$framesize = 32
20
$swstack = 32
21
$hwstack = 64
22
$crystal = 8000000
23
$baud = 19200
24
25
Dim Impuls_laenge As Word , Bit_nummer As Byte , Temp_daten As Word
26
Dim Befehl As Byte , Adresse As Byte , Empfangs_fehler As Byte , Wiederholen_erlaubt As Byte
27
Dim Letzte_adresse As Byte , Letzter_befehl As Byte , Startwert As Byte
28
Dim Interrupt_vektor As Byte
29
30
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.6 , Rs = Portc.7
31
Config Lcd = 20 * 2
32
Config Timer0 = Timer , Prescale = 8
33
34
On Ovf0 Tim0_isr
35
Enable Timer0
36
Startwert = 125                         '8000000/8/(256-125)=8000 Überläufe pro Sekunde,
37
Timer0 = Startwert                      'also alle 0,125ms, Impulslänge bei RC5 1,778ms, also ca. 14
38
39
Config Int0 = Rising                    'externer interrupt, dauernd high, falls Signal dann low
40
                                         'falls dauernd low, dann auf falling ändern und PORTD.2=0 setzen
41
On Int0 Get_rc5_isr
42
Enable Int0
43
44
Ddrd.2 = 0                              'ausgang des RC5-empfängers
45
Portd.2 = 1                             'Pullup ein, auf Pulldown ändern, wenn dauernd low kommt
46
47
Wiederholen_erlaubt = 1                 'auf 1 setzen, wenn wiederholen erlaubt sein soll, sonst 0
48
49
Enable Interrupts
50
51
Do
52
   If Interrupt_vektor.7 = 1 Then
53
      Select Case Impuls_laenge
54
         Case Is > 1500:                '-> startimpuls, nach empgfangsfehler muss immer erst ein solcher kommen.
55
            Bit_nummer = 1
56
            Temp_daten = 1
57
            Empfangs_fehler = 0
58
         Case 26 To 29:                 '-> große Länge: vorher 0, jetzt 1 + 0
59
            If Empfangs_fehler = 0 Then
60
               Shift Temp_daten , Left  'hinzufügen einer 0
61
               Incr Temp_daten          'umwandeln in 1
62
               Shift Temp_daten , Left  'hinzufügen einer 0
63
               Incr Bit_nummer          'bei Kombination '10' fehlt ein Impuls
64
            End If
65
         Case 19 To 22:                 '-> mittlere Länge: vorher 1, jetzt 1 + 0 oder vorher 0 jetzt 1
66
            If Empfangs_fehler = 0 Then
67
               Shift Temp_daten , Left  'hinzufügen einer 0
68
               Incr Temp_daten          'umwandeln in 1
69
               If Temp_daten.1 = 1 Then 'vorher gab es eine 1
70
                  Shift Temp_daten , Left       'hinzufügen einer 0
71
                  Incr Bit_nummer       'bei Kombination '10' fehlt ein Impuls
72
               End If
73
            End If
74
         Case 12 To 15:                 '-> kleine Länge     --> gleicher Wert wie vorher
75
            If Empfangs_fehler = 0 Then
76
               Shift Temp_daten , Left , 1       'hinzufügen einer 0
77
               If Temp_daten.1 = 1 Then 'vorher gab es eine 1
78
                  Incr Temp_daten       'umwandeln in 1
79
               End If
80
            End If
81
         Case Is > 400:                 'aber kleiner 1500, dann war's eine Pause zwischen Befehlen beim Dauerdrücken
82
            If Empfangs_fehler = 1 Or Wiederholen_erlaubt = 1 Then
83
               Bit_nummer = 1
84
               Temp_daten = 1
85
               Empfangs_fehler = 0
86
            End If
87
         Case Else
88
            Empfangs_fehler = 1
89
      End Select
90
      If Bit_nummer = 14 Then
91
         Befehl = Temp_daten And &B00111111
92
         Shift Temp_daten , Right , 6
93
         Adresse = Temp_daten
94
         If Befehl < 64 Then
95
            If Wiederholen_erlaubt = 1 Or Befehl <> Letzter_befehl Or Adresse <> Letzte_adresse Then
96
               Letzter_befehl = Befehl
97
               Letzte_adresse = Adresse
98
               Cls
99
               Lcd "Befehl=" ; Befehl
100
            End If
101
         End If
102
      End If
103
      Impuls_laenge = 0
104
      Interrupt_vektor.7 = 0
105
   End If
106
Loop
107
108
End
109
110
Tim0_isr:
111
   Timer0 = Startwert
112
   Incr Impuls_laenge
113
   If Impuls_laenge > 65000 Then        berlauf von Impuls_laenge verhindern (nach 65535 kommt 0),
114
                                        'damit Start (Impuls_laenge > 500) sicher erkannt wird
115
      Impuls_laenge = 1501
116
   End If
117
Return
118
119
Get_rc5_isr:                            'RC5 Impuls erkannt
120
   Incr Bit_nummer
121
   Interrupt_vektor.7 = 1
122
Return

von Denny (Gast)


Lesenswert?

Vielen Dank für den Code!
So eine Lösung habe ich schon lange gesucht!
Perfekt...

von Di P. (drpepper) Benutzerseite


Lesenswert?


von Denny (Gast)


Lesenswert?

Es geht mir aber um das Bascom.
Ich habe noch eine sehr wichtige Frage:
Oben steht:
1
Startwert = 125                         '8000000/8/(256-125)=8000 Überläufe pro Sekunde,
2
Timer0 = Startwert                      'also alle 0,125ms, Impulslänge bei RC5 1,778ms, also ca. 14

Die Impluslänge ist 1.778ms
14Bits

1.778 / 14 = 0.127ms pro Bit

0.127ms = 0.000127s

1 / 0.000127 = 7874
Wieso steht oben 8000 Überläufe pro Sekunde??
Wie kann ich das auf meinen 14745600MHz Quarz umrechnen?

Danke

von Denny (Gast)


Lesenswert?

Wenn ich das umrechne komme ich an 230
Geht aber nicht.

von Denny (Gast)


Lesenswert?

Mit dem Wert 26 geht es aber ich hab das Gefühl, dass er nicht jeden 
Tastendruck mitbekommt.

von Denny (Gast)


Lesenswert?

Hallo könnt ihr mir biiiitte helfen??
Ich bin am Verzweifeln, weil ich nicht den richtigen Wert herausbekomme!

von Di P. (drpepper) Benutzerseite


Lesenswert?

schau dir halt mal die lösungen an, die ich dir geschrieben habe.

vielleicht lässt sich ja etwas auf dieses seltsame "Bascom" übertragen.

von Denny (Gast)


Lesenswert?

Egal wie ich es rechne, ich komme immer an 231 oder 26.
Leider funktioniert es aber nicht!

Wann soll der Timer einen Überlauf-Interrupt machen?
Nach 1.778ms oder nach 0.125ms??

Ich denke nach 1.778ms...

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.