Witam,
pracuję nad czujnikiem temperatury do silnika pewnej maszyny. Mam dwa problemy.
1. Czy istnieje sensor temperatury typu DS18B20 (1-wire) o zakresie do 200 C ?
2. Czy istnieje możliwość wyeliminowania mrugania czterech wyświetlaczy 7seg ? Jak to zrealizować w C ? Wyświetlacze gasną podczas wykonywania pomiaru temperatury przez DS18B20. Zmontowałem wyświetlacze z tranzystorami na płytce stykowej i wyświetlam na nich liczby w sposób dynamiczny (dzieki temu zamiast 32 pinów wykorzystuje tylko 12, ale pojawia się problem gaśnięcia).
Już teraz mruganie rzuca się w oczy, a w momencie dołożenia obsługi klawiatury (czas oczekiwania na zaprzestanie drgań styków) problem stanie się jescze bardziej uciążliwy.
Czytałem coś o rejestrze i obsłudze przerwań, ale jestem początkujący i nie mam zielonego pojęcia, jak to zrealizować na mikrokontrolerze.
Kod programu:
pracuję nad czujnikiem temperatury do silnika pewnej maszyny. Mam dwa problemy.
1. Czy istnieje sensor temperatury typu DS18B20 (1-wire) o zakresie do 200 C ?
2. Czy istnieje możliwość wyeliminowania mrugania czterech wyświetlaczy 7seg ? Jak to zrealizować w C ? Wyświetlacze gasną podczas wykonywania pomiaru temperatury przez DS18B20. Zmontowałem wyświetlacze z tranzystorami na płytce stykowej i wyświetlam na nich liczby w sposób dynamiczny (dzieki temu zamiast 32 pinów wykorzystuje tylko 12, ale pojawia się problem gaśnięcia).
Już teraz mruganie rzuca się w oczy, a w momencie dołożenia obsługi klawiatury (czas oczekiwania na zaprzestanie drgań styków) problem stanie się jescze bardziej uciążliwy.
Czytałem coś o rejestrze i obsłudze przerwań, ale jestem początkujący i nie mam zielonego pojęcia, jak to zrealizować na mikrokontrolerze.
Kod programu:
/*
Plik "main.c"
*/
#define F_CPU 1000000UL // 1 MHz
#include <stdio.h>
#include <avr/io.h>
#include <util/delay.h>
#include "ds18b20.h"
void delay_ms(int ms)
{
volatile long unsigned int i;
for(i=0;i<ms;i++)
_delay_ms(1);
}
int main(void)
{
/* Zmienna przechowuje aktualną wartość temperatury */
double temp;
/* W tablicy zapisywane będą dane odczytane z układu ds18b20 */
unsigned char ds18b20_pad[9];
//char waz[] = { 0x04, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f };
// 0 1 2 3 4 5 6 7 8 9
char liczba[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
//char liczba[] = {0xf3, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
char liczbaK[] = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10};
char wys[]= {0xfe, 0xfd, 0xfb, 0xf7};
PORTA=0xFF;
DDRA=0xFF;
PORTB=0xFF;
DDRB=0xFF;
int wynik=0;
int zapis[4];
while(1)
{
/* 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 ;
}
wynik=temp*10;
zapis[0]=wynik/1000; //tysiace
zapis[1]=(wynik-(zapis[0]*1000))/100; //setki
zapis[2]=(wynik-(zapis[0]*1000)-(zapis[1]*100))/10; //dziesiatki
zapis[3]=wynik%10; //jednosci
for(int i=0;i<200;i++)
{
for(int j=0;j<4;j++)// wyswietlacze
{
if(j==0) // wyswietlacz pierwszy
{
PORTB=wys[0];
PORTA=liczba[zapis[0]];
delay_ms(1);
PORTA=0xff;
PORTB=0xff;
}
if(j==1) // wyswietlacz drugi
{
PORTB=wys[1];
PORTA=liczba[zapis[1]];
delay_ms(1);
PORTA=0xff;
PORTB=0xff;
}
if(j==2) // wyswietlacz trzeci
{
PORTB=wys[2];
PORTA=liczbaK[zapis[2]];
delay_ms(1);
PORTA=0xff;
PORTB=0xff;
}
if(j==3) // wyswietlacz czwarty
{
PORTB=wys[3];
PORTA=liczba[zapis[3]];
delay_ms(1);
PORTA=0xff;
PORTB=0xff;
}
}
}
}
}