Hallo! Ich weiß, dass es einige Beiträge zur Auswertung von Drehimpulsgebern hier gibt, die bei mir allerdings nicht funktionieren. Der Fehler liegt wahrscheinlich ca. 30cm vor dem Bildschirm, wie ihr euch sicherlich vorstellen könnt. Ich kenn mich leider nicht allzu gut damit aus, und hoffe nun auf eure Hilfe. Ich verwende den Drehimpulsgeber: ALPS STEC12E von Reichelt und einen ATmega8. Ich habe bereits herausgefunden, dass der Drehgeber 2 Signale ausgibt, besser 2 Flanken ausgibt (A und B). Wenn man nun dreht, und die die Flanke A vor der Flanke B kommt, ist es eine linksdrehung, umgekehrt eine rechtsdrehung. Nun will ich durch eine rechtsdrehung einen bestimmten Wert erhöhen, und durch eine Linksdrehung den Wert natürlich wieder erniedrigen. A hängt am PORTB4 und B hängt am PORTB4 vom ATmega8. Gesamtziel wäre es dann, den Phasenwinkel eines PWM-Signals mittels diesem Drehimpulsgeber zu variieren. Nun such ich einen Ansatz, wie ich diesen Drehimpulsgeber mit 24 Impulsen einlesen bzw. auswerten kann. Danke im Voraus gruß, Flo
Da war ich schon ;) Nur mein Timer0 lässt sich nicht initialisieren...
> Nur mein Timer0 lässt sich nicht initialisieren...
1. dann sag das doch gleich und mach einen beitrag mit entsprechendem
betreff auf...
2. ich glaube eher, dass er sich sehr wohl initialisieren lässt und
vielmehr du etwas falsch machst.
Vielleicht gibts ja noch einen anderen Ansatz, deshalb mein neuer Beitrag mit den ganzen Infos. Michael H. schrieb: > 2. ich glaube eher, dass er sich sehr wohl initialisieren lässt und > vielmehr du etwas falsch machst. Das ist mir auch klar, nur will ich rausfinden was es ist. Das ich offensichtlich irgendwas falsch mache weiß ich ja.
Es ist ja lobenswert das Du den Fehler im Programm erstmal bei Dir suchst und Du bist wahrscheinlich sehr genervt und gestresst und hast deswegen nicht gemerkt, dass Du Dir selbst widersprichst: Entweder Du: 1. Suchst das Problem bei der Timerinitialisierung oder 2. Du suchst einen ganz anderen Ansatz ohne Timer, den Du ja nicht zum laufen kriegst. Aber gleichzeitig: >Vielleicht gibts ja noch einen anderen Ansatz UND >nur will ich rausfinden was es ist. geht nicht und dann hätte die Information gefehlt, das kein Timer verwendet werden darf. Ich würde Dir vorschlagen, mal ganz tief durchzuatmen, eine Nacht darüber zu schlafen und Dir morgen nochmal das Timerproblem anzugucken und uns dann bezüglich dieses Problems zu fragen. Einen anderen Ansatz zu wählen wenn garnicht der Ansatz falsch ist sondern die Realisierung Schwierigkeiten macht bringt Dich nicht weiter.
Guru schrieb: > Es ist ja lobenswert das Du den Fehler im Programm erstmal bei Dir > suchst und Du bist wahrscheinlich sehr genervt und gestresst ich kann dir gar nicht sagen wie recht du hast! Ich werds wohl besser für heute gut sein lassen anstatt mich verzweifelt hier an dieses forum zu klemmen.
Abend : ) ich habe den gleichen Encoder wie du und hatte auch das Problem, dass er nicht funktioniert hat, mit den Programmen die hier zu finden sind, ich poste dir mal den Beitrag und das Program welches definitiv läuft : ) Beitrag "Drehcoder ALPS Stec12E08 will nicht"
1 | #define XTAL 8e6 // 8MHz
|
2 | |
3 | #define PHASE_B (PIND & 1<<PD6) // an Pinbelegung anpassen
|
4 | #define PHASE_A (PIND & 1<<PD4) // an Pinbelegung anpassen
|
5 | |
6 | volatile int8_t enc_delta; // Drehgeberbewegung zwischen |
7 | // zwei Auslesungen im
|
8 | |
9 | int8_t table[16] PROGMEM = {0,0,-1,0,0,0,0,1,1,0,0,0,0,-1,0,0}; //halb |
10 | |
11 | |
12 | ISR( TIMER0_COMP_vect ) // 1ms fuer manuelle Eingabe |
13 | {
|
14 | static int8_t last=0; // alten Wert speichern |
15 | |
16 | last = (last << 2) & 0x0F; |
17 | if (PHASE_A) last |=2; |
18 | if (PHASE_B) last |=1; |
19 | enc_delta += pgm_read_byte(&table[last]); |
20 | }
|
21 | |
22 | void encode_init( void ) // nur Timer 0 initialisieren |
23 | {
|
24 | TCCR0 = (1<<WGM01) | (1<<CS01) | (1<<CS00); // CTC, XTAL / 64 |
25 | OCR0 = (uint8_t)(XTAL / 64.0 * 1e-3 - 0.5); // 1ms |
26 | TIMSK |= 1<<OCIE0; |
27 | }
|
28 | int8_t encode_read( void ) // read two step encoders |
29 | {
|
30 | int8_t val; |
31 | |
32 | cli(); |
33 | val = enc_delta; |
34 | enc_delta = val & 1; |
35 | sei(); |
36 | return val >> 1; |
37 | }
|
38 | |
39 | int main (void) |
40 | {
|
41 | encode_read(); |
42 | while (1) |
43 | {
|
44 | val += encode_read(); |
45 | }
|
46 | }
|
wenn du noch fragen hast kann ich dir gern helfen...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.