Помогите пожалусто, задача состоит в том чтоб температуру и частоту записать во Fless at45db011, а потом всё это считать на комп. Теппература и Частота типа flot. Вы можите сказать что в интернете есть много описаний как это делать, но там всё написано под at45db161, у которой есть своя библиотека. Есть модель в Proteus и код CodeVision
#include <mega48p.h> #include <1wire.h> #include <alcd.h> #include <ds18b20.h> #include <stdlib.h> #include <delay.h> #include <stdio.h> #include <spi.h>
long int count1 = 0; // счётчик для 1-го колебательного контура long int count2 = 0; // счётчик для второго колебательного контура float freq1 = 0; // частота колебаний на 1-ом конденсаторе float freq2 = 0; // частота колебаний на 2-ом конденсаторе int var = 0; float N = 0; // количество снятых значений char s1[6]; // переменные char s2[6]; // для char s3[6]; // вывода char s4[6]; // на LCD float temp=0; // температура
void LCD_Write(void) // функция по работе с термо-датчиком { ftoa(N,0,s4); N = ++N; freq1 = count1 ; ftoa(freq1,0,s1); freq2 = count2/100 ; ftoa(freq2,0,s2); temp=ds18b20_temperature(0); ftoa(temp,1,s3); lcd_clear(); lcd_gotoxy(0,0); lcd_puts(s1); lcd_gotoxy(8,0); lcd_puts(s2); lcd_gotoxy(0,1); lcd_putsf("N="); lcd_puts(s4); lcd_gotoxy(8,1); lcd_putsf("T= "); lcd_puts(s3); OCR1AH=0x00; // OCR1AH=0xE1 OCR1AL=0xff; // OCR1AL=0xA3 var = 0; count1 = 0; count2 = 0;
}
// External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { count1 = ++count1; }
// External Interrupt 1 service routine interrupt [EXT_INT1] void ext_int1_isr(void) { count2 = ++count2; }
// Timer1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void) { if (var<2) // заменить на 17 { var=++var; } else { if (var == 2) // заменить на 17 { OCR1AH=0x00; // OCR1AH=0xE1 OCR1AL=0xff; // OCR1AL=0xA3 var=++var; } else { #asm("cli") LCD_Write(); #asm("sei") } } }
void main(void) { // Declare your local variables here
// Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif
// Input/Output Ports initialization // Port B initialization // Func7=In Func6=In Func5=Out Func4=In Func3=Out Func2=Out Func1=In Func0=In // State7=T State6=T State5=0 State4=T State3=0 State2=0 State1=T State0=T PORTB=0x00; DDRB=0x2C; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 11.719 kHz // Mode: CTC top=OCR1A // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: On // Compare B Match Interrupt: Off TCCR1B=0x0D; OCR1AH=0x00; // OCR1AH=0xE1 OCR1AL=0xFF; // OCR1AL=0xA3 // External Interrupt(s) initialization // INT0: On // INT0 Mode: Falling Edge // INT1: On // INT1 Mode: Falling Edge // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-14: Off // Interrupt on any change on pins PCINT16-23: Off EICRA=0x0A; EIMSK=0x03; EIFR=0x03; // Timer/Counter 1 Interrupt(s) initialization TIMSK1=0x02; // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART0 Mode: Asynchronous // USART Baud Rate: 4800 UCSR0A=0x00; UCSR0B=0x18; UCSR0C=0x06; UBRR0H=0x00; UBRR0L=0x9B; // SPI initialization // SPI Type: Master // SPI Clock Rate: 3000.000 kHz // SPI Clock Phase: Cycle Start // SPI Clock Polarity: Low // SPI Data Order: MSB First SPCR=0x50; SPSR=0x00; // 1 Wire Bus initialization // 1 Wire Data port: PORTD // 1 Wire Data bit: 4 // Note: 1 Wire port settings must be specified in the // Project|Configure|C Compiler|Libraries|1 Wire IDE menu. w1_init();
// Alphanumeric LCD initialization // Connections specified in the // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu: // RS - PORTC Bit 0 // RD - PORTC Bit 1 // EN - PORTC Bit 2 // D4 - PORTC Bit 3 // D5 - PORTC Bit 4 // D6 - PORTC Bit 5 // D7 - PORTB Bit 0 // Characters/line: 16 lcd_init(16);
ds18b20_init(0,-55,125,DS18B20_12BIT_RES); LCD_Write();
// Global enable interrupts #asm("sei")
while (1) {
} }
есть ещё одна проблема частота 12МГц, предполагается что считываемые частоты будут около 500 кгц, но программа правильно работает только до 75кГЦ. То что частоты в протеусе отображают щас не те значения это не страшно так как предполагаеться что я буду потсчитывать частоту раз в 100с, а чтоб убыстрить моделирование я этот интервал сократил приблизительно до 1 с. Мне надо записывать эти данные вat45db011. А потом потоком передать их компьютеру. Помогите, это первый мой проект(
Вложения: |
Комментарий к файлу: Моё устройство в Proteus и CodeVision
new.rar [115.15 KiB]
Скачиваний: 115
|
|