Tady se snažím rozchodit 74HC595 abych si vypsal jakékoli číslo. Použil jsem program, který se mi podařilo rozjet, ale pouze v simulátoru Proteus. A ono ejhle, teď v reálu nefunguje a já ne a ne přijít na chybku. Pomůže někdo?
Takt krystalu 16MHz, prcák: Atmega16
kód zde.
Kód: Vybrať všetko
#include <avr/io.h>
#include <util/delay.h>
#include "avr/pgmspace.h"
#include "stdlib.h"
#include "avr/interrupt.h"
#define DS_PORT PORTC
#define DS_PIN 0
#define ST_CP_PORT PORTC
#define ST_CP_PIN 1
#define SH_CP_PORT PORTC
#define SH_CP_PIN 6
#define DS_low() DS_PORT&=~_BV(DS_PIN)
#define DS_high() DS_PORT|=_BV(DS_PIN)
#define ST_CP_low() ST_CP_PORT&=~_BV(ST_CP_PIN)
#define ST_CP_high() ST_CP_PORT|=_BV(ST_CP_PIN)
#define SH_CP_low() SH_CP_PORT&=~_BV(SH_CP_PIN)
#define SH_CP_high() SH_CP_PORT|=_BV(SH_CP_PIN)
//Define functions
//======================
void ioinit(void);
void output_led_state(unsigned char __led_state);
//======================
const char textdata[] PROGMEM=
{
0b11000000,//0
0b11111001,//1
0b10100100,//2
0b10110000,//3
0b10011001,//4
0b10010010,//5
0b10000010,//6
0b11111000,//7
0b10000000,//8
0b10010000,//9
0b10011100,//°
0b11000110,//C
};
//*******************************************************************************
//*********************************Proměnné**************************************
//*******************************************************************************
unsigned char jed_hodin,des_hodin,jed_minut,des_minut,minuty,hodiny,sekundy; //jednotky hodin, desítky hodin, jednotky minut, desítky minut
//minuty, hodiny, druhý
//*******************************************************************************
//*******************************Funknce atd..***********************************
//*******************************************************************************
void ioinit (void) //inicializace
{
DDRC = 0b01000011; //1 = output, 0 = input
PORTC = 0b00000000; //pullup off
minuty=0;
hodiny=0;
sekundy=0;
}
void clock_74595() //hodinový pulz 74HC595
{
SH_CP_high();
SH_CP_low();
}
void kirimbyte74595(unsigned char data_led) //zápis BYTE
{
if(bit_is_set(data_led,7)) DS_high();else DS_low();
clock_74595();
if(bit_is_set(data_led,6)) DS_high();else DS_low();
clock_74595();
if(bit_is_set(data_led,5)) DS_high();else DS_low();
clock_74595();
if(bit_is_set(data_led,4)) DS_high();else DS_low();
clock_74595();
if(bit_is_set(data_led,3)) DS_high();else DS_low();
clock_74595();
if(bit_is_set(data_led,2)) DS_high();else DS_low();
clock_74595();
if(bit_is_set(data_led,1)) DS_high();else DS_low();
clock_74595();
if(bit_is_set(data_led,0)) DS_high();else DS_low();
clock_74595();
}
void zapis_na7segment() //zobrazovač na 4x7-segmentovce
{
des_hodin=pgm_read_byte(&textdata[des_hodin]);
kirimbyte74595(des_hodin);
jed_hodin=pgm_read_byte(&textdata[jed_hodin]);
kirimbyte74595(jed_hodin);
des_minut=pgm_read_byte(&textdata[des_minut]);
kirimbyte74595(des_minut);
jed_minut=pgm_read_byte(&textdata[jed_minut]);
kirimbyte74595(jed_minut);
ST_CP_high();
_delay_ms(30);
ST_CP_low();
}
void prevod() //prevod cisla
{
des_hodin=hodiny/10; //destíky hodiny
jed_hodin=hodiny%10; //jednotky hodiny
des_minut=minuty/10; //desítky minut
jed_minut=minuty%10; //jednotky minut
}
//*******************************************************************************
//*******************************Hlavní smyčka***********************************
//*******************************************************************************
int main (void)
{
ioinit(); //inicializace
while(1) //nekonecnik
{
prevod(); //fce prevod prevede cislo na jednotky a desitky
zapis_na7segment();
minuty=5;
hodiny=5;
sekundy=5;
}
}