Witam wszystkich Forumowiczów!
Jestem uczniem 3 klasy technikum i już od pół roku zacząłem interesować się programowaniem uK. Pisałem w C bo to dla mnie prosty język. Ostatnio zadałem sobie problem (no dobra chcę zaszpanować przed kumplami
). Chcę zrobić dobory rejestrator temperatury w pokoju. Wybrałem sobie uK ATtiny 2313, układ DS1820 (czujka temperatury) i pamięć eeprom 24c04 do przechowywania wyników. Zakres temperatury miał być od 15 do 50C z krokiem 0,1C. I gdy zabrałem się za pisanie programu natrafiłem na kilka problemów Linia 1-wire jest chyba dobrze napisana, tylko wydaje mi się że coś nie hula zapis do pamięci. I kompletnie nie umiem poradzić sobie z przesłaniem tych danych do kompa.. Opis układu: Po wciśnięciu przycisku S1 rejestrator ma zacząć działać. Przerwanie (zbocze z układu NE555) budzi go z trybu idle (obniżony pobór mocy) i następuje obsługa linii 1-wire. Nie wiem czy dobrze zrealizowałem warunek końca (czyli ma zliczyć do 1440 (tyle pomiarów) i potem się wyłączy.. Po włączeniu przycisku S2 ma się dokonać przesłanie danych do komputera i tu już kompletnie nie wiem jak to zrobić… Może inny algorytm? Bardzo proszę o pomoc i wszelką poradę!!
Oto mój listning programu:
Tutaj zamieszczam swój schemat ideowy.
![Rejestrator temperatury [ATtiny2313][C] Rejestrator temperatury [ATtiny2313][C]](https://obrazki.elektroda.pl/59_1293664240_thumb.jpg)
Jestem uczniem 3 klasy technikum i już od pół roku zacząłem interesować się programowaniem uK. Pisałem w C bo to dla mnie prosty język. Ostatnio zadałem sobie problem (no dobra chcę zaszpanować przed kumplami
Oto mój listning programu:
#include <avr\io.h>
#include <stdio.h>
#include <inttypes.h>
#include <avr\delay.h>
#include <avr\interrupt.h>
#include <avr\sleep.h>
#include <avr/eeprom.h>
#define DQ 9
#define SET_DQ DDRD &= ~_BV(DQ)
#define CLR_DQ DDRD |= _BV(DQ)
#define IN_DQ PIND & _BV(DQ)
int i = 1; // zmienna sterujaca zapisaem do pamięci
char msb, lsb, temp;
float d1, d2;
// procedura opóźniająca o (5+5*t)* 0,25 us dla 4MHz kwarcu
void delay(unsigned char t)
{
do
{
asm("nop");
}while(--t);
}
// procedura reset
void ow_reset(void)
{
CLR_DQ; // stan niski na linii 1wire
delay(255); //
delay(119); // opóźnienie ok 480us
//delay(1);
SET_DQ;// stan wysoki na linii 1wire
delay(255); //
delay(119); // opóźnienie ok 480 us
}
// procedura zapisu bitu na linię 1wire
void ow_write_bit(char b)
{
cli(); // zablokowanie przerwań
CLR_DQ; // stan niski na linii 1wire
delay(7); // opóźnienie 10us
if(b)
SET_DQ; // jeśli parametr jest niezerowy to ustaw stan wysoki na linii
delay(80); // opóźnienie 100us
SET_DQ; // stan wysoki na linii 1wire
sei(); // odblokowanie pzrerwań
}
char ow_read_bit(void)
{
cli();
CLR_DQ;
delay(1);
SET_DQ;
delay(11);
sei();
if(IN_DQ)
return 1;
else
return 0;
}
unsigned char ow_read_byte(void)
{
unsigned char i;
unsigned char value = 0;
for (i=0;i<8;i++)
{
if(ow_read_bit()) value|=0x01<<i;
delay(6);
}
return(value);
}
void ow_write_byte(char val)
{
unsigned char i;
unsigned char temp;
for (i=0; i<8; i++)
{
temp = val >> i;
temp &= 0x01;
ow_write_bit(temp);
}
delay(5);
}
int main ()
{
//ustawienie wyjść portów
DDRD = 0x73;
PORTD = 0x77;
DDRB = 0xff;
PORTB = 0xff;
sei();
set_sleep_mode(SLEEP_MODE_IDLE); //tryb power-down gdyby tracił zawartość RAM czy można tryb Idle ( bity z 11 na 00)
int zakoncz = 1440; // ilość ileracji programu
//pobranie temperatur w doborym cyklu
while(zakoncz)
{
zakoncz--;
sleep_mode();
}
// wyłącznie całego układu
cli();
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_mode();
return (0);
}
ISR(SIGN_INT1)
{
ow_reset();
ow_write_byte(0xCC);
ow_write_byte(0x44);
_delay_ms(250);
_delay_ms(250);
_delay_ms(250);
ow_reset();
ow_write_byte(0xCC);
ow_write_byte(0xBE);
lsb = ow_read_byte();
msb = ow_read_byte();
lsb = lsb >> 4;
msb &= 0x07;
msb = msb << 4;
temp = lsb | msb;
d2 = temp / 10;
d1 = temp % 10;
eeprom_write_block(&d2,(0x04+&i), sizeof(&d2));
eeprom_write_block(&d1,(0x08+&i), sizeof(&d1)); //argumentem jest adres, a drugim dana, powinno więc bć eeprom_write_byte(&liczba_LED,1);,
i = i *4;
}
Tutaj zamieszczam swój schemat ideowy.
