mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Drehencoder mit Atmega644


Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich wollte einen Drehencoder (ALPS E12D mit Taster) mithilfe der 
Routinen von PeDa ansteuern.

Leider komme ich nicht weiter. Da ich einen Atmega644 verwende, habe ich 
die Timer-Routine angeändert:
void encode_init( void )
{
  int8_t new;
 
  new = 0;
  if( PHASE_A )
    new = 3;
  if( PHASE_B )
    new ^= 1;          // convert gray to binary
  last = new;          // power on state
  enc_delta = 0;
  TCCR0B = 1<<WGM01;
  ^1<<CS01^1<<CS00;    // CTC, XTAL / 64
  OCR0B = (uint8_t)(F_CPU / 64.0 * 1e-3 - 0.5);  // 1ms  // F_CPU = 22.1Mhz
  TIMSK0 |= 1<<OCIE0B;
}
 
 
ISR( TIMER0_COMPA_vect )        // 1ms for manual movement
{
  int8_t new, diff;
 
  new = 0;
  if( PHASE_A )
    new = 3;
  if( PHASE_B )
    new ^= 1;          // convert gray to binary
  diff = last - new;        // difference last - new
  if( diff & 1 ){        // bit 0 = value (1)
    last = new;          // store new as next last
    enc_delta += (diff & 2) - 1;    // bit 1 = direction (+/-)
  }
}

Aber ich bekomme keine Ausgaben. Ich vermute mal, dass mein Timer-Gedöns 
nicht stimmt.

Den Encoder habe ich mit PinA an PHASE_A(=PC3) und PinB an PHASE_B(=PC4) 
angeschlossen. PinC=GND und PinE=VCC. PinD=PC2 (Taster). Stimmt die 
Beschaltung?

Autor: Soeren A. (abraxa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  TCCR0B = 1<<WGM01;
  ^1<<CS01^1<<CS00;    // CTC, XTAL / 64

Falls das deine Aenderungen der Timer-Routine (?) sind, dann wuerde ich 
in der Tat sagen, dass es daran liegt.

Laut http://www.atmel.com/dyn/resources/prod_documents/... 
(Seite 100) ist bei CS02=CS01=CS00=0 keine clock source gewaehlt, der 
Timer somit inaktiv. Das ist bei dir der Fall, da du keines der 
entsprechenden bits in TCCR0B setzt.

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier ein neuer Versuch. Timer0 wird benutzt mit Prescaler 1024. Sollte 
doch für das Compare-register bei 1ms etwa 21,59 ergeben.
*********
encode_init();

sei();
for(;;){
    val += encode_read1();      // read a single step encoder
    LED_TESTPORT = (1 << val);

  sprintf(buffer,"Ausgabe: %li\n", val);
  uart_puts(buffer);

  _delay_ms(100);
  LED_TESTPORT &= ~(1<<LED_ERRPIN); //löschen
  }
**************
void encode_init( void )
{
  int8_t new;
 
  new = 0;
  if( PHASE_A )
    new = 3;
  if( PHASE_B )
    new ^= 1;          // convert gray to binary
  last = new;          // power on state
  enc_delta = 0;

  // Timer0 initialisieren
  
  //WGM01=1: CTC Mode
  TCCR0A = (0<<COM1A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (0<<WGM00);
  //CS=101 = prescaler 1024
  TCCR0B = (0<<FOC0A) | (0<<FOC0B) | (1<<WGM02) | (1<<CS12) | (0<<CS11) | (1<<CS10); 
  // Compare register
  OCR0A = F_CPU/1024/1000;         //je 1ms (sollte bei 22.11Mhz etwa 21.59 ergeben
  // Intterupt maskieren auf OCR0A
  TIMSK0 |= (1<<OCIE0A);
}
 
 
ISR( TIMER0_COMPA_vect )        // 1ms for manual movement
{
  int8_t new, diff;
 
  new = 0;
  if( PHASE_A )
    new = 3;
  if( PHASE_B )
    new ^= 1;          // convert gray to binary
  diff = last - new;        // difference last - new
  if( diff & 1 ){        // bit 0 = value (1)
    last = new;          // store new as next last
    enc_delta += (diff & 2) - 1;    // bit 1 = direction (+/-)
  }
}

In der Ausgabe (RS232) sehe ich manchmal eine -1 und manchmal eine 0 
durchlaufen. Es sieht so aus, als ob eine Richtung angezeigt wird.
Ist der Anschluss des Drehencoders korrekt?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ist der Anschluss des Drehencoders korrekt?
Hast du Pullup-Widerstände eingebaut?

> ALPS E12D
Kannst du ein Datenblatt posten?
ALPS kennt dieses Bauteil nicht :-/
"e12d" Search result 0 cases

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.