Witam serdecznie - jestem początkujący i próbuję uruchomić termometr na atmedze8
Atmega ma podłączony wyświetlacz alfanumeryczny 2x16 znaków
DS podłączony normalnie - nie pasożytniczo
pisząc program opierałem się na:
http://ds5.agh.edu.pl/~czaro/naukowo/avr_1wire.htm
oraz chwilkę później ponieważ pierwsze rozwiązanie nie działało:
http://www.elportal.pl/forum/viewtopic.php?p=58414
to bardzo podobne rozwiązanie - które podobnie nie działa:
Próbowałem wiele konfiguracji i metod - nigdy nie uzyskałem odpowiedzi z DS
(Proszę się nie śmiać z mojego programu to mój czwarty pod uC)
Próbowałem zmieniać fusy - taktować zewnętrznym kwarcem 8MHz 2MHz wewnętrznym 1MHz nie mam koncepcji co mogę robić nie tak - na co powinienem zwócić uwagę.
Wiem że _delay_ms(); nie powinno przekraczać 262,14ms/MHz ale wszyscy tak robią i im działa (może się mylę ale tak widzę przeglądając choćby elektrode)
Będę wdzięczny za każdą pomoc
Atmega ma podłączony wyświetlacz alfanumeryczny 2x16 znaków
DS podłączony normalnie - nie pasożytniczo
pisząc program opierałem się na:
http://ds5.agh.edu.pl/~czaro/naukowo/avr_1wire.htm
oraz chwilkę później ponieważ pierwsze rozwiązanie nie działało:
http://www.elportal.pl/forum/viewtopic.php?p=58414
to bardzo podobne rozwiązanie - które podobnie nie działa:
Próbowałem wiele konfiguracji i metod - nigdy nie uzyskałem odpowiedzi z DS
(Proszę się nie śmiać z mojego programu to mój czwarty pod uC)
Cytat://-------------------------------------------------------------------------------------------------
// Wyświetlacz alfanumeryczny ze sterownikiem HD44780 oraz termometrem DS18B20
// Sterowanie w trybie 4-bitowym bez odczytu flagi zajętości
//-------------------------------------------------------------------------------------------------
#include "HD44780.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <inttypes.h>
//#include "daley.c"
#define f_CPU 1000000
int x = 0;
int y = 0;
#include <util/delay.h>
//-------------------------------------------------------------------------------------------------
//
// Funkcja wystawiająca półbajt na magistralę danych
//
//-------------------------------------------------------------------------------------------------
void _LCD_OutNibble(unsigned char nibbleToWrite)
{
if(nibbleToWrite & 0x01)
LCD_DB4_PORT |= LCD_DB4;
else
LCD_DB4_PORT &= ~LCD_DB4;
if(nibbleToWrite & 0x02)
LCD_DB5_PORT |= LCD_DB5;
else
LCD_DB5_PORT &= ~LCD_DB5;
if(nibbleToWrite & 0x04)
LCD_DB6_PORT |= LCD_DB6;
else
LCD_DB6_PORT &= ~LCD_DB6;
if(nibbleToWrite & 0x08)
LCD_DB7_PORT |= LCD_DB7;
else
LCD_DB7_PORT &= ~LCD_DB7;
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja zapisu bajtu do wyświetacza (bez rozróżnienia instrukcja/dane).
//
//-------------------------------------------------------------------------------------------------
void _LCD_Write(unsigned char dataToWrite)
{
LCD_E_PORT |= LCD_E;
_LCD_OutNibble(dataToWrite >> 4);
LCD_E_PORT &= ~LCD_E;
LCD_E_PORT |= LCD_E;
_LCD_OutNibble(dataToWrite);
LCD_E_PORT &= ~LCD_E;
_delay_us(50);
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja zapisu rozkazu do wyświetlacza
//
//-------------------------------------------------------------------------------------------------
void LCD_WriteCommand(unsigned char commandToWrite)
{
LCD_RS_PORT &= ~LCD_RS;
_LCD_Write(commandToWrite);
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja zapisu danych do pamięci wyświetlacza
//
//-------------------------------------------------------------------------------------------------
void LCD_WriteData(unsigned char dataToWrite)
{
LCD_RS_PORT |= LCD_RS;
_LCD_Write(dataToWrite);
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja wyświetlenia napisu na wyswietlaczu.
//
//-------------------------------------------------------------------------------------------------
void LCD_WriteText(char * text)
{
while(*text)
LCD_WriteData(*text++);
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja ustawienia współrzędnych ekranowych
//
//-------------------------------------------------------------------------------------------------
void LCD_GoTo(unsigned char x, unsigned char y)
{
LCD_WriteCommand(HD44780_DDRAM_SET | (x + (0x40 * y)));
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja czyszczenia ekranu wyświetlacza.
//
//-------------------------------------------------------------------------------------------------
void LCD_Clear(void)
{
LCD_WriteCommand(HD44780_CLEAR);
_delay_ms(2);
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja przywrócenia początkowych współrzędnych wyświetlacza.
//
//-------------------------------------------------------------------------------------------------
void LCD_Home(void)
{
LCD_WriteCommand(HD44780_HOME);
_delay_ms(2);
}
//-------------------------------------------------------------------------------------------------
//
// Procedura inicjalizacji kontrolera HD44780.
//
//-------------------------------------------------------------------------------------------------
void LCD_Initalize(void)
{
unsigned char i;
LCD_DB4_DIR |= LCD_DB4; // Konfiguracja kierunku pracy wyprowadzeń
LCD_DB5_DIR |= LCD_DB5; //
LCD_DB6_DIR |= LCD_DB6; //
LCD_DB7_DIR |= LCD_DB7; //
LCD_E_DIR |= LCD_E; //
LCD_RS_DIR |= LCD_RS; //
_delay_ms(15); //15 oczekiwanie na ustalibizowanie się napiecia zasilajacego
LCD_RS_PORT &= ~LCD_RS; // wyzerowanie linii RS
LCD_E_PORT &= ~LCD_E; // wyzerowanie linii E
for(i = 0; i < 3; i++) // trzykrotne powtórzenie bloku instrukcji
{
LCD_E_PORT |= LCD_E; // E = 1
_LCD_OutNibble(0x03); // tryb 8-bitowy
LCD_E_PORT &= ~LCD_E; // E = 0
_delay_ms(5); // czekaj 5ms
}
LCD_E_PORT |= LCD_E; // E = 1
_LCD_OutNibble(0x02); // tryb 4-bitowy
LCD_E_PORT &= ~LCD_E; // E = 0
_delay_ms(1); // czekaj 1ms
LCD_WriteCommand(HD44780_FUNCTION_SET | HD44780_FONT5x7 | HD44780_TWO_LINE | HD44780_4_BIT); // interfejs 4-bity, 2-linie, znak 5x7
LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_OFF); // wyłączenie wyswietlacza
LCD_WriteCommand(HD44780_CLEAR); // czyszczenie zawartosći pamieci DDRAM
_delay_ms(2);
LCD_WriteCommand(HD44780_ENTRY_MODE | HD44780_EM_SHIFT_CURSOR | HD44780_EM_INCREMENT);// inkrementaja adresu i przesuwanie kursora
LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_ON | HD44780_CURSOR_OFF | HD44780_CURSOR_NOBLINK); // włącz LCD, bez kursora i mrugania
}
//-------------------------------------------------------------------------------------------------
//
// Koniec pliku HD44780.c
//
//-------------------------------------------------------------------------------------------------
//////////////POCZĄTEK TERMOMETRU //////////////////////////////////////////////////
#define WE 1
#define PORT_1WIRE PIND
#define CLEAR_1WIRE DDRD&=~_BV(WE)
#define SET_1WIRE DDRD|=_BV(WE)
char buf[8];
// reset magistrali
unsigned char RESET_PULSE(void)
{
unsigned char PRESENCE;
CLEAR_1WIRE;
_delay_us(500);
SET_1WIRE;
_delay_us(30);
if (bit_is_clear(PORT_1WIRE, WE)) PRESENCE=1; else PRESENCE=0;
_delay_us(470);
if (bit_is_set(PORT_1WIRE, WE)) PRESENCE=1; else PRESENCE=0;
return PRESENCE;
}
void send(char bit)
{
CLEAR_1WIRE;
_delay_us(5);
if(bit==1)
SET_1WIRE;
_delay_us(80);
SET_1WIRE;
}
unsigned char read(void)
{
unsigned char PRESENCE=0;
CLEAR_1WIRE;
_delay_us(2);
SET_1WIRE;
_delay_us(15);
if (bit_is_set(PORT_1WIRE, WE)) PRESENCE=1; else PRESENCE=0;
return (PRESENCE);
}
unsigned send_byte(char wartosc)
{
unsigned char i;
unsigned char pom;
for (i=0; i<8; i++)
{
pom = wartosc>>i;
pom &= 0x01;
send(pom);
}
_delay_us(100);
}
unsigned char read_byte(void)
{
unsigned char i;
unsigned char wartosc = 0;
for (i=0; i<8; i++)
{
if(read()) wartosc|=0x01<<i;
_delay_us(15);
}
return (wartosc);
}
int main (void)
{
unsigned char sprawdz;
char temp1=0, temp2=0;
//inicjalizacja wyświetlacza
LCD_Initalize();
LCD_Clear();
LCD_Home();
_delay_ms(100);
LCD_WriteText("Init LCD- ok");
_delay_ms(400);
LCD_Clear();
for(;{
sprawdz=RESET_PULSE();
if (sprawdz == 1)
{
send_byte(0xCC);
send_byte(0x44);
_delay_ms(750);
sprawdz=RESET_PULSE();
send_byte(0xCC);
send_byte(0x44);
temp1=read_byte();
temp2=read_byte();
sprawdz=RESET_PULSE();
float temp=0;
temp=(float)(temp1+(temp2*256))/16;
dtostrf(temp,1,1,buf);
LCD_Clear();
LCD_WriteText(buf);
_delay_ms(200);
}
else
{
LCD_Clear();
LCD_WriteText("Brak pomiaru");
_delay_ms(300);
}
}
}
*/
Próbowałem zmieniać fusy - taktować zewnętrznym kwarcem 8MHz 2MHz wewnętrznym 1MHz nie mam koncepcji co mogę robić nie tak - na co powinienem zwócić uwagę.
Wiem że _delay_ms(); nie powinno przekraczać 262,14ms/MHz ale wszyscy tak robią i im działa (może się mylę ale tak widzę przeglądając choćby elektrode)
Będę wdzięczny za każdą pomoc
