Скетч для тиньки:
Прожект в протеусе:
Архив с прожектом прилагается.
В общем не показывает нужные циферки.
Думается мне, что проблема в PB5. Поменять аналоговый вход, но как освободить другую ногу? Либо как с помощью ардуинки RSTDISBL=0 зашить?
Спойлер
Код: Выделить всё
#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 скачиваний
