From 00d6ca44c5d8ac9a43223e6843fbc8e54a61b923 Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Sun, 7 Oct 2007 22:33:46 +0200 Subject: Added counter decoder AVR implementation. --- .../asserv/src/avrcounter/avrcounter-port-one.c | 60 ++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 digital/asserv/src/avrcounter/avrcounter-port-one.c (limited to 'digital/asserv/src/avrcounter/avrcounter-port-one.c') diff --git a/digital/asserv/src/avrcounter/avrcounter-port-one.c b/digital/asserv/src/avrcounter/avrcounter-port-one.c new file mode 100644 index 00000000..9341cb0c --- /dev/null +++ b/digital/asserv/src/avrcounter/avrcounter-port-one.c @@ -0,0 +1,60 @@ +/* avrcounter-port-one.c - Single encoder, port output. */ +/* avrcounter - Incremental encoder counter. {{{ + * + * Copyright (C) 2007 Nicolas Schodet + * + * Robot APB Team 2008. + * Web: http://apbteam.org/ + * Email: team AT apbteam DOT org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * }}} */ +#include + +int +main (void) +{ + uint8_t count = 0; + uint8_t state = 0; + /* Encoder signals: + * ____----____----____---- + * __----____----____----__ */ + static const int8_t inc[] = { + 0, /* 00 -> 00 */ + +1, /* 00 -> 01 */ + -1, /* 00 -> 10 */ + 0, /* 00 -> 11, missed! */ + -1, /* 01 -> 00 */ + 0, /* 01 -> 01 */ + 0, /* 01 -> 10, missed! */ + +1, /* 01 -> 11 */ + +1, /* 10 -> 00 */ + 0, /* 10 -> 01, missed! */ + 0, /* 10 -> 10 */ + -1, /* 10 -> 11 */ + 0, /* 11 -> 00, missed! */ + -1, /* 11 -> 01 */ + +1, /* 11 -> 10 */ + 0, /* 11 -> 11 */ + }; + DDRD = 0xff; + while (1) + { + state = (state << 2) | (PINC & 0x03); + count += inc[state]; + PORTD = count; + } +} -- cgit v1.2.3