AVR programowanie ISP

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
kaliska5
Użytkownik
Posty: 348
Rejestracja: 01 maja 2008, 8:24
Lokalizacja: z nienacka
Kontakt:

AVR programowanie ISP

Post autor: kaliska5 » 03 lut 2012, 19:56

Witam.Próbuje uruchomić procedurę programowania szeregowego w Atmega64 i nijak nie chce ruszyć.Korzystam ze źródeł USBasp.Korzystam z programowego SPI na porcie D.
isp.h:

Kod: Zaznacz cały

#define	ISP_OUT   PORTD
#define ISP_IN    PIND
#define ISP_DDR   DDRD
#define ISP_RST   PD5
#define ISP_MOSI  PD6
#define ISP_MISO  PD3
#define ISP_SCK   PD4
i prototypy funkcji
Plik isp.c wygląda tak:

Kod: Zaznacz cały

#include <avr/io.h>
#include "isp.h"
#include "clock.h"

uchar sck_sw_delay=100;
uchar sck_spcr;
uchar sck_spsr;




void ispDelay() {

	uint8_t starttime = TIMERVALUE;
	while ((uint8_t) (TIMERVALUE - starttime) < sck_sw_delay) {
	}
}

void ispConnect()
{
	DDRD = 0x00;
	ISP_DDR |= (1 << ISP_RST) | (1 << ISP_SCK) | (1 << ISP_MOSI);
	ISP_OUT &= ~(1 << ISP_RST); /* RST low */
	ISP_OUT &= ~(1 << ISP_SCK); /* SCK low */
	ispDelay();
	ISP_OUT |= (1 << ISP_RST); /* RST high */
	ispDelay();
	ISP_OUT &= ~(1 << ISP_RST); /* RST low */


	}


void ispDisconnect() {

	/* set all ISP pins inputs */
	ISP_DDR &= ~((1 << ISP_RST) | (1 << ISP_SCK) | (1 << ISP_MOSI));
	/* switch pullups off */
	ISP_OUT &= ~((1 << ISP_RST) | (1 << ISP_SCK) | (1 << ISP_MOSI));


}

uchar ispTransmit(uchar send_byte) {

	uchar rec_byte = 0;
	uchar i;
	for (i = 0; i < 8; i++) {

		/* set MSB to MOSI-pin */
		if ((send_byte & 0x80) != 0) {
			ISP_OUT |= (1 << ISP_MOSI); /* MOSI high */
		} else {
			ISP_OUT &= ~(1 << ISP_MOSI); /* MOSI low */
		}
		/* shift to next bit */
		send_byte = send_byte << 1;

		/* receive data */
		rec_byte = rec_byte << 1;
		if ((ISP_IN & (1 << ISP_MISO)) != 0) {
			rec_byte++;
		}

		/* pulse SCK */
		ISP_OUT |= (1 << ISP_SCK); /* SCK high */
		ispDelay();
		ISP_OUT &= ~(1 << ISP_SCK); /* SCK low */
		ispDelay();
	}
	return rec_byte;
}


uchar ispEnterProgrammingMode()
{
	uchar check;
	uchar count = 6;

	while (count--) {
		ispTransmit(0xAC);
		ispTransmit(0x53);
		check = ispTransmit(0);
                lcd_hex(check);
		ispTransmit(0);

		if (check == 0x53) {
			return 0;
		}


		/* pulse SCK */
		ISP_OUT |= (1 << ISP_SCK); /* SCK high */
		ispDelay();
		ISP_OUT &= ~(1 << ISP_SCK); /* SCK low */
		ispDelay();

	
		}



	return 1; /* error: device dosn't answer */
}
W głównym programie wywołuje najpierw

Kod: Zaznacz cały

ispConnect() 
jakasdana=ispEnterProgrammingMode
Cały czas otrzymuje w 3 bajcie 0xFF.Nie mogę użyć sprzętowego SPI ponieważ musiałbym robić nowa płytkę .Czy ktoś programował AVR tym sposobem i podzieliłby się spostrzeżeniami co robię źle ?

ODPOWIEDZ