Witam,
Mógłby ktoś sprawdzić, gdzie jest błąd?
W pamięci EEPROM program zapisuje same zera.
Czujnik podpięty do portu PD5. 5V - 5V, GND - GND, wyjście - PD5, między 5V a wyjściem sygnałowym rezystor 3,2kOhm.
Mógłby ktoś sprawdzić, gdzie jest błąd?
W pamięci EEPROM program zapisuje same zera.
Czujnik podpięty do portu PD5. 5V - 5V, GND - GND, wyjście - PD5, między 5V a wyjściem sygnałowym rezystor 3,2kOhm.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <string.h>
#include <avr/signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <inttypes.h>
#include <util/delay.h>
#define f_CPU 8000000UL
////////////////////eeprom////////////////////////////////
//inicjalizacja
int p_i=0, pomiar_t=0;
uint8_t eeprom_val[512] __attribute__((section(".eeprom")));
//funkcja zapisu do pamieci eeprom
void zapisz(uint8_t pozycja, uint8_t wartosc ) {
uint8_t uiStatusSREG = SREG;
cli();
eeprom_busy_wait();
eeprom_write_byte(&eeprom_val[pozycja],wartosc);
SREG|=uiStatusSREG&0x80;
}
//funkcja odczytu z pamieci eeprom
char odczyt(uint8_t pozycja) {
eeprom_busy_wait();
return eeprom_read_byte(&eeprom_val[pozycja]);
}
////////////////////termometr////////////////////////////////
#define WE 5 //czujnik podłączony do portu D pin 5
#define PORT_1WIRE PIND
#define CLEAR_1WIRE DDRD |= _BV(WE)
#define SET_1WIRE DDRD &= ~_BV(WE)
char buf[8];
////////////////////////////////////termometr//////////////////////////
void owire_delay(unsigned int __count)
{
__asm__ volatile (
"1: sbiw %0,1" "\n\t"
"brne 1b"
: "=w" (__count)
: "0" (__count)
);
}
// reset magistrali
unsigned char RESET_PULSE(void)
{
unsigned char PRESENCE;
CLEAR_1WIRE;
owire_delay(1920);
SET_1WIRE;
owire_delay(120);
if (bit_is_clear(PORT_1WIRE, WE)) {PRESENCE=1;} else {PRESENCE=0;}
owire_delay(1920);
if (bit_is_set(PORT_1WIRE, WE)) {PRESENCE=1;} else {PRESENCE=0;}
return PRESENCE;
}
void send(char bit)
{
//cli();
CLEAR_1WIRE;
owire_delay(20);
if(bit==1)
SET_1WIRE;
owire_delay(320);
SET_1WIRE;
//sei();
}
unsigned char read(void)
{
unsigned char PRESENCE=0;
//cli();
CLEAR_1WIRE;
owire_delay(8);
SET_1WIRE;
owire_delay(60);
if (bit_is_set(PORT_1WIRE, WE)) PRESENCE=1; else PRESENCE=0;
return (PRESENCE);
//sei();
}
unsigned send_byte(char wartosc)
{
unsigned char i;
unsigned char pom;
for (i=0; i<8; i++)
{
pom = wartosc>>i;
pom &= 0x01;
send(pom);
}
owire_delay(400);
}
unsigned char read_byte(void)
{
unsigned char i;
unsigned char wartosc = 0;
for (i=0; i<8; i++)
{
if(read()) wartosc|=0x01<<i;
owire_delay(60);
}
return (wartosc);
}
char *tp=" ";
int main (void)
{
////////////////////inicjalizacja_diody_i_przekaznika////////////////
DDRB = _BV(4)|_BV(5);
unsigned char sprawdz;
char temp1=0, temp2=0;
for(;;) {
sprawdz=RESET_PULSE();
if (sprawdz == 1)
{
send_byte(0xCC);
send_byte(0x44);
owire_delay(3000);
sprawdz = RESET_PULSE();
send_byte(0xCC);
send_byte(0xBE);
temp1=read_byte();
temp2=read_byte();
sprawdz=RESET_PULSE();
float temp=0;
temp=(float)(temp1+(temp2*256))/16;
dtostrf(temp,1,1,buf);
pomiar_t = atoi (buf);
//int pomiar_t = (int) buf;
if (pomiar_t>28) PORTB = 0b11101111;
zapisz( p_i, pomiar_t );
p_i++;
if (p_i>100) p_i=0;
}
}