Перейти к содержанию
    

IVN2013

Участник
  • Постов

    27
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о IVN2013

  • Звание
    Участник
    Участник
  1. Работа с PIC 18F46K20

    Всем спасибо! Все же оказалось что сжег ногу. К пику на аналогичном устройстве подключился через сделанный переходник. По поводу источника данных - я брал из даташита приложенного к сообщению(там на титульном написано для каких моделей), хотя может что и напутал. PIC18F24K20_I_SO.rar
  2. Работа с PIC 18F46K20

    Да, имел в виду ICD2 ). Absolute Maximum Ratings Vpp по даташиту у него даже до 12.5 В. А минималка Vpp даже VDD + 1.5. Скорее всего не сжег, т.к. его работоспособность проверена через управление по 232му порту. Насколько понял, то cженным mclr он бы уже не работал? Вот и думаю в чем может быть дело. Гляну еще раз форму сигнала осциллографом. Если найду, то попробую pickit. Кстати при 12 В он тоже не читался, хотя по тому что показывал MPLAB там было где то чуть меньше 11В.
  3. Работа с PIC 18F46K20

    Доброго времени суток! Появилась необходимость работы с пиками. Программатор IDE2, среда - MPLAB 7-я. Не получается прочитать ID pic18F46K20 i/pt, на плате и соответственно работать с ним. Другая модель пика была успешно прочитана. После изучения даташита на него, было выяснено что особенность данной модели - это напряжение на ноге MCLR/Vpp не 12V, а до 9V (имеется переходник и в продаже). Был спаян переходник на стабилитроне и резисторе понижающий напряжение от программатора до 8.2V, но ID так и не получается считать. Есть ли какие идеи что может быть не так? Может еще какие особенности имеются)? Заранее спасибо!
  4. Нечто подобное уже сделал, еще оформлю в виде библиотеки. void writefram(int address, unsigned char *buff) { unsigned char i;//счетчик unsigned char addressh= address >> 8; //старший байт адреса unsigned char addressl = address; //младший байт адреса //send PORTB &= ~0b00010000; // chip select >> 0 SPI_MasterTransmit(0b00000110);//wren PORTB |= 0b00010000; // chip select >> 1 PORTB &= ~0b00010000; // chip select >> 0 SPI_MasterTransmit(0b00000010); //write SPI_MasterTransmit(addressh); //address SPI_MasterTransmit(addressl); //address for (i=0;i<sizeof(buff);i++) { SPI_MasterTransmit(buff[i]); } PORTB |= 0b00010000; // chip select >> 1 ///////////////////////////////////////////////////// } void readfram(int address, unsigned char *readdata) { unsigned char i;//счетчик unsigned char addressh= address >> 8;//старший байт адреса unsigned char addressl = address; //младший байт адреса PORTB &= ~0b00010000; // chip select >> 0 SPI_MasterTransmit(0b00000011); //read SPI_MasterTransmit(addressh); //address SPI_MasterTransmit(addressl); //address for (i=0;i<10;i++) { SPI_MasterTransmit(0xff);//отправляем чтобы шли такты на sck *readdata= SPDR; //считываем данные c MISO readdata++; } PORTB |= 0b00010000; // chip select >> 1 ///////////////////////////////////////////////////// } ну а в мэйне: unsigned char readdata2[10]; unsigned char buf1[10]; writefram(0x0000, buf1); readfram(0x0000, (unsigned char*) readdata2); Только начал применять указатели и вот хотел спросить - правильно ли я в процедурах их применяю (заметил разницу с вышеописанными- я инкрементирую readdata ++, а в примере выше инкрементируется в соответствующем месте с * ). И еще когда добавил использование sizeof в процедуре записи, то при считывании обнаружил заполнение 2-х байтов нулями, там где недолжно быть, хотя может и не в sizeof дело.
  5. Да, теперь начальное в "1".
  6. Спасибо! Попробую читать без WREN.
  7. Большое спасибо так и сделал, заработало. Wren "оформил" одтельным чип селектом и все остальное тоже отдельным получилось так: //запись: PORTB &= ~0b00010000; SPI_MasterTransmit(0b00000110);//wren PORTB |= 0b00010000; PORTB &= ~0b00010000; SPI_MasterTransmit(0b00000010); //write SPI_MasterTransmit(0b00000000); //address SPI_MasterTransmit(0b00000011); //address SPI_MasterTransmit(0b01011100); //data SPI_MasterTransmit(0b00001111); //data SPI_MasterTransmit(0b11110000); //data PORTB |= 0b00010000; //считывание: PORTB &= ~0b00010000; SPI_MasterTransmit(0b00000110); //wren PORTB |= 0b00010000; PORTB &= ~0b00010000; SPI_MasterTransmit(0b00000011); //read SPI_MasterTransmit(0b00000000); //address SPI_MasterTransmit(0b00000011); //address // PORTB |= 0b01000000; SPI_MasterTransmit(0xff); readdata= SPDR;// while(!(SPSR & (1<<SPIF))); SPI_MasterTransmit(0xff); readdata1= SPDR; SPI_MasterTransmit(0xff); readdata2= SPDR; PORTB |= 0b00010000; P.S. :модераторам - тему случайно продублировал, удаляйте если нужно одну из двух
  8. Большое спасибо так и сделал, заработало. Wren "оформил" одтельным чип селектом и все остальное тоже отдельным получилось так: //запись: PORTB &= ~0b00010000; SPI_MasterTransmit(0b00000110);//wren PORTB |= 0b00010000; PORTB &= ~0b00010000; SPI_MasterTransmit(0b00000010); //write SPI_MasterTransmit(0b00000000); //address SPI_MasterTransmit(0b00000011); //address SPI_MasterTransmit(0b01011100); //data SPI_MasterTransmit(0b00001111); //data SPI_MasterTransmit(0b11110000); //data PORTB |= 0b00010000; //считывание: PORTB &= ~0b00010000; SPI_MasterTransmit(0b00000110); //wren PORTB |= 0b00010000; PORTB &= ~0b00010000; SPI_MasterTransmit(0b00000011); //read SPI_MasterTransmit(0b00000000); //address SPI_MasterTransmit(0b00000011); //address // PORTB |= 0b01000000; SPI_MasterTransmit(0xff); readdata= SPDR;// while(!(SPSR & (1<<SPIF))); SPI_MasterTransmit(0xff); readdata1= SPDR; SPI_MasterTransmit(0xff); readdata2= SPDR; PORTB |= 0b00010000; P.S. :модераторам - тему случайно продублировал, удаляйте если нужно одну из двух
  9. Доброго времени суток! Начал осваивать работу с FRAM FM25CL64B. Контроллер -AVR mega16, копмилятор Написал тестовую программу записи / считывания (при отправке на mega16 по USART любого байта пишу и считываю). Только вот приходят одни нули. На MISO FRAM - низкий уровень, в то время как осуществляю чтение. Выкладываю код программки, может кто что подскажет. Заранее спасибо! #include <iom16v.h> #include <macros.h> #include <eeprom.h> #include <string.h> #pragma interrupt_handler UART_RX_interrupt:12 #define ToggleBit(x, bit) (x^=(1<<bit)) static volatile unsigned char readdata=0x00; static volatile unsigned char readdata1=0x00; static volatile unsigned char readdata2=0x00; void InitUART(void) { UBRRL = 0X03; // baud rate = 115200 UBRRH = 0x00; UCSRA = 0x00; UCSRB = (1<<RXEN)|(1<<TXEN); UCSRC = (3<<UCSZ0)|(0<<USBS)|(1<<URSEL); /* Set frame format: 8data, 1stop bit */ UCSRC = (1<<URSEL)|0x06; } void SPI_MasterInit(void) { /* Set MOSI, chip select and SCK (clock) output, MISO - input */ DDRB |= (1<<PB7)|(0<<PB6)|(1<<PB5)|(1<<PB4); PORTB |= 0b01000000; // подтягиваем пин входа /* Enable SPI, Master, set clock rate fck/16 */ SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0); //SPI Enable, SCK frequency = fosc/16 //SPCR |=(0x0C); } void SPI_MasterTransmit(unsigned char cData) { /* Start transmission */ SPDR = cData; /* Wait for transmission complete */ while(!(SPSR & (1<<SPIF))); } void UART_RX_interrupt( void ) { // отправляю данные PORTB &= ~0b00010000; // chip select в 0 SPI_MasterTransmit(0b00000110);//wren SPI_MasterTransmit(0b00000010); //write SPI_MasterTransmit(0b00000011); //address SPI_MasterTransmit(0b00000011); //address SPI_MasterTransmit(0b01011100); //data SPI_MasterTransmit(0b00001111); //data SPI_MasterTransmit(0b11110000); //data PORTB |= 0b00010000; // chip select в 1 //////////////////////////////////////////// // считываю PORTB &= ~0b00010000; // chip select в 0 SPI_MasterTransmit(0b00000110); //wren SPI_MasterTransmit(0b00000011); //read SPI_MasterTransmit(0b00000011); //address SPI_MasterTransmit(0b00000011); //address //SPCR |=(0x0C); SPI_MasterTransmit(0xff); // бросаем данные чтобы генерировались такты на sck readdata= SPDR;// // считываю данные SPI_MasterTransmit(0xff); readdata1= SPDR; SPI_MasterTransmit(0xff); readdata2= SPDR; PORTB |= 0b00010000; // chip select в 1 ///////////////////////////////////////////////////////////////// while(!( UCSRA & (1 << UDRE))); UDR = readdata; //передаю на PC по USART while(!( UCSRA & (1 << UDRE))); UDR = readdata1; while(!( UCSRA & (1 << UDRE))); UDR = readdata2; ToggleBit(DDRC,7); //мигаю диодом } void main(void) { SPI_MasterInit(); InitUART(); UCSRB |= (1<<RXCIE); // enable UART interrupts while(1) { SEI(); } }
  10. Доброго времени суток! Начал осваивать работу с FRAM FM25CL64B. Контроллер -AVR mega16, копмилятор Написал тестовую программу записи / считывания (при отправке на mega16 по USART любого байта пишу и считываю). Только вот приходят одни нули. На MISO FRAM - низкий уровень, в то время как осуществляю чтение. Выкладываю код программки, может кто что подскажет. Заранее спасибо! #include <iom16v.h> #include <macros.h> #include <eeprom.h> #include <string.h> #pragma interrupt_handler UART_RX_interrupt:12 #define ToggleBit(x, bit) (x^=(1<<bit)) static volatile unsigned char readdata=0x00; static volatile unsigned char readdata1=0x00; static volatile unsigned char readdata2=0x00; void InitUART(void) { UBRRL = 0X03; // baud rate = 115200 UBRRH = 0x00; UCSRA = 0x00; UCSRB = (1<<RXEN)|(1<<TXEN); UCSRC = (3<<UCSZ0)|(0<<USBS)|(1<<URSEL); /* Set frame format: 8data, 1stop bit */ UCSRC = (1<<URSEL)|0x06; } void SPI_MasterInit(void) { /* Set MOSI, chip select and SCK (clock) output, MISO - input */ DDRB |= (1<<PB7)|(0<<PB6)|(1<<PB5)|(1<<PB4); PORTB |= 0b01000000; // подтягиваем пин входа /* Enable SPI, Master, set clock rate fck/16 */ SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0); //SPI Enable, SCK frequency = fosc/16 //SPCR |=(0x0C); } void SPI_MasterTransmit(unsigned char cData) { /* Start transmission */ SPDR = cData; /* Wait for transmission complete */ while(!(SPSR & (1<<SPIF))); } void UART_RX_interrupt( void ) { // отправляю данные PORTB &= ~0b00010000; // chip select в 0 SPI_MasterTransmit(0b00000110);//wren SPI_MasterTransmit(0b00000010); //write SPI_MasterTransmit(0b00000011); //address SPI_MasterTransmit(0b00000011); //address SPI_MasterTransmit(0b01011100); //data SPI_MasterTransmit(0b00001111); //data SPI_MasterTransmit(0b11110000); //data PORTB |= 0b00010000; // chip select в 1 //////////////////////////////////////////// // считываю PORTB &= ~0b00010000; // chip select в 0 SPI_MasterTransmit(0b00000110); //wren SPI_MasterTransmit(0b00000011); //read SPI_MasterTransmit(0b00000011); //address SPI_MasterTransmit(0b00000011); //address //SPCR |=(0x0C); SPI_MasterTransmit(0xff); // бросаем данные чтобы генерировались такты на sck readdata= SPDR;// // считываю данные SPI_MasterTransmit(0xff); readdata1= SPDR; SPI_MasterTransmit(0xff); readdata2= SPDR; PORTB |= 0b00010000; // chip select в 1 ///////////////////////////////////////////////////////////////// while(!( UCSRA & (1 << UDRE))); UDR = readdata; //передаю на PC по USART while(!( UCSRA & (1 << UDRE))); UDR = readdata1; while(!( UCSRA & (1 << UDRE))); UDR = readdata2; ToggleBit(DDRC,7); //мигаю диодом } void main(void) { SPI_MasterInit(); InitUART(); UCSRB |= (1<<RXCIE); // enable UART interrupts while(1) { SEI(); } }
  11. Доброго времени суток! Начал осваивать работу с FRAM FM25CL64B. Контроллер -AVR mega16, копмилятор Написал тестовую программу записи / считывания (при отправке на mega16 по USART любого байта пишу и считываю). Только вот приходят одни нули. На MISO FRAM - низкий уровень, в то время как осуществляю чтение. Выкладываю код программки, может кто что подскажет. Заранее спасибо! #include <iom16v.h> #include <macros.h> #include <eeprom.h> #include <string.h> #pragma interrupt_handler UART_RX_interrupt:12 #define ToggleBit(x, bit) (x^=(1<<bit)) static volatile unsigned char readdata=0x00; static volatile unsigned char readdata1=0x00; static volatile unsigned char readdata2=0x00; void InitUART(void) { UBRRL = 0X03; // baud rate = 115200 UBRRH = 0x00; UCSRA = 0x00; UCSRB = (1<<RXEN)|(1<<TXEN); UCSRC = (3<<UCSZ0)|(0<<USBS)|(1<<URSEL); /* Set frame format: 8data, 1stop bit */ UCSRC = (1<<URSEL)|0x06; } void SPI_MasterInit(void) { /* Set MOSI, chip select and SCK (clock) output, MISO - input */ DDRB |= (1<<PB7)|(0<<PB6)|(1<<PB5)|(1<<PB4); PORTB |= 0b01000000; // подтягиваем пин входа /* Enable SPI, Master, set clock rate fck/16 */ SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0); //SPI Enable, SCK frequency = fosc/16 //SPCR |=(0x0C); } void SPI_MasterTransmit(unsigned char cData) { /* Start transmission */ SPDR = cData; /* Wait for transmission complete */ while(!(SPSR & (1<<SPIF))); } void UART_RX_interrupt( void ) { // отправляю данные PORTB &= ~0b00010000; // chip select в 0 SPI_MasterTransmit(0b00000110);//wren SPI_MasterTransmit(0b00000010); //write SPI_MasterTransmit(0b00000011); //address SPI_MasterTransmit(0b00000011); //address SPI_MasterTransmit(0b01011100); //data SPI_MasterTransmit(0b00001111); //data SPI_MasterTransmit(0b11110000); //data PORTB |= 0b00010000; // chip select в 1 //////////////////////////////////////////// // считываю PORTB &= ~0b00010000; // chip select в 0 SPI_MasterTransmit(0b00000110); //wren SPI_MasterTransmit(0b00000011); //read SPI_MasterTransmit(0b00000011); //address SPI_MasterTransmit(0b00000011); //address //SPCR |=(0x0C); SPI_MasterTransmit(0xff); // бросаем данные чтобы генерировались такты на sck readdata= SPDR;// // считываю данные SPI_MasterTransmit(0xff); readdata1= SPDR; SPI_MasterTransmit(0xff); readdata2= SPDR; PORTB |= 0b00010000; // chip select в 1 ///////////////////////////////////////////////////////////////// while(!( UCSRA & (1 << UDRE))); UDR = readdata; //передаю на PC по USART while(!( UCSRA & (1 << UDRE))); UDR = readdata1; while(!( UCSRA & (1 << UDRE))); UDR = readdata2; ToggleBit(DDRC,7); //мигаю диодом } void main(void) { SPI_MasterInit(); InitUART(); UCSRB |= (1<<RXCIE); // enable UART interrupts while(1) { SEI(); } }
  12. Спасибо, но это вряд ли, т.к. пробовал и с остановом (TCCR1B = 0x00; //stop timer )в процедуре прерывания.
  13. Доброго времени суток! Пишу программу на mega16, компилятор image craft. На ножку таймера T1 извне подается меандр с периодом в 10 мс. Нужно чтобы прерывание таймера (по совпадению) срабатывало по каждому переднему фронту приходящего сигнала. Столкнулся с проблемой: прерывание по таймеру(по совпадению) срабатывает через раз(по одному фронту есть, по следующему нет , потом опять есть) или вообще беспорядочно. Повторил код в отдельной программе - результат тоже. Использую 16-разрядный timer1. А нужно чтобы оно по каждому переднему фронту было. А вот и куски кода связанные с таймером: #pragma interrupt_handler timer1_COMPB:8 - объявляю прерывание по совпадению void timer1_init(void) - инициализирую таймер { TIMSK |= 0x08;//флаг OCIE1B в 1 Timer/Counter1, Output Compare B Match Interrupt Enable TCCR1B = 0x00; //stop timer TCNT1 = 0x00; //set count value OCR1B = 0x01; TCCR1B = 0x07; //start timer External clock source on T1 pin. Clock on rising edge- 0x07 Clock on falling edge- 0x06 } void timer1_COMPB(void) - обработчик прерывания { TCNT1 = 0x00; //set count value TCCR1B = 0x07; //start timer External clock source on T1 pin. Clock on rising edge- 0x07 Clock on falling edge- 0x06 ... ... ... } void main( void ) { timer1_init(void); ... ... ... } Подскажите из - за чего может быть такой результат. Спасибо!
  14. Доброго всем времени! Недавно писал бутлоадер для mega128 в atmel studio 6, на AVR GCC (еще доработать нужно). Сейчас начал пробовать тоже самое переделать для mega16. Столкнулся с тем, что выскакивает ошибка, в которых сообщается что данный процессор контроллера не поддерживается библиотекой boot.h, функции из которой использовал ранее. Посоветуйте что в данном случае можно предпринять? Как то отредактировать эту библиотеку? Или найти другую? Или еще что? Заранее спасибо!
×
×
  • Создать...