Simple single-color 8x8x8 LED Cube with AVRs
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /*
  2. * eq.c
  3. *
  4. * Copyright 2011 Thomas Buck <xythobuz@me.com>
  5. * Copyright 2011 Max Nuding <max.nuding@gmail.com>
  6. * Copyright 2011 Felix Bäder <baeder.felix@gmail.com>
  7. *
  8. * This file is part of LED-Cube.
  9. *
  10. * LED-Cube is free software: you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation, either version 3 of the License, or
  13. * (at your option) any later version.
  14. *
  15. * LED-Cube is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public License
  21. * along with LED-Cube. If not, see <http://www.gnu.org/licenses/>.
  22. */
  23. #include <avr/io.h>
  24. #include <stdint.h>
  25. #include <stdlib.h>
  26. #include <util/delay.h>
  27. #include "eq.h"
  28. #include "adc.h"
  29. #define RESETDELAY 1 /* in µs */
  30. #define RESETSTROBEDELAY 72 /* in µs */
  31. #define STROBEDELAY 18 /* in µs */
  32. #define READDELAY 36 /* in µs */
  33. #if ((STROBEDELAY * 2) + READDELAY) < 72
  34. #error Strobe to Strobe Delay too short
  35. #endif
  36. void equalizerInit(void) {
  37. DDRC |= 12; // Strobe: PC2
  38. // Reset: PC3
  39. // Out: ADC0
  40. PORTC |= (1 << PC3); // Reset enabled
  41. _delay_us(RESETDELAY);
  42. }
  43. uint8_t *equalizerGet(void) {
  44. uint8_t *result = (uint8_t *)malloc(7); // Has to work... If not, were screwed anyway :)
  45. uint8_t i, offset = getOffset();
  46. PORTC &= ~(1 << PC3); // Disable reset
  47. _delay_us(RESETSTROBEDELAY); // Wait trs
  48. for (i = 0; i < 7; i++) {
  49. PORTC |= (1 << PC2); // Strobe '1'
  50. _delay_us(STROBEDELAY); // create minimal pulse width
  51. PORTC &= ~(1 << PC2);
  52. _delay_us(READDELAY); // Wait for result to appear
  53. adcStartConversion(0x00);
  54. result[i] = offset + adcGetByte();
  55. _delay_us(STROBEDELAY);
  56. }
  57. PORTC |= (1 << PC3); // Enable reset
  58. return result;
  59. }
  60. uint8_t getOffset(void) {
  61. adcStartConversion(0x01);
  62. return (adcGetByte() / 2);
  63. }