tiny13+74595+7414=вольтметр

Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Ответить
Родился
Сообщения: 17
Зарегистрирован: Сб мар 05, 2016 22:48:08
Откуда: Донецк

Сообщение madalexfiesta »

Скетч для тиньки:
Спойлер

Код: Выделить всё

#include <avr/io.h>
#include <util/delay.h> // нужна для функции _delay_ms();
int last=0;
uint8_t s1=0;
uint8_t s2=0;
uint8_t s3=0;
byte b1=0x00;
byte b2=0x00;
byte b3=0x00;
char charMap[21] = {
  // биты     |  6 5 4 3 2 1 0  |
  // сегменты |  a b c d e f g  |
  //  Биты        raw
  0b1111110,//0 0x00
  0b0110000,//1 0x01
  0b1101101,//2 0x02
  0b1111001,//3 0x03
  0b0110011,//4 0x04
  0b1011011,//5 0x05
  0b1011111,//6 0x06
  0b1110000,//7 0x07
  0b1111111,//8 0x08
  0b1111011,//9 0x09
  0b1110111,//a 0x0A
  0b0011111,//b 0x0B
  0b1001110,//c 0x0C
  0b0111101,//d 0x0D
  0b1101111,//e 0x0E
  0b1000111,//f 0x0F
  0b1100111,//P 0x10
  0b0001111,//t 0x11
  0b0011100,//u 0x12
  0b0000000,//  0x13 пустой символ (пробел)
  0b0000001 //- 0x14 знак минус
};
unsigned int voltage=0;
unsigned int analogRead_C(byte channel){ 
  ADMUX = channel; // ADC pin
  ADCSRA |= 1<<ADEN; //Включаем аналогово-цифровой конвертер
  ADCSRA |= 1<<ADSC;//конвертируем данные в 10-бит
  while(!(ADCSRA & (1<<ADIF)));
  ADCSRA |= 1<<ADIF;
  byte low  = ADCL;
  byte high = ADCH;
  ADCSRA &= ~(1 << ADEN);  // отключаем АЦП, для уменьшения энергопотребления
  return (high << 8) | low;
}
void blinkER(byte pin){
  PORTB |= (1<<pin);//HIGH PBpin
  _delay_ms(5);
  PORTB &= ~(1<<pin);
}
void set74595(byte b){
   //защелку снимаем
  PORTB &= ~(1<<0);
for (uint8_t i = 0; i < 8; i++)  {
  byte c=(b & !!(1 << (7 - i)));
  if(c==0){
//иначе в LOW
     PORTB &=~(1<<3);
   
  }else{
     //если bit1 dataPin в HIGH
     PORTB |=(1<<3);
  }
  //тактирование
  PORTB |=(1<<4);
  PORTB &=~(1<<4);
  } 
  //защелку выставляем
  PORTB |= (1<<0);
}
void switchER(byte b1,byte b2,byte b3)
{
  set74595(b1);
PORTB &= ~(1<<1); // Оба в LOW - сигмент1
PORTB &= ~(1<<2);
_delay_ms(20);
set74595(b2);
PORTB |= (1<<1);//Сегмент2 
PORTB &= ~(1<<2);
_delay_ms(20);
set74595(b3);
PORTB &= ~(1<<1);//Сегмент3
PORTB |= (1<<2);
_delay_ms(20);
}
int main( void )
{
  //Порт 1,2на катоды через инвертер, 3 дата, 4 такт, 5 датчик, 0-защелка
DDRB=0b011111;
PORTB=0b000001;//все в LOW

  while(1){ // вечный цыкл, тоже самое что и void loop(){
 voltage=analogRead_C(0);
long v=((long)voltage*1000/2231);
 if(last!=voltage){
 s3=v/100;
 s2=(v%100)/10;
 s3=((v%100)%10);
 b3=charMap[s3];
 b2=charMap[s2];
 b1=charMap[s1];
 }
 switchER(b1,b2,b3);
 last=voltage;
  } // конец вечного цикла
  return 0;
}
Прожект в протеусе:
СпойлерИзображение
Архив с прожектом прилагается.
В общем не показывает нужные циферки.
Думается мне, что проблема в PB5. Поменять аналоговый вход, но как освободить другую ногу? Либо как с помощью ардуинки RSTDISBL=0 зашить?
Вложения
74595_attiny13.7z
(90.29 КБ) 103 скачивания
74595_attiny13.png
(71.61 КБ) 605 скачиваний
Реклама
Родился
Сообщения: 17
Зарегистрирован: Сб мар 05, 2016 22:48:08
Откуда: Донецк

Сообщение madalexfiesta »

Кому интересно, разобрался сам)
Кое чего подредактировал в скетче, перекинул "провода" между 74595 и 7seg. Всё работает как надо(ниже 16v погрешность -0,1V, думаю не критично, хотя все зависит от реального номинала резисторов)
Готовый прожект во вложении.
Из основных запчастей нам понадобятся:
*attiny13 с отключенным RESET, для юзанья 6 ноги.
*74LS14 или подобный инвертор
*7seg display 3-циферный с общим катодом(11 ног)
*регистр 74HC595
*1n4007 диоды 4шт
*делитель на резисторах 6,2к и 56к
СпойлерИзображение
В 13той тиньке очень мало памяти, поэтому пришлось поизвращаться с кодом. Придумывать режим сбережения энергии и т.п. не стал, да думаю в таком устройстве это никому не нужно.
Целью было построить цифровой вольтметр на базе 13тиньки с минимальным количеством дополнительных микросхем. Когда будет физически готов прожект - поделюсь впечатлениями и картинками.
Вложения
74595_attiny13.7z
(55.54 КБ) 122 скачивания
semple.png
(56.87 КБ) 551 скачивание
Реклама
Ответить

Вернуться в «Теория»