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

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. void eqLed(uint8_t *d) {
  44. uint8_t pins[7] = { PD2, PD3, PD4, PD5, PD6, PD7, PB0 };
  45. uint8_t i;
  46. for (i = 0; i < 7; i++) {
  47. if (d[i] >= 127) {
  48. if (i < 6)
  49. PORTD |= (1 << pins[i]);
  50. else
  51. PORTB |= (1 << pins[i]);
  52. } else {
  53. if (i < 6)
  54. PORTD &= ~(1 << pins[i]);
  55. else
  56. PORTB &= ~(1 << pins[i]);
  57. }
  58. }
  59. }
  60. uint8_t *equalizerGet(void) {
  61. uint8_t *result = (uint8_t *)malloc(7); // Has to work... If not, were screwed anyway :)
  62. uint8_t i, offset = getOffset();
  63. PORTC &= ~(1 << PC3); // Disable reset
  64. _delay_us(RESETSTROBEDELAY); // Wait trs
  65. for (i = 0; i < 7; i++) {
  66. PORTC |= (1 << PC2); // Strobe '1'
  67. _delay_us(STROBEDELAY); // create minimal pulse width
  68. PORTC &= ~(1 << PC2);
  69. adcStartConversion(0x00);
  70. _delay_us(READDELAY); // Wait for result to appear
  71. result[i] = offset + adcGetByte(); // This line hangs
  72. _delay_us(STROBEDELAY);
  73. }
  74. return result;
  75. }
  76. uint8_t getOffset(void) {
  77. adcStartConversion(0x01);
  78. return (adcGetByte() / 2);
  79. }