at89s programação ISP

F

freakkaito

Guest
hey bro, eu quero um programa at89s através do ISP, não de computador, mas eu quero usar AVR como mestre:
AVR (ATmega32) <== ISP ==> AT89SMASTER ................................................. ....... SLAVE...................................................... AT89SATMEGA32
................................................. ..... AT89SMOSI | <----------------------------------------> | MOSI
MISO | <----------------------------------------> | MISO
CLK | <------------------------------------------> | CLKo que devo fazer, tenho de enviar os dados habilitado, mas eu nunca o responsável.Alguém pode me ajudar

 
Oi,
Você tem que colocar S51 no modo de reinicialização.Selecione um relógio SCK mais lento do que 1 / 16 ª relógio S51.Mantenha SCK baixo por pelo menos 64 ciclos de relógio antes de emitir os comandos.E modo de usar 0 mestre SPI.Acho que com estes, você deve ser capaz de S51 programa.

Atenciosamente,
LaktronicsAdicionado após 2 horas 33 minutos:Oi,
Também utilizar MSB lógica primeiro.
Atenciosamente,
Laktronics

 
por sugest seu, eu fiz essa fonte.meu relógio ATmega32 é 4Mhz e AT89s 16Mhz para que eu possa usar 1Mhz relógio de transferência (1 / 16 clock at89s).reset está situado na posição elevada.

# include
# include
# include
# include <avr/pgmspace.h>
# include <avr/io.h>
# include <avr/interrupt.h># include "global.h"
# include "lcd.h"

# define SPI_USEINT

targetInit (int);
targetClear (void);
spiTransferByte uint8_t (dados uint8_t);
voláteis U08 spiTransferComplete;
spiInit (void);int main (void)
(

# ifdef SPI_USEINT
SIGNAL (SIG_SPI)
(
spiTransferComplete = TRUE;
)
# endiflcd_init (LCD_DISP_ON);
spiInit ();
start:
if (targetInit! ())
(
lcd_gotoxy (0,1);
lcd_puts ( "Target Error");delay1s ();
break;
)
diferente
(
lcd_clrscr ();
lcd_puts (ok "alvo");
)

targetClear ();
_delay_ms (100);
spiTransferByte (0xAA); / / escreve 0xAA ao alvo
)
targetInit (int)
(
spiTransferByte (0xac); / / envia primeiro byte
spiTransferByte (0x53); / / envia segundo byte
spiTransferByte (0); / / envia 3 byte
if (spiTransferByte (0) == 105) / / o responsável deve ser 105 decimal ou hexadecimal 69
(
return (1);
)
diferente
(
return (0);
)
)

targetClear (void)
(
spiTransferByte (0xac); instrução de destino / clear
spiTransferByte (0x80);
spiTransferByte (0);
spiTransferByte (0);
)
spiTransferByte uint8_t (dados uint8_t)
(

# ifdef SPI_USEINT

spiTransferComplete = FALSE;
outb (SPDR, data); / / enviar dados

while (! spiTransferComplete);
# else

outb (SPDR, data); / / enviar dados

while (! (INB (SPSR) & (1 <<SPIF))); / / esperar até terminar
# endif

INB retorno (SPDR); / / obter os dados de retorno
)spiInit (void)
(sbi (PORTB, 7); / / set oi SCK
sbi (DDRB, 7); / / set SCK como saída
CBI (DDRB, 6); / / set MISO como entrada
sbi (DDRB, 5); / / set MOSI como saída
sbi (DDRB, 4); / / SS deve ser a saída para o modo Master para trabalhar/ / Interface de configuração do SPI:

sbi (SPCR, MSTR); modo mestre /

CBI (SPCR, SPR0); / clock = f / 4 ------> 4 / 4 = 1MHz
CBI (SPCR, SPR1);

CBI (SPCR, DORD); / / MSB primeiro

sbi (SPCR, SPE); / / enable SPI
INB (SPSR);/ / Enable SPI interromper

sbi (SPCR, SPIE);

)

Mas eu nunca obter a resposta.ou programe o meu código está errado?.Eu uso LCD 16x2 como uma exposição e WinAVR como compilador.

 
Oi,
1.Como você coloca 89S51 no modo de reinicialização?
2.Como você está configuração Mode0 Em SPI?
3.Você definiu SCK alto para começar, no modo de zero, estado ocioso da fundação tem que ser baixa
Depois de colocar S51 em reset, você tem que Wailt por cerca de 64 ciclos de relógio da CPU antes de dar comandos.Lamento, não será capaz de ajudá-lo com a codificação.

Atenciosamente,
Laktronics

 
Ah, sim, esse é o meu código antigo.esta a uma nova:

CBI (PORTB, 7); / / set SCK baixo
sbi (DDRB, 7); / / set SCK como saída
CBI (DDRB, 6); / / set MISO como entrada
sbi (DDRB, 5); / / set MOSI como saída
sbi (DDRB, 4); / / SS deve ser a saída para o modo Master para trabalhar/ / Interface de configuração do SPI:

