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

[Atmega 8][C][93C86]Potrzebny kod w c do obsługi 93c86

Master Dragon 15 Lis 2009 22:09 2271 9
  • #1 7266283
    Master Dragon
    Poziom 12  
    Witam. Potrzebuje jakiegoś dobrego kodu w C do obsługi eeprom 93c86 (spi) nie radze sobie z nim. A dokładnie odczytać mi się go udało tylko nie mogę go zapisać może pomożecie. Może być do jakiegoś podobnego. Nie koniecznie do tego tyle to sobie przerobię
  • #2 7267290
    kamyczek
    Poziom 38  
    poczytaj dobrze pdf od 93CXX tam jest napisane jak to zrobić i jakie komendy wysłać przed zapisem ...
  • #3 7268704
    Master Dragon
    Poziom 12  
    Dobra tu jest kod może ktoś to sprawdzić ewentualnie sugestie

    
    #define F_CPU 8000000UL
    
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/pgmspace.h>
    #include <stdlib.h>
    #include "uart.h"
    
    void init_spi(void)
    {
    	PORTB |= _BV(2)|_BV(3);
    	PORTB &=~ _BV(5);
    	DDRB |= _BV(2)|_BV(3)|_BV(5);
    	DDRB &=~ _BV(4);
    
    	SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(0<<SPR1)|(1<<CPOL);
    	SPSR = (0<<SPI2X);
    }
    
    void wyslij_spi(unsigned char bajt)
    {
    	SPDR = bajt;
    	while(!(SPSR & _BV(7)));
    }
    
    unsigned char odbierz_spi(void)
    {
    
    	while(!(SPSR & _BV(7)));
    	return(SPDR);
    }
    
    void wlancz_zapis (void)
    {
    	PORTB |= _BV(2);
    	wyslij_spi(0b100);
    	wyslij_spi(0b11000000);
    	PORTB |= _BV(2);
    }
    
    void wylancz_zapis (void)
    {
    	PORTB |= _BV(2);
    	wyslij_spi(0b100);
    	wyslij_spi(0b00000000);
    	PORTB |= _BV(2);
    }
    
    void wyczysc_wszystko (void)
    {
    	PORTB |= _BV(2);
    	wyslij_spi(0b100);
    	wyslij_spi(0b10000000);
    	PORTB |= _BV(2);
    }
    
    unsigned char eeprom_czytaj(unsigned short int address)
    {
    	unsigned char HiByte, LoByte, data;
    	HiByte = address >> 8;
    	LoByte = address & 0x00FF;
    	
    	PORTB |= _BV(2);
    	PORTB &=~ _BV(5);
    	wyslij_spi(0b110);
    	wyslij_spi(HiByte);
    	wyslij_spi(LoByte);
    	data = odbierz_spi();
    	PORTB &=~ _BV(2);
    	return(data);
    }
    
    void eeprom_zapisz(unsigned short int address, unsigned char data)
    {
    	unsigned char HiByte, LoByte;
    	HiByte = address >> 8;
    	LoByte = address & 0x00FF;
    	
    	PORTB |= _BV(2);
    	PORTB &=~ _BV(5);
    	wyslij_spi(0b101);
    	wyslij_spi(HiByte);
    	wyslij_spi(LoByte);
    	wyslij_spi(data);
    	PORTB &=~ _BV(2);
    }
    
    
    int main(void)
    {
    	unsigned short int i;
    	DDRC |= _BV(5);
    	DDRC &=~ _BV(4)|_BV(3)|_BV(2);
    	PORTC &=~ _BV(5);
    	PORTC |= _BV(4)|_BV(3)|_BV(2);
    	UART_init();
    	init_spi();
    	PORTC |= _BV(5);
    	while(1)
    	{
    		if(!(PINC & _BV(2)))
    		{
    			i = 0x0000;
    			_delay_ms(30);
    			if(!(PINC & _BV(2)))
    			{
    				PORTC &=~ _BV(5);
    				UART_putstr_P(PSTR("Zapis"));
    				i = 0;
    				wlancz_zapis();
    				do{
    				eeprom_zapisz(i,0xFF);
    				i++;
    				}while( i <= 0x0800);
    				wylancz_zapis();
    			}
    		PORTC |= _BV(5);
    		UART_putstr_P(PSTR("Koniec"));
    		}
    		
    		if(!(PINC & _BV(3)))
    		{
    			_delay_ms(30);
    			if(!(PINC & _BV(3)))
    			{
    				PORTC &=~ _BV(5);
    				UART_putstr_P(PSTR("Zapis 0x00e0"));
    				wlancz_zapis();
    				eeprom_zapisz(0x00e0,0xFF);
    				wylancz_zapis();
    			}
    		PORTC |= _BV(5);
    		UART_putstr_P(PSTR("Koniec"));
    		}
    		
    		if(!(PINC & _BV(4)))
    		{
    			_delay_ms(30);
    			if(!(PINC & _BV(4)))
    			{
    				i = 0x0000;
    				PORTC &=~ _BV(5);
    				UART_putstr_P(PSTR("Odczyt"));
    				_delay_us(10);
    				do{
    				UART_putchar(eeprom_czytaj(i));
    				i++;
    				}while( i <= 0x0800);
    			}
    		PORTC |= _BV(5);
    		}
    	}
    }
    
  • #4 7276000
    Master Dragon
    Poziom 12  
    Przetłumaczcie mi to na jeżyk ludzki lub C bo BASCOMA nie umie prosze

    ' Data bits: 8 16 8 16 8 16 8 16
    ' AL : 7 6 9 8 8 7 9 8

    'you could use the same pin for DIN and DOUT
    'we use a 93C66 and send bytes not words so AL is 8
    $crystal = 12000000
    Config Microwire = Pin , Cs = P1.2 , Din = P3.5 , Dout = P3.1 , Clock = P3.4 , Al = 8
    Config Lcdpin = Pin , Db4 = P1.4 , Db5 = P1.5 , Db6 = P1.6 , Db7 = P1.7 , E = P1.3 , Rs = P1.2
    Config Lcd = 16 * 2 ' konfiguracija LCD display a
    Cursor Off
    'init pins
    Mwinit
    'dimension variable used
    Dim Pom As Byte
    Dim X As Word

    Pom = P3 And &B00001101 'ako su sve tri tipke
    If Pom = 0 Then 'pritisnute,
    Mwwopcode &B10010000000 , 11 'resetiraj brojač
    End If

    Mwread X , &B110 , 0 , 2
    Cls
    Do
    'enable write to eeprom
    'send startbit, opcode (00) and 11 + address

    'Mwwopcode opcode, numberOfBits
    Mwwopcode &B10011000000 , 11
    'the mwwopcode can send a command(opcode) to a device

    'write value of X to address 0
    'opcode is 01
    'we write 1 byte
    'Mwwrite var,opcode,address,numberOfBytes
    Mwwrite X , &B101 , 0 , 2
    Waitms 10

    'read back
    ' mwread var,opcode,address,numberofbytes
    Mwread X , &B110 , 0 , 2

    Locate 1 , 1 : Lcd X ; " "
    X = X + 10

    If X = 0 Then
    Cls
    End If

    'disable write
    'send startbit, opcode (00) and 00 + address
    Mwwopcode &B10000000000 , 11
    Loop
    End
  • #5 7278508
    janbernat
    Poziom 38  
    Tu nie ma nic do tłumaczenia na C
    Obsługa microwire jest biblioteką Bascoma.
    Bascom jest płatny.
    Jest kompilatorem z języka Basic.
    Tak jak IAR kompiluje z C.
    I też jest płatny.
    Toute proportion gardee.
  • #6 7279823
    michalko12
    Specjalista - Mikrokontrolery
    Zacznijmy od tego, że nie obsłużysz tej pamięci sprzętowym SPI. Musisz na piechotę napisać obsługę transmisji z tą pamięcią.
  • #7 7280244
    kamyczek
    Poziom 38  
    michalko12 napisał:
    Zacznijmy od tego, że nie obsłużysz tej pamięci sprzętowym SPI. Musisz na piechotę napisać obsługę transmisji z tą pamięcią.


    Microwire to spi w trybie 0 nazwane tak przez NS. I dlaczego niby nie obsłużysz jej sprzętowym spi ? Napisz czego nie ma sprzętowe spi co jest potrzebne do obsługi tej transmisji?
  • #8 7280281
    michalko12
    Specjalista - Mikrokontrolery
    kamyczek napisał:

    Microwire to spi w trybie 0 nazwane tak przez NS. I dlaczego niby nie obsłużysz jej sprzętowym spi ? Napisz czego nie ma sprzętowe spi co jest potrzebne do obsługi tej transmisji?



    Zmiennej ilości przesyłanych bitów?
  • #10 7283626
    Master Dragon
    Poziom 12  
    Panowie dzięki za wszystko poradziłem sobie napisałem komunikacje. A może przez isp by się udało gdy zrobić tak że scalić cały ciąg na przykład zapisu w jedną zmienną a potem wysyłać po 8bitów może by zaskoczyło. No ale mnie jsza z tym temat uważam za zamknięty.


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