logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak zmienić ten kod, by zmieścił się do attiny 2313

Master Dragon 03 Kwi 2009 15:18 1464 7
  • #1 6370019
    Master Dragon
    Poziom 12  
    Proszę o weryfikacje i uproszczenie tego kodu tak aby mógł go zmieścić w tym procesorze co w temacie

    #include <avr/io.h>
    #include <avr/delay.h>
    #include <string.h>
    #define F_CPU 1000000UL
    #include <stdlib.h>
    
    #define SET_E PORTB |= _BV(3)
    #define CLR_E PORTB &= ~_BV(3)
    
    #define SET_RS PORTB |= _BV(2)
    #define CLR_RS PORTB &= ~_BV(2)
    
    #define SET_W DDRD &= ~_BV(l)
    #define CLR_W DDRD |= _BV(l)
    
    #define ON_P DDRD |= _BV(2)
    #define OFF_P DDRD &= ~_BV(2)
    
    char wys[16];
    
    char l =0 ;
    char we = 0;
    
    // procedura zapisu
    void w_l(char x)
    {
    SET_E;
    PORTB = ((PORTB & 0x0F) | (x & 0xF0));
    CLR_E;
    SET_E;
    PORTB = ((PORTB & 0x0f) | ((x & 0x0F) << 4));
    CLR_E;
    _delay_ms(1);
    }
    // procedura instrukcji
    void w_c(char x)
    {
    CLR_RS;
    w_l(x);
    }
    // zapis tekstu do lcd
    void w_t(char * s)
    {
    while(*s)
    {
            SET_RS;
            w_l(*s);
            s++;
    }
    }
    // inicjacja lcd
    void l_i(void)
    {
    _delay_us(15);
    CLR_E;
    CLR_RS;
    char i;
    for(i = 0; i < 3; i++)
    {
            SET_E;
            PORTB &=0x3F;
            CLR_E;
            _delay_ms(5);
    }
    SET_E;
    PORTB &= 0x2E;
    CLR_E;
    _delay_ms(1);
    w_c(0x28);
    w_c(0x08);
    w_c(0x01);
    w_c(0x06);
    w_c(0x0C);
    }
    // reset 1W
    unsigned char r_p(char l)
    {
    unsigned char p;
    if(l == 0)
    {
            we = 0x01;
    }
    if(l == 1)
    {
            we = 0x02;
    }
    CLR_W;
    _delay_us(500);
    SET_W;
    _delay_us(30);
    if(bit_is_clear(PIND, we)) {p=1;}else{p=0;}
    _delay_us(470);
    if(bit_is_clear(PIND, we)) {p=1;}else{p=0;}
    return p;
    }
    // wysyłanie bajtu
    void s_b(char w)
    {
    unsigned char i;
    unsigned char p;
    
    for(i = 0; i < 8; i++)
    {
            p = w >> i;
            p &= we;
            CLR_W;
            _delay_us(5);
            if(p == 1)
                    SET_W;
                    _delay_us(80);
                    SET_W;
    }
    _delay_us(100);
    }
    // wysyłanie bajtu
    unsigned char r_b(void)
    {
    unsigned char i;
    unsigned char w = 0;
    unsigned char p = 0;
    for(i = 0; i < 8; i++)
    {
    CLR_W;
    _delay_us(2);
    SET_W;
    _delay_us(15);
    if(bit_is_set(PIND, we)) {p=1;}else{p=0;}
    if(p) w |=we << i;
    _delay_us(15);
    }
    }
    // główna funkcja
    int main(void)
    {
    unsigned char s;
    char b1[8],b2[8];
    char t_1 = 0,t_2 = 1,e = 0;
    float t1 = 0,t2 = 0;
    DDRB = 0xFF;
    PORTB = 0xFF;
    l_i();
    w_t("Start");
    for(;;)
    {
            for(e = 0; e <= 1; e++)
            {
                    s=r_p(e);
                    if(s == 1)
                    {
                            s_b(0xCC);
                            s_b(0x44);
                            _delay_us(750);
    
                            s=r_p(e);
                            s_b(0XCC);
                            s_b(0xBE);
    
                            t_1=r_b();
                            t_2=r_b();
    
                            s=r_p(e);
    
                            if(e == 0)
                            {
                                    t1=(float)(t_1+(t_2*256))/16;
                                    dtostrf(t1,1,1,b1);
                            }
                            if(e == 1)
                            {
                                    t2=(float)(t_2+(t_2*256))/16;
                                    dtostrf(t2,1,1,b2);
                            }
                    }
                    else
                    {
                           if(e == 0){t1= 0;}
                           if(e == 1){t2= 0;}
                    }
            }
    strcat(wys, b1);
    strcat(wys, b2);
    w_c(0x01);
    w_t(wys);
    if(t1 >= 40)
    {
    if(t2 <= 40)
    {
            ON_P;
    }
    }
    if(t1 <= 40)
    {
            OFF_P;
    }
    _delay_us(200);
    }
    }


    jest to mechanizm wyświetlający temperaturę z dwóch ds18b20 na osobnych pinach mogą być razem tylko nie wiem jak to zrobić. i włączające pompę c.w.u

    Proszę o korektę tego kodu mi to zajmuje 2,4Kbs
  • #2 6370055
    __Maciek__
    Poziom 20  
    Zrezygnuj z float-ów.

    np :
    ow_reset() ;
         ow_write_byte(0xCC);
         ow_write_byte(0xBE); 	  
    	  lsb = ow_read_byte() ;
    	  msb = ow_read_byte() ;	  
    	  Temperatura = (msb<<8 | lsb) * 10 / 16 ;
  • #3 6370282
    Master Dragon
    Poziom 12  
    a będzie mi czytał minusowe temperatury bo wydaje mi się że nie patrząc na ten kod a do następnego projektu mi będzie potrzebna ujemna temperatura.

    A i może byś podrzucił kawałek kodu jak rozpoznawać ds jak są na jednej lini wiem jakie komendy wysyłać tylko nie wiem jak to interpretować.
  • #4 6370343
    __Maciek__
    Poziom 20  
    Poczytaj sobie ten wątek.

    Co do rozpoznawanie czujnika to nie robiłem tego bo nie było mi to potrzebne.
  • #5 6371302
    Master Dragon
    Poziom 12  
    dzięki __Maciek__ za fatygę bo jak na razie założyłem dwa wątki bo na ostatni odpowiedzieli parę razy i cisza.

    Mam jeszcze jedno pytanie short int powinien wystarczyć na zmienną dla temperatury
  • #6 6371456
    __Maciek__
    Poziom 20  
    Nie short int ma 8 bitów .. int 16.
    Na short int daje Ci to +/-128 na int +/- 32767
    Mogą się pojawić błędy przy liczeniu (albo i nie). Jeśli na Int się zmieści to raczej nie kombinuj ... niewiele zaoszczędzisz.

    A następnym razem zamiast zakładać kolejne wątki użyj przycisku SZUKAJ.
  • #7 6371729
    Master Dragon
    Poziom 12  
    Zobacz to i sprawdź kompiluje się zajmuje dokładnie 2002 bajtów ale wyskakuje mi takie ostrzeżenie

    avr-gcc -c -mmcu=attiny2313 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -std=gnu99 ster.c -o ster
    In file included from ster.c:2:
    /usr/lib/gcc/avr/4.3.0/../../../../avr/include/avr/delay.h:36:2: warning: #warning "This file has been moved to <util/delay.h>."
    ster.c: In function ‘main’:
    ster.c:184: warning: passing argument 2 of ‘strcat’ makes pointer from integer without a cast
    avr-objcopy -O ihex ster ster.hex


    zobacz na tą stronę tu wszystko jest

    https://www.elektroda.pl/rtvforum/topic1268771.html
  • #8 6371835
    __Maciek__
    Poziom 20  
    Sprawdź dokładnie która to linia ...

    Po prostu kompilator informuje cię że ma tam niezgodność typów.
REKLAMA