sbi (SPCR, MSTR); modo mestre /
CBI (SPCR, SPR0); / clock = f / 4 ------> 4 / 4 = 1MHz
CBI (SPCR, SPR1);
CBI (SPCR, CPHA); modo transmision / 0
CBI (SPCR, CPOL);
CBI (SPCR, DORD); / / MSB primeiro
sbi (SPCR, SPE); / / enable SPI
INB (SPSR);
sbi (SPCR, SPIE); / / enable SPI interromper

que o código de inicialização SPI, respondendo à sua pergunta:

1.Eu coloquei o AT89s sempre em reposição, a partir do pino biginning reset está ligado a VCC, placa coz o projeto apenas para programação externa assim que eu penso que não é um problema.

2.0 modo SPI, defini a CPHA e CPOL registo por zero.

3.sim mostrar meu primeiro código que eu coloquei o sck ao alto, isso é erro meu.

pela forma como eu mesmo já corrigir o código, eu não obter a resposta.
meu amigo sugest me usar Eu ordinária / coz O porto da lógica tranfser usando apenas peneirar registar, e nós fazemos este código:

spi_transfer uint8_t (dados uint8_t)
(
unsigned char tempa, tempB, temp1, temp2, contagem;
unsigned char data_transmit, data_recieve, recebidas;

data_transmit = 0;
data_recieve = 7; / / MSB primeiro
received = 0;
tempa = 0;
tempB = 0;
temp1 = 0;
temp2 = 0;

CBI (DDRD, 0); / / set PORTD0 como entrada miso
sbi (DDRD, 1); / / set PORTD1 como saída mosi
sbi (DDRD, 2); / / set PORTD2 como SCK
CBI (PORTD, 2); / / set SCK baixo

for (count = 8; count> 0; count -)
(
dados tempa =;
tempB = (Tempa <<data_transmit);
if ((tempB) & 0x80 == 80)
(

sbi (PORTD, 1);

)
diferente
(

CBI (PORTD, 1);

)

sbi (PORTD, 2); / / sck alta

delay_ms (50); / / aguardar algumas vezes

CBI (PORTD, 2); / / sck baixo

temp1 = PIND; / / get a bit resposta
temp1 = temp1 &0x01;
temp2 = (temp1 <data_recieve <);
receber = temp2 | temp1;

data_transmit ;
data_recieved -;
)

receber retorno;
)

e quando eu enviar os dados que eu não permitiram obter a resposta também.O que devo fazer?existe alguém poderia me ajudar com algum código, coz stil i newbie aqui ...

 
freakkaito

atmega 32 pinos portuários pullups mais forte.Acho 89s não tem poder de puxar para baixo please check it out

Nandhu

 
Oi,
Em seu código, você tem que pegar MISO pouco quando relógio é alto.Por favor, veja abaixo um código SPI sugerido.Você deve ser capaz de cuidar de todos os requisitos de codificação.Eu não sou uma fonte segura de códigos.

spi_transfer uchar (dados uchar)
(

/ / Alterar as definições seguintes bit como por exigências de seu compilador
miso sbit = (PORTD, 0);
Mosi sbit = (PORTD, 1);
SCK sbit = (PORTD, 2);
CBI (DDRD, 0); / / set PORTD0 como entrada miso
sbi (DDRD, 1); / / set PORTD1 como saída mosi
sbi (DDRD, 2); / / set PORTD2 como SCK
CBI (PORTD, 2); / / set SCK baixo
unsigned char count;

for (count = 8; count> 0; count -)
(
If (data & 0x80)
MOSI = 1;
Diferente
MOSI = 0;
dados <<1;
SCK = 1;
delay ();
If (miso)
dados dados = 1;
SCK = 0;
)
return data;
)

Atenciosamente,
Laktronics

 
freakkaito escreveu:

hey bro, eu quero um programa at89s através do ISP, não de computador, mas eu quero usar AVR como mestre:AVR (ATmega32) <== ISP ==> AT89SMASTER ................................................. ....... SLAVE

...................................................... AT89S

ATMEGA32
................................................. ..... AT89SMOSI | <----------------------------------------> | MOSI

MISO | <----------------------------------------> | MISO

CLK | <------------------------------------------> | CLKo que devo fazer, tenho de enviar os dados habilitado, mas eu nunca o responsável.
Alguém pode me ajudar
 
Thank you guys very much, você realmente me ajudar neste momento.Vou tentar consertar a minha fonte e usar fonte Laktronics, espero que ela possa funcionar.

e para ctownsend, eu já tenho o código, não muito grande com ASSEMBLEIA mas agradeço muito a esse projeto realmente grande.

Deseje-me sorte ok!

 
hey guys, I did it !!!!!!Recebo a resposta ....

Laktronics muito obrigado, estou certo que você tem que ler o pino miso quando o relógio continua a ser elevado.

horeeeee

 
Oi,
Obrigado pelo feedback e parabéns.Você pode agora tentar a programação do chip.

Atenciosamente,
Laktronics

 

Welcome to EDABoard.com

Sponsor

Back
Top