Simple single-color 8x8x8 LED Cube with AVRs
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

eq.c 1.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. adcStartConversion(0x00);
  53. _delay_us(READDELAY); // Wait for result to appear
  54. result[i] = offset + adcGetByte();
  55. _delay_us(STROBEDELAY);
  56. }
  57. return result;
  58. }
  59. uint8_t getOffset(void) {
  60. adcStartConversion(0x01);
  61. return (adcGetByte() / 2);
  62. }