Mam pytanie dotyczące łączenia instrukcji programów w całość .
Chodzi mi o to że robię sobie termometr w którym odczytam sobie temperaturę wewnętrzną ,zewnętrzną a także napięcie swojego akumulatora i czas,datę z układu DS1307.W jaki sposób połączyć kilka plików to ze sobą w sposób profesjonalny?
Czy wszystko ująć w jednej pętli "while"?.ale wtedy są opóźnienia w realizacji programu które nie są wpisane na początku pętli programowej.
Poniżej przedstawiam mój program w którym mam na początku komunikat powitalny potem odczyt temperatury i pomiar napięcia akumulatora proszę o poprawienie błędów w łączeniu instrukcji lub o inne cenne uwagi i przykłady poprawnego łączenia najlepiej na przykładzie mojego działającego main.c .
W przedstawionym poniżej programie mam podzielone na kawałki i wymieszane części programu na termometr i woltomierz bo nie wiedziałem jak mam to zrobić profesjonalnie.Proszę o cenne konkretne rady.
Zaloguj się, aby zobaczyć kod
/*
Plik main.c
KURS AVR-GCC cz.5
Wyswietlacz alfanumeryczny LCD HD44780
(schemat i opis dzialania w artykule)
uklad atmega16 (16MHz)
*/
#define F_CPU 16000000L
#define VREF 5.00
#define ADCIN PA1
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include "hd44780.h"
#include "ds18b20.h"
char str[17]="Temp zew";
int main(void)
{
DDRB = 0b11111101; // linie PB0,2,3,4,5,6,7 są wyjściami ,linia PB1 jest wejściem//
PORTB = 0b00001010; // podświetlenie LCD poprzez PB3//
/* Napisy przechowujemy w tablicach */
char str1[] = "SKODA";
char str2[] = " FABIA";
char str3[] = "HATCHBACK CLAS";
char str4[] = "U=";
//Komunikat powitalny//
/* Funkcja inicjalizuje wyswietlacz */
lcd_init();
// Wlacza wyswietlanie z widocznym kursorem
LCD_DISPLAY(LCDDISPLAY|LCDCURSOR);
//Ustawia kursor w pozycji:
//pierwszy wiersz, szosta kolumna
LCD_LOCATE(5,0);
// Wysyla do wyswietlacza jeden znak
LCD_WRITE_DATA('W');
_delay_ms(300);
LCD_WRITE_DATA('I');
_delay_ms(300);
LCD_WRITE_DATA('T');
_delay_ms(300);
LCD_WRITE_DATA('A');
_delay_ms(300);
LCD_WRITE_DATA('M');
_delay_ms(800);
// Ukrywa kursor
LCD_DISPLAY(LCDDISPLAY);
LCD_CLEAR;
LCD_LOCATE(2,0);
//Funkcja lcd_puts wysyla do
//wyswietlacza ciag znakow
lcd_puts(str1);
_delay_ms(1000);
lcd_puts(str2);
_delay_ms(1000);
LCD_LOCATE(1,1);
lcd_puts(str3);
_delay_ms(1000);
LCD_CLEAR;
LCD_LOCATE(0,0);
lcd_puts("Nr.Rejestracyjny");
_delay_ms(1000);
LCD_LOCATE(4,1);
lcd_puts("SRC 38YS ");
// Czeka 2.5 sek.
_delay_ms(1000);
// Czysci ekran
LCD_CLEAR;
//Woltomierz//
char wynik[]=" ";//bufor tekstowy, wyczyszczenie bufora
float adc;//zmienna do obliczeń napięcia
//Inicjalizacja ADC
ADCSRA = (1<<ADEN) //Bit 7 - ADEN: ADC Enable (uruchomienie przetwornika)
|(1<<ADPS0)
|(1<<ADPS1)
|(1<<ADPS2); //ADPS2:0: ADC Prescaler Select Bits
//(ustawienie preskalera) preskaler= 128
ADMUX = (1<<REFS0) //Bit 6 - REFS0:1: Reference Selection Bits
///VCC jako napięcie referencyjne with external
//capacitor at AREF pin
| (1<<MUX0); //Input Channel Selections (ADA1 - Pin 1 )
DDRA &=~ (1<<ADCIN); //Ustawienie Wejścia ADC
//Termometr//
/* Zmienna przechowuje aktualną wartość temperatury */
double temp;
/* W tablicy zapisywane będą dane odczytane z układu ds18b20 */
unsigned char ds18b20_pad[9];
/* Funkcja inicjalizuje wyświetlacz */
lcd_init();
/* Włącza wyświetlanie */
LCD_DISPLAY(LCDDISPLAY);
/* Czyści ekran */
LCD_CLEAR;
/* Wyświetla tytuł */
LCD_LOCATE(0,0);
lcd_puts(str);
while(1)
{
//Woltomierz//
ADCSRA |= (1<<ADSC);//ADSC: Uruchomienie pojedynczej konwersji
while(ADCSRA & (1<<ADSC));//czeka na zakończenie konwersji
adc=ADC*VREF/1024; //przeliczenie wartości na napięcie
sprintf(wynik,"%1.1fV",adc*3); //konwersja na łańcuch znakowy
LCD_LOCATE(9, 1);
lcd_puts(str4);
LCD_LOCATE(11, 1); //Ustawienie kursora w pozycji (1,1)
lcd_puts(wynik); //Wyświetlenie wyniku
_delay_ms(500); //opóźnienie
//Termometr//
/* Funkcja 'ds18b20_ConvertT' wysyła do układu ds18b20
polecenie pomiaru */
if(ds18b20_ConvertT())
{
/* 750ms - czas konwersji */
_delay_ms(750);
/* Odczyt z układu ds18b20, dane zapisywane są w tablicy ds18b20_pad.
Dwie pierwsze pozycje w tablicy to kolejno mniej znaczący bajt i bardziej
znaczący bajt wartość zmierzonej temperatury */
ds18b20_Read(ds18b20_pad);
/* Składa dwa bajty wyniku pomiaru w całość. Cztery pierwsze bity mniej
znaczącego bajtu to część ułamkowa wartości temperatury, więc całość
dzielona jest przez 16 */
temp = ((ds18b20_pad[1] << 8) + ds18b20_pad[0]) / 16.0 ;
/* Formułuje komunikat w tablicy 'str' */
sprintf(str,"%4.1f\xdf""C", temp);
LCD_LOCATE(9,0);
/* Wysyła komunikat do wyświetlacza */
lcd_puts(str);
}
}
}
Zaloguj się, aby zobaczyć kod