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

[Atmega8][c][DS2431] nie chce zapisywać

Master Dragon 30 Sty 2010 10:06 1818 2
REKLAMA
  • #1 7614612
    Master Dragon
    Poziom 12  
    Witam państwa i znowu problem z eeprom(taki jak w tytule) nie mogę zapisać odczyt mi działa o to kod. Może znajdziecie jakiś błąd. A biblioteki to rklibavr


    
    #include <avr/io.h>
    #include <util/delay.h>
    #include <stdlib.h>
    #include "lcd.h"
    #include "uart.h"
    #include "onewire.h"
    
    #define key_pin			PINB
    #define key_change		0
    #define key_enter 		1
    #define key_read		2
    
    void ds2431_wm(char addr, char data)
    {
    	char i,es=0;
    	
    	if(OW_reset() == 0);
    	{
    	OW_byte_wr(0xCC);
    	OW_byte_wr(0x0F);
    	OW_byte_wr(addr);
    	OW_byte_wr(0x00);
    	for(i=0;i<8;i++)
    	{
    		OW_byte_wr(data);
    	}
    	UART_putchar(OW_byte_rd());
    	UART_putchar(OW_byte_rd());
    	}
    	
    	if(OW_reset() == 0);
    	{
    	OW_byte_wr(0xCC);
    	OW_byte_wr(0xAA);
    	UART_putchar(OW_byte_rd());
    	UART_putchar(OW_byte_rd());
    	es=OW_byte_rd();
    	UART_putchar(es);
    	for(i=0;i<8;i++)
    	{
    		UART_putchar(OW_byte_rd());
    	}
    	UART_putchar(OW_byte_rd());
    	UART_putchar(OW_byte_rd());
    	}
    
    	if(OW_reset() == 0)
    	{
    	OW_byte_wr(0xCC);
    	OW_byte_wr(0x55);
    	OW_byte_wr(addr);
    	OW_byte_wr(0x00);
    	OW_byte_wr(es);
    	_delay_us(13);
    	UART_putchar(OW_byte_rd());
    	}
    }
    
    void ds2431_rm(unsigned char addr)
    {
    	unsigned char i;
    	
    	OW_reset();
    	OW_byte_wr(0xCC);
    	OW_byte_wr(0xF0);
    	OW_byte_wr(addr);
    	OW_byte_wr(0x00);
    	for(i=0;i<=(143 - addr);i++)
    	{
    		UART_putchar(OW_byte_rd());
    	}
    }
    
    void key_init (void)
    {
    	DDRB &=~ _BV(0)|_BV(1)|_BV(2);
    	PORTB |= _BV(0)|_BV(1)|_BV(2);
    }
    
    void key(void)
    {	
    	if(!(key_pin & _BV(key_change)))
    	{
    		_delay_ms(30);
    		while(!(key_pin & _BV(key_change))){}
    	}
    	if(!(key_pin & _BV(key_read)))
    	{
    		ds2431_wm(0x20, 0x33);
    		_delay_ms(30);
    		while(!(key_pin & _BV(key_read))){}
    	}
    
    	if(!(key_pin & _BV(key_enter)))
    	{
    		LCD_clear();
    		LCD_putstr_P(PSTR("Odczyt"));
    		ds2431_rm(0x00);
    		_delay_ms(30);
    		while(!(key_pin & _BV(key_enter))){}
    		LCD_clear();
    		LCD_putstr_P(PSTR("JEST"));
    	}
    }
    
    
    
    int main(void)
    {   
    	
    	key_init();
    	LCD_init();
    	UART_init();
    	LCD_putstr_P(PSTR("JEST"));
    	for(;;)
    	{
    		key();
    	}
    }
    
    


    A dokładnie to es mi pokazuje 5F a w pamięci się nic nie zapisuje
  • REKLAMA
  • #2 7619911
    iryseee
    Poziom 14  
    Witam cię miałem podobny problem.
    programuje w bascomie ale postaram się podpowiedzieć ci w czym tkwi problem przy zapisie pamięci.
    Jeżeli umiesz odczytać zawartość pamięci to w zapisie jest tak że po
    rozkazie cch ,55h czyli kopiujesz do notesu podajesz ta1 ta2 e/s wtedy dajesz czekaj
    5ms potem tablice do w w pisania do eepromu powinno zadziałać od razu w pdf jest to opisane tx <idle or strong pullup> wait 5ms opis jest z DS2433.pdf poszukaj sobie na stronie 23. Mam nadzieję że ci to pomorze.

    Dodano po 3 [minuty]:

    Powinien cię chyba interesować ten fragment kodu:
    OW_byte_wr(0xCC);
    OW_byte_wr(0x55);
    OW_byte_wr(addr);
    OW_byte_wr(0x00);
    OW_byte_wr(es);
    tutaj powinno być 5ms następnie wpis bynajmniej ta to działa w bascomie

    _delay_us(13);
    UART_putchar(OW_byte_rd());

    Dodano po 4 [minuty]:

    tak to wygląda w bascomie:

    1wreset Pinb , 0
    1wwrite &HCC , 1 , Pinb , 0
    1wwrite &H55 , 1 , Pinb , 0
    1wwrite A , 1 , Pinb , 0
    1wwrite B , 1 , Pinb , 0
    1wwrite &H1F , 1 , Pinb , 0
    Waitms 5
    1wwrite Ia(1) , 32 , Pinb , 0
  • #3 7620006
    Master Dragon
    Poziom 12  
    dzięki mam juz tam jest odstęp czasowy to jest to _delay_us(13);
    tyle że to jest w mikrosekundach anie milisekundach dzięki ale gafa

    :D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D
REKLAMA