Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

C sorularım

Başlatan xoom, 08 Ekim 2024, 19:42:35

mehmet

#15
1ms yeterli olmaz. 20us ila başlayın.

Deneme amaçlı; 14(16) byte bir tablo oluşturun. 7 segmentlerde olduğu gibi. Bu nasıl duracak bakın.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

RaMu

HC4094write() fonksiyonunda 4094 ün latch özelliğini kullanmanız lazım.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

xoom

#17
Alıntı yapılan: RaMu - 22 Ekim 2024, 09:07:11HC4094write() fonksiyonunda 4094 ün latch özelliğini kullanmanız lazım.
void HC4094write()
{
    for(int i=0; i<16; i++)
    {
        if(currentVal & (1<<i))
        {
            HAL_GPIO_WritePin(SER_PORT, SER_PIN, GPIO_PIN_SET);
        }
        else
        {
            HAL_GPIO_WritePin(SER_PORT, SER_PIN, GPIO_PIN_RESET);
        }
        HAL_GPIO_WritePin(SRCLK_PORT, SRCLK_PIN, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(SRCLK_PORT, SRCLK_PIN, GPIO_PIN_SET);
    }
    HAL_GPIO_WritePin(RCLK_PORT, RCLK_PIN, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(RCLK_PORT, RCLK_PIN, GPIO_PIN_SET);
}
RCLK pini ile LATCH özelliğinden bahsetmiyor musunuz?

xoom

Alıntı yapılan: mehmet - 21 Ekim 2024, 18:33:541ms yeterli olmaz. 20us ila başlayın.

Deneme amaçlı; 14(16) byte bir tablo oluşturun. 7 segmentlerde olduğu gibi. Bu nasıl duracak bakın.
for(int i=0;i<14;i++)
        {
            currentVal=Status[i];
            HC4094write();
            HAL_Delay(1);
            currentVal=0;
            HC4094write();
        }

bu tarama blogunu timer içinde kullanınca 1ms geçikme sanırım olmamalı ama nasıl?

mehmet

12F675 ile simülasyonda kısmen çalışıyor, ilk biti yutuyor. Elimde 4094 olmadığı için deneyemiyorum. Bir ara 595 ile deneyeceğim.

/*
 * File:   main.c
 * Author: mehmet
 *
 * Created on 22 Ekim 2024 Salı, 13:20
 * 
 */

// PIC12F675 Configuration Bit Settings
// 'C' source line config statements
// CONFIG
#pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-Up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF      // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
#pragma config CP = ON          // Code Protection bit (Program Memory code protection is enabled)
#pragma config CPD = ON         // Data Code Protection bit (Data memory code protection is enabled)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>
#include <stdint.h>

#define _XTAL_FREQ              4000000

#define _BV(bt)                 (1u << (bt))
#define sbi(port, bt)           (port) |= _BV(bt)    /* Set bit number n in byte b   */
#define cbi(port, bt)           (port) &= ~_BV(bt)   /* Clear bit number n in byte b */

#define rbi(port, bt)           (port) & _BV(bt)     /* Read bit number n in byte b  */
#define fbi(port, bt)           (port) ^= _BV(bt)    /* Flip bit number n in byte b  */
#define bit_is_set(port, bt)    (port) & _BV(bt)     /* Test if bit number n in byte b is set   */
#define bit_is_clear(port, bt)  (!port) & _BV(bt)   /* Test if bit number n in byte b is clear */

#define CLOCK                   GPIObits.GP1
#define LATCH                   GPIObits.GP2
#define DATA                    GPIObits.GP0

#define CLOCK_DIR               TRISIObits.TRISIO1
#define LATCH_DIR               TRISIObits.TRISIO2
#define DATA_DIR                TRISIObits.TRISIO0

uint16_t sayac = 0;

const uint8_t tablo[(5 * 3 * 2) + 2] = {
    //76543210    76543210
    0b11111111, 0b11111111, //boş
    0b11111110, 0b00000001, // LED1
    0b11111101, 0b00000001, // LED2
    0b11111011, 0b00000001, // LED3

    0b11111110, 0b00000010, // LED4
    0b11111101, 0b00000010, // LED5
    0b11111011, 0b00000010, // LED6

    0b11111110, 0b00000100, // LED7
    0b11111101, 0b00000100, // LED8
    0b11111011, 0b00000100, // LED9

    0b11111110, 0b00001000, // LED10
    0b11111101, 0b00001000, // LED11
    0b11111011, 0b00001000, // LED12

    0b11111110, 0b00010000, // LED13
    0b11111101, 0b00010000, // LED14
    0b11111011, 0b00010000 // LED15
};

/*
 * 
 */
void spi_wr8(uint8_t val) // write a byte to software SPI
{
    for(uint8_t i = 8; i; i--)
    {
        CLOCK = 0;
        DATA = 0;
        if(val & 0x80) // MSB first
            DATA = 1;
        val <<= 1;
        CLOCK = 1;
    }
}

/*
 * Test için yazıldı.
 */
void hc4094Yaz(uint8_t sayi)
{
    uint8_t k;
    k = sayi;

    LATCH = 0b0;
    spi_wr8(tablo[(k * 2u)]);
    spi_wr8(tablo[(k * 2u) + 1u]);
    LATCH = 0b1;
}

/*
 * http://eng-serve.com/pic/pic_timer.html
 */
void kesmeHazirla(void)
{
    //    //Timer0 Registers Prescaler= 1 - TMR0 Preset = 156 - Freq = 10000.00 Hz - Period = 0.000100 seconds
    //    OPTION_REGbits.T0CS = 0; // bit 5  TMR0 Clock Source Select bit...0 = Internal Clock (CLKO) 1 = Transition on T0CKI pin
    //    OPTION_REGbits.T0SE = 0; // bit 4 TMR0 Source Edge Select bit 0 = low/high 1 = high/low
    //    OPTION_REGbits.PSA = 1; // bit 3  Prescaler Assignment bit...0 = Prescaler is assigned to the WDT
    //    OPTION_REGbits.PS2 = 0; // bits 2-0  PS2:PS0: Prescaler Rate Select bits
    //    OPTION_REGbits.PS1 = 0;
    //    OPTION_REGbits.PS0 = 0;
    //    TMR0 = 56; // preset for timer register (56->5KHz,156->10KHz, 206->20KHz)

    //Timer0 Registers Prescaler= 1 - TMR0 Preset = 156 - Freq = 10000.00 Hz - Period = 0.000100 seconds
    OPTION_REGbits.T0CS = 0; // bit 5  TMR0 Clock Source Select bit...0 = Internal Clock (CLKO) 1 = Transition on T0CKI pin
    OPTION_REGbits.T0SE = 0; // bit 4 TMR0 Source Edge Select bit 0 = low/high 1 = high/low
    OPTION_REGbits.PSA = 0; // bit 3  Prescaler Assignment bit...0 = Prescaler is assigned to the WDT
    OPTION_REGbits.PS2 = 0; // bits 2-0  PS2:PS0: Prescaler Rate Select bits
    OPTION_REGbits.PS1 = 0;
    OPTION_REGbits.PS0 = 1;
    TMR0 = 6; // preset for timer register (6->1KHz)

    // Interrupt Registers
    INTCON = 0; // clear the interrpt control register
    INTCONbits.TMR0IE = 1; // bit5 TMR0 Overflow Interrupt Enable bit...1 = Enables the TMR0 interrupt
    INTCONbits.TMR0IF = 0; // bit2 clear timer 0 interrupt flag
    INTCONbits.GIE = 1; // bit7 global interrupt enable
}

/*
 * 
 */
void mcuInit(void)
{
    OPTION_REG = 0b00000000;
    CMCON = 0b00000111;
    VRCON = 0b00000000;
    WPU = 0b00000111; 
    IOCB = 0;

    GPIO = 0x00;

    DATA_DIR = 0b0;
    CLOCK_DIR = 0b0;
    LATCH_DIR = 0b0;
}

/*
 * 
 */
void main(void)
{
    mcuInit();
    kesmeHazirla();

    sayac = 63;
    
    while(1)
    {            
        
    }
}

/*
 * 
 */
void interrupt ISR(void)
{
    static uint8_t h = 0;
    uint8_t k = 0;
    
    if(INTCONbits.TMR0IF == 1) 
    {
        k = 0;
        if(bit_is_set(sayac, h))
        {
            k = h;
        }

        LATCH = 0b0;        
        spi_wr8(tablo[(k * 2u)]);        
        spi_wr8(tablo[(k * 2u) + 1u]);        
        LATCH = 0b1;       

        if(h++ > 15) h = 0;

        INTCONbits.TMR0IF = 0;
        INTCONbits.TMR0IE = 1;
        TMR0 = 6;
    }
}
////////////////////////////////////////////////////////////////////////////////
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

RaMu

Alıntı yapılan: xoom - 22 Ekim 2024, 10:11:07...
RCLK pini ile LATCH özelliğinden bahsetmiyor musunuz?

Yanlış söylemişim, output enable özelliğini kullanmak lazım,
pinlere yeni data yazılmadan önce output disable yapılacak,
yeni data pinlere yüklenip latch edildikten sonra
output enable edilecek,
standard sürme yöntemidir, detaylı anlatımları nedenleriyle nette kolaylıkla bulunabilir,
OE kullanılmazsa display pırpır ediyor gibi gözükme problemi olur.

Birde titreme gerçek devrede oluyor demi,
simulasyonda oluyorsa gerçeği yansıtmaz.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

xoom

#21
Alıntı yapılan: RaMu - 23 Ekim 2024, 00:06:03Yanlış söylemişim, output enable özelliğini kullanmak lazım,
pinlere yeni data yazılmadan önce output disable yapılacak,
yeni data pinlere yüklenip latch edildikten sonra
output enable edilecek,
standard sürme yöntemidir, detaylı anlatımları nedenleriyle nette kolaylıkla bulunabilir,
OE kullanılmazsa display pırpır ediyor gibi gözükme problemi olur.

Birde titreme gerçek devrede oluyor demi,
simulasyonda oluyorsa gerçeği yansıtmaz.
OE  için devre üzerinde değişiklik yapma şansım yok. VCCye çekilmiş durumda.

xoom

Alıntı yapılan: mehmet - 22 Ekim 2024, 20:25:0612F675 ile simülasyonda kısmen çalışıyor, ilk biti yutuyor. Elimde 4094 olmadığı için deneyemiyorum. Bir ara 595 ile deneyeceğim.

/*
 * File:   main.c
 * Author: mehmet
 *
 * Created on 22 Ekim 2024 Salı, 13:20
 * 
 */

// PIC12F675 Configuration Bit Settings
// 'C' source line config statements
// CONFIG
#pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-Up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF      // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
#pragma config CP = ON          // Code Protection bit (Program Memory code protection is enabled)
#pragma config CPD = ON         // Data Code Protection bit (Data memory code protection is enabled)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>
#include <stdint.h>

#define _XTAL_FREQ              4000000

#define _BV(bt)                 (1u << (bt))
#define sbi(port, bt)           (port) |= _BV(bt)    /* Set bit number n in byte b   */
#define cbi(port, bt)           (port) &= ~_BV(bt)   /* Clear bit number n in byte b */

#define rbi(port, bt)           (port) & _BV(bt)     /* Read bit number n in byte b  */
#define fbi(port, bt)           (port) ^= _BV(bt)    /* Flip bit number n in byte b  */
#define bit_is_set(port, bt)    (port) & _BV(bt)     /* Test if bit number n in byte b is set   */
#define bit_is_clear(port, bt)  (!port) & _BV(bt)   /* Test if bit number n in byte b is clear */

#define CLOCK                   GPIObits.GP1
#define LATCH                   GPIObits.GP2
#define DATA                    GPIObits.GP0

#define CLOCK_DIR               TRISIObits.TRISIO1
#define LATCH_DIR               TRISIObits.TRISIO2
#define DATA_DIR                TRISIObits.TRISIO0

uint16_t sayac = 0;

const uint8_t tablo[(5 * 3 * 2) + 2] = {
    //76543210    76543210
    0b11111111, 0b11111111, //boş
    0b11111110, 0b00000001, // LED1
    0b11111101, 0b00000001, // LED2
    0b11111011, 0b00000001, // LED3

    0b11111110, 0b00000010, // LED4
    0b11111101, 0b00000010, // LED5
    0b11111011, 0b00000010, // LED6

    0b11111110, 0b00000100, // LED7
    0b11111101, 0b00000100, // LED8
    0b11111011, 0b00000100, // LED9

    0b11111110, 0b00001000, // LED10
    0b11111101, 0b00001000, // LED11
    0b11111011, 0b00001000, // LED12

    0b11111110, 0b00010000, // LED13
    0b11111101, 0b00010000, // LED14
    0b11111011, 0b00010000 // LED15
};

/*
 * 
 */
void spi_wr8(uint8_t val) // write a byte to software SPI
{
    for(uint8_t i = 8; i; i--)
    {
        CLOCK = 0;
        DATA = 0;
        if(val & 0x80) // MSB first
            DATA = 1;
        val <<= 1;
        CLOCK = 1;
    }
}

/*
 * Test için yazıldı.
 */
void hc4094Yaz(uint8_t sayi)
{
    uint8_t k;
    k = sayi;

    LATCH = 0b0;
    spi_wr8(tablo[(k * 2u)]);
    spi_wr8(tablo[(k * 2u) + 1u]);
    LATCH = 0b1;
}

/*
 * http://eng-serve.com/pic/pic_timer.html
 */
void kesmeHazirla(void)
{
    //    //Timer0 Registers Prescaler= 1 - TMR0 Preset = 156 - Freq = 10000.00 Hz - Period = 0.000100 seconds
    //    OPTION_REGbits.T0CS = 0; // bit 5  TMR0 Clock Source Select bit...0 = Internal Clock (CLKO) 1 = Transition on T0CKI pin
    //    OPTION_REGbits.T0SE = 0; // bit 4 TMR0 Source Edge Select bit 0 = low/high 1 = high/low
    //    OPTION_REGbits.PSA = 1; // bit 3  Prescaler Assignment bit...0 = Prescaler is assigned to the WDT
    //    OPTION_REGbits.PS2 = 0; // bits 2-0  PS2:PS0: Prescaler Rate Select bits
    //    OPTION_REGbits.PS1 = 0;
    //    OPTION_REGbits.PS0 = 0;
    //    TMR0 = 56; // preset for timer register (56->5KHz,156->10KHz, 206->20KHz)

    //Timer0 Registers Prescaler= 1 - TMR0 Preset = 156 - Freq = 10000.00 Hz - Period = 0.000100 seconds
    OPTION_REGbits.T0CS = 0; // bit 5  TMR0 Clock Source Select bit...0 = Internal Clock (CLKO) 1 = Transition on T0CKI pin
    OPTION_REGbits.T0SE = 0; // bit 4 TMR0 Source Edge Select bit 0 = low/high 1 = high/low
    OPTION_REGbits.PSA = 0; // bit 3  Prescaler Assignment bit...0 = Prescaler is assigned to the WDT
    OPTION_REGbits.PS2 = 0; // bits 2-0  PS2:PS0: Prescaler Rate Select bits
    OPTION_REGbits.PS1 = 0;
    OPTION_REGbits.PS0 = 1;
    TMR0 = 6; // preset for timer register (6->1KHz)

    // Interrupt Registers
    INTCON = 0; // clear the interrpt control register
    INTCONbits.TMR0IE = 1; // bit5 TMR0 Overflow Interrupt Enable bit...1 = Enables the TMR0 interrupt
    INTCONbits.TMR0IF = 0; // bit2 clear timer 0 interrupt flag
    INTCONbits.GIE = 1; // bit7 global interrupt enable
}

/*
 * 
 */
void mcuInit(void)
{
    OPTION_REG = 0b00000000;
    CMCON = 0b00000111;
    VRCON = 0b00000000;
    WPU = 0b00000111; 
    IOCB = 0;

    GPIO = 0x00;

    DATA_DIR = 0b0;
    CLOCK_DIR = 0b0;
    LATCH_DIR = 0b0;
}

/*
 * 
 */
void main(void)
{
    mcuInit();
    kesmeHazirla();

    sayac = 63;
    
    while(1)
    {            
        
    }
}

/*
 * 
 */
void interrupt ISR(void)
{
    static uint8_t h = 0;
    uint8_t k = 0;
    
    if(INTCONbits.TMR0IF == 1) 
    {
        k = 0;
        if(bit_is_set(sayac, h))
        {
            k = h;
        }

        LATCH = 0b0;        
        spi_wr8(tablo[(k * 2u)]);        
        spi_wr8(tablo[(k * 2u) + 1u]);        
        LATCH = 0b1;       

        if(h++ > 15) h = 0;

        INTCONbits.TMR0IF = 0;
        INTCONbits.TMR0IE = 1;
        TMR0 = 6;
    }
}
////////////////////////////////////////////////////////////////////////////////

Mehmet Hocam öğlenden beridir bakıyorum ama kodlar bana uzak geldi anlayamadım. Emeğinize sağlık..

mehmet

"tablo" içindeki değerleri sıra ile çıkışa verebilecek misiniz?
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

xoom

Alıntı yapılan: mehmet - 23 Ekim 2024, 22:32:11"tablo" içindeki değerleri sıra ile çıkışa verebilecek misiniz?
const uint8_t tablo[(5 * 3 * 2) + 2] = {
tablo yapısını anlayamadım.. Maalesef.  O yüzden zaten tam olarak naptığınızı anlayamadım.
Timer burada ne iş yapıyor ?
Tablo [(5 * 3 * 2) + 2] burası tam olarak nedir?
Biraz fransız kaldım.
Ben Stm32F'e Hal kütüphanesi ile birşeyler yapmaya çalışıyorum.

mehmet

Yaptığınız bağlantıya göre bir ledi yakabilmek için, iki adet 8 bitlik sayıyı çıkışa vermeliyiz. 15 LED var. Bir de sönük olma durumu. Dolayısıyla tablo değeri sayısını tembel biri olarak bu şekilde hesapladım. Siz direkt 32 olarak yazabilirsiniz.
Tek tek yakabilmek kolay, test için yazılmış fonksiyonu kullanabilirsiniz. Ancak, 15bit değer gösterebilmek için tarama yapmanız gerekmekte. Bu da interrupt fonksiyonu içinde bulunmakta.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

mehmet

#26
İki adet HC595, mcu 16F1503, 4Mhz, TMR0 4KHz.(250µs), 3 x 5 matriks.
https://mega.nz/file/jZ9yXCiY#HegKZRq1zm2hbG9TQb1-OwRVWbyyn00_PKoxDJ5wGjM

/*
 * File:   main.c
 * Author: mbmb
 *
 * Created on 22 Ekim 2024 Salı, 13:20
 * 
 * PicProje'de sorulan bir soru üzerine...
 * https://www.picproje.org/index.php?msg=644520
 * 12F675 veya 16F1503 ile kullanılabilir.
 */

#pragma warning disable 520//Kullanılmayan fonksiyon uyarısı iptal

#if defined (__12F675__)
// PIC12F675 Configuration Bit Settings
// 'C' source line config statements
// CONFIG
#pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-Up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF      // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
#pragma config CP = ON          // Code Protection bit (Program Memory code protection is enabled)
#pragma config CPD = ON         // Data Code Protection bit (Data memory code protection is enabled)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#elif defined (__16F1503__)
// PIC16F1503 Configuration Bit Settings
// 'C' source line config statements
// CONFIG1
#pragma config FOSC = INTOSC    // Oscillator Selection Bits (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable (PWRT enabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = ON          // Flash Program Memory Code Protection (Program memory code protection is enabled)
#pragma config BOREN = ON       // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
// CONFIG2
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LPBOR = ON       // Low-Power Brown Out Reset (Low-Power BOR is enabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#endif

#include <xc.h>
#include <stdint.h>

#define _XTAL_FREQ              4000000
#define _BV(bt)                 (1u << (bt))
#define sbi(port, bt)           (port) |= _BV(bt)    /* Set bit number n in byte b   */
#define cbi(port, bt)           (port) &= ~_BV(bt)   /* Clear bit number n in byte b */
#define rbi(port, bt)           (port) & _BV(bt)     /* Read bit number n in byte b  */
#define fbi(port, bt)           (port) ^= _BV(bt)    /* Flip bit number n in byte b  */
#define bit_is_set(port, bt)    (port) & _BV(bt)     /* Test if bit number n in byte b is set   */
#define bit_is_clear(port, bt)  (!port) & _BV(bt)   /* Test if bit number n in byte b is clear */

#if defined(__12F675__)
#define CLOCK                   GPIObits.GP1
#define LATCH                   GPIObits.GP2
#define DATA                    GPIObits.GP0
#define CLOCK_DIR               TRISIObits.TRISIO1
#define LATCH_DIR               TRISIObits.TRISIO2
#define DATA_DIR                TRISIObits.TRISIO0
#elif defined(__16F1503__)
#define CLOCK                   LATCbits.LATC3
#define LATCH                   LATCbits.LATC4
#define DATA                    LATCbits.LATC5
#define CLOCK_DIR               TRISCbits.TRISC3
#define LATCH_DIR               TRISCbits.TRISC4
#define DATA_DIR                TRISCbits.TRISC5
#endif

volatile uint16_t sayac = 0;
volatile uint8_t tmr = 0;
const uint8_t tablo[(5 * 3 * 2) + 2] = {
    //76543210    76543210
    0b00000110, 0b00000001, // LED1
    0b00000101, 0b00000001, // LED2
    0b00000011, 0b00000001, // LED3

    0b00000110, 0b00000010, // LED4
    0b00000101, 0b00000010, // LED5
    0b00000011, 0b00000010, // LED6

    0b00000110, 0b00000100, // LED7
    0b00000101, 0b00000100, // LED8
    0b00000011, 0b00000100, // LED9

    0b00000110, 0b00001000, // LED10
    0b00000101, 0b00001000, // LED11
    0b00000011, 0b00001000, // LED12

    0b00000110, 0b00010000, // LED13
    0b00000101, 0b00010000, // LED14
    0b00000011, 0b00010000, // LED15
    0b00000111, 0b00000000 //boş
};

/*
 * http://eng-serve.com/pic/pic_timer.html
 * 4KHz bu iş işin ideal olmuştur.
 */
void kesmeHazirla(void)
{
    //Timer0 Registers Prescaler= 2 - TMR0 Preset = 131 - Freq = 4000.00 Hz - Period = 0.000250 seconds
    OPTION_REGbits.T0CS = 0; // bit 5  TMR0 Clock Source Select bit...0 = Internal Clock (CLKO) 1 = Transition on T0CKI pin
    OPTION_REGbits.T0SE = 0; // bit 4 TMR0 Source Edge Select bit 0 = low/high 1 = high/low
    OPTION_REGbits.PSA = 0; // bit 3  Prescaler Assignment bit...0 = Prescaler is assigned to the Timer0
    OPTION_REGbits.PS2 = 0; // bits 2-0  PS2:PS0: Prescaler Rate Select bits
    OPTION_REGbits.PS1 = 0;
    OPTION_REGbits.PS0 = 0;
    tmr = 131; // preset for timer register(131->4KHz)

    TMR0 = tmr;
    // Interrupt Registers
    INTCON = 0; // clear the interrpt control register
    INTCONbits.TMR0IE = 1; // bit5 TMR0 Overflow Interrupt Enable bit...1 = Enables the TMR0 interrupt
    INTCONbits.TMR0IF = 0; // bit2 clear timer 0 interrupt flag
    INTCONbits.GIE = 1; // bit7 global interrupt enable
}

/*
 * 
 */
void mcuInit(void)
{
#if defined(__12F675__)
    OPTION_REG = 0b00000000;
    CMCON = 0b00000111;
    VRCON = 0b00000000;
    WPU = 0b00000111;
    IOCB = 0;
    GPIO = 0x00;
#elif defined(__16F1503__)
    OSCCONbits.IRCF = 0b1101; //4MHz
    OSCCONbits.SCS = 0b00; //Config bitindeki tanımlama
    ANSELAbits.ANSELA = 0b00000000; //A portu dijital giriş-çıkış
    ANSELCbits.ANSELC = 0b00000000; //C portu dijital giriş-çıkış
    PORTA = 0x00;
    PORTC = 0x00;
    LATA = 0x00;
    LATC = 0x00;
    TRISA = 0x00;
    TRISC = 0x00;
#endif
    DATA_DIR = 0b0;
    CLOCK_DIR = 0b0;
    LATCH_DIR = 0b0;
}

/*
 * 
 */
void main(void)
{
    uint8_t j = 0;
    mcuInit();
    kesmeHazirla();
    sayac = 7;

    while(1)
    {
        for(j = 0; j < 12; j++)
        {
            sayac <<= 1;
            __delay_ms(60);
        }        
        for(j = 0; j < 12; j++)
        {
            sayac >>= 1;
            __delay_ms(60);
        }
    }
}

/*
 * 
 */
void interrupt ISR(void)
{
    static uint8_t h = 0;
    int8_t k = 0;
    uint8_t val1, val2;

    if(INTCONbits.TMR0IF == 1)
    {
        k = -1;
        if(bit_is_set(sayac, h))
        {
            k = h;
        }
        if(sayac > 0)
        {
            val2 = tablo[((uint8_t) k * 2u)];
            val1 = tablo[((uint8_t) k * 2u) + 1u];
        }
        else
        {
            val2 = 0b00000111;
            val1 = 0b00000000;
        }
        LATCH = 0b0;
        for(uint8_t i = 8; i; i--)
        {
            CLOCK = 0;
            DATA = 0;
            if(val2 & 0x80) // MSB first
                DATA = 1;
            val2 <<= 1;
            CLOCK = 1;
        }
        for(uint8_t i = 8; i; i--)
        {
            CLOCK = 0;
            DATA = 0;
            if(val1 & 0x80) // MSB first
                DATA = 1;
            val1 <<= 1;
            CLOCK = 1;
        }
        LATCH = 0b1;        
        if(h++ >= 14) h = 0;
        INTCONbits.TMR0IF = 0;
        INTCONbits.TMR0IE = 1;
        TMR0 = tmr;
    }
}
////////////////////////////////////////////////////////////////////////////////
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

xoom

Alıntı yapılan: mehmet - 29 Ekim 2024, 15:27:40İki adet HC595, mcu 16F1503, 4Mhz, TMR0 4KHz.(250µs), 3 x 5 matriks.
https://mega.nz/file/jZ9yXCiY#HegKZRq1zm2hbG9TQb1-OwRVWbyyn00_PKoxDJ5wGjM
Elinize sağlık ledler videoda 3'erli blok halinde hareket ediyor gibi görünüyor sanırım videodan

mehmet

#28
Siz hepside yanabilir demiştiniz. Ben de basit bir animasyon ekledim. 3'lü yürüyen animasyon.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"