Stránka 1 z 2

termostat displej na pind

Napsal: 17 srp 2014, 21:38
od SimonHosa
Dobrí večer stále riešim môj termostat a ,už ho skoro mám LCD som napojil podla schémy http://svetelektro.com/clanky/programuj ... t-459.html potom som upravil program na voltmeter http://svetelektro.com/clanky/programuj ... t-472.html a stále ukazovalo 500C°.pretože prevodník je na pinc toto je ten program:

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <stdio.h>
#include "lcd.h"
#include "lcd.c"


#define LCD_LINES 2
#define LCD_DISP_LENGTH 16
#define LCD_LINE_LENGTH 0x40
#define LCD_START_LINE1 0x00
#define LCD_START_LINE2 0x40
#define LCD_START_LINE3 0x14
#define LCD_START_LINE4 0x54
#define LCD_WRAP_LINES 0

#define LCD_PORT PORTD
#define LCD_DATA0_PORT LCD_PORT
#define LCD_DATA1_PORT LCD_PORT
#define LCD_DATA2_PORT LCD_PORT
#define LCD_DATA3_PORT LCD_PORT
#define LCD_DATA0_PIN 3
#define LCD_DATA1_PIN 2
#define LCD_DATA2_PIN 1
#define LCD_DATA3_PIN 0
#define LCD_RS_PORT PORTD
#define LCD_RS_PIN 5
#define LCD_E_PORT PORTD
#define LCD_E_PIN 4


unsigned int Read_ADC(unsigned char channel){

// vloz cislo kanala, vymaskuj nepouzite bity
ADMUX &= 0xF0;
ADMUX |= channel & 0x0F;

// start conversion
ADCSRA |= (1 << ADSC);

// cakaj na priznak skoncenia konverzie
while(!(ADCSRA & (1<<ADIF)));

// navratova hodnota - vysledok ad prevodu
return ADC;

}

int main(){

char text[32];
unsigned int T,adc;

ADMUX |= (1 << REFS0); //referencia 5V

// povolenie AD prevodnika, Interrupt flag, preddelicka 128 pri frekvencii hodin 8MHz
ADCSRA |= (1 << ADEN) | (1 << ADIF) | (1 <<ADPS2) | (1 <<ADPS1) | (1 <<ADPS0);

sei(); // povol globalne prerusenia

lcd_init(LCD_DISP_ON);

while(1){

adc = Read_ADC(0);
// vypocet napatia v mV
T = ((long)adc*5000/1024/10);

sprintf(text,"Teplota: \n%dC*",T);
lcd_clrscr();
lcd_gotoxy(0,0);
lcd_puts(text);

_delay_ms(500);

}

}

pri tamtom programe Na displeji mi ukazuje PPPPPPPPPPPPPPPP
PPPPPPPPPPPPPPPP

pri programe:

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <stdio.h>
#include "lcd.h"
#include "lcd.c"




unsigned int Read_ADC(unsigned char channel){

// vloz cislo kanala, vymaskuj nepouzite bity
ADMUX &= 0xF0;
ADMUX |= channel & 0x0F;

// start conversion
ADCSRA |= (1 << ADSC);

// cakaj na priznak skoncenia konverzie
while(!(ADCSRA & (1<<ADIF)));

// navratova hodnota - vysledok ad prevodu
return ADC;

}

int main(){

char text[32];
unsigned int T,adc;

ADMUX |= (1 << REFS0); //referencia 5V

// povolenie AD prevodnika, Interrupt flag, preddelicka 128 pri frekvencii hodin 8MHz
ADCSRA |= (1 << ADEN) | (1 << ADIF) | (1 <<ADPS2) | (1 <<ADPS1) | (1 <<ADPS0);

sei(); // povol globalne prerusenia

lcd_init(LCD_DISP_ON);

while(1){

adc = Read_ADC(0);
// vypocet napatia v mV
T = ((long)adc*5000/1024/10);

sprintf(text,"Teplota: \n%dC*",T);
lcd_clrscr();
lcd_gotoxy(0,0);
lcd_puts(text);

_delay_ms(500);

}

}

to ide ale nemôžem napojit čidlo a stále ukazuje 499c° ,lebo do pc0 nejde čidlo ale DB7 prosím o radu čo mám zle??

Napsal: 17 srp 2014, 22:49
od frpr666
pokud program nefunguje jak má, potom je třeba jej zjednodušit, odzkoušet, a tak najít chybu.
Samotný výpis na displej ti funguje?

Kód: Vybrat vše

int main() {

  char text[32];
  unsigned int T,adc;

  lcd_init(LCD_DISP_ON);

  T = 111;

  sprintf(text,"Teplota: %dC",T);
  lcd_clrscr();
  lcd_gotoxy(0,0);
  lcd_puts(text);

  while(1)
    {};
}

Napsal: 18 srp 2014, 11:40
od FHonza
V první řadě uzemni vývody displeje DB0 až DB3, dost řadičů bez toho nefunguje.

to ide ale nemôžem napojit čidlo a stále ukazuje 499c° ,lebo do pc0 nejde čidlo ale DB7


Jestli se řídíš tímto schematem, tak tomu nerozumím. Tam je displej připojen na PORTD. Podle toho musíš upravit i soubor lcd.h takto:

Kód: Vybrat vše

#define LCD_PORT         PORTD        /**< port for the LCD lines   */
#define LCD_DATA0_PORT   LCD_PORT     /**< port for 4bit data bit 0 */
#define LCD_DATA1_PORT   LCD_PORT     /**< port for 4bit data bit 1 */
#define LCD_DATA2_PORT   LCD_PORT     /**< port for 4bit data bit 2 */
#define LCD_DATA3_PORT   LCD_PORT     /**< port for 4bit data bit 3 */
#define LCD_DATA0_PIN    2            /**< pin for 4bit data bit 0  */
#define LCD_DATA1_PIN    3            /**< pin for 4bit data bit 1  */
#define LCD_DATA2_PIN    4            /**< pin for 4bit data bit 2  */
#define LCD_DATA3_PIN    5            /**< pin for 4bit data bit 3  */
#define LCD_RS_PORT      PORTD        /**< port for RS line         */
#define LCD_RS_PIN       0            /**< pin  for RS line         */
#define LCD_E_PORT       PORTD        /**< port for Enable line     */
#define LCD_E_PIN        1            /**< pin  for Enable line     */

Napsal: 18 srp 2014, 15:02
od SimonHosa
radič funguje aj vypisovanie funguje ale pinc 0 ide na display a zároven z neho aj prevodník číta,takže tam mám 500C° mne treba previest displej z pinouc na pinid a to mi nejde odfotím vám čo to ukazuje momentík.

Napsal: 18 srp 2014, 15:09
od FHonza
No vždyť sem ti to psal o příspěvek výš, přehoď displej na PORTD. V odkazu co jsi posílal, je připojen právě na PORTD. Když použiješ zapojení dle toho schématu, tak jenom upravíš soubor lcd.h tak, jak jsem psal výše. Nic složitého na tom není. A logicky nemůžeš mít připojený displej i čidlo na stejný pin. No a protože jenom PORTC se zároveň dá použít jako vstup A/D, tak musíš přesunout displej.

Napsal: 18 srp 2014, 15:20
od SimonHosa
ja viem že ho musím posunút ale tie definície nefungujú tu je foto http://dpssimonhosa.blogspot.sk/

Napsal: 18 srp 2014, 15:27
od FHonza
Nahraj sem schéma tvého zapojení, jinak se ničeho nedobereme.

Napsal: 18 srp 2014, 15:36
od SimonHosa
Napálil som program:


#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <stdio.h>
#include "lcd.h"
#include "lcd.c"

#define LCD_PORT PORTD /**< port for the LCD lines */
#define LCD_DATA0_PORT LCD_PORT /**< port for 4bit data bit 0 */
#define LCD_DATA1_PORT LCD_PORT /**< port for 4bit data bit 1 */
#define LCD_DATA2_PORT LCD_PORT /**< port for 4bit data bit 2 */
#define LCD_DATA3_PORT LCD_PORT /**< port for 4bit data bit 3 */
#define LCD_DATA0_PIN 2 /**< pin for 4bit data bit 0 */
#define LCD_DATA1_PIN 3 /**< pin for 4bit data bit 1 */
#define LCD_DATA2_PIN 4 /**< pin for 4bit data bit 2 */
#define LCD_DATA3_PIN 5 /**< pin for 4bit data bit 3 */
#define LCD_RS_PORT PORTD /**< port for RS line */
#define LCD_RS_PIN 0 /**< pin for RS line */
#define LCD_E_PORT PORTD /**< port for Enable line */
#define LCD_E_PIN 1 /**< pin for Enable line */






unsigned int Read_ADC(unsigned char channel){

// vloz cislo kanala, vymaskuj nepouzite bity
ADMUX &= 0xF0;
ADMUX |= channel & 0x0F;

// start conversion
ADCSRA |= (1 << ADSC);

// cakaj na priznak skoncenia konverzie
while(!(ADCSRA & (1<<ADIF)));

// navratova hodnota - vysledok ad prevodu
return ADC;

}

int main(){

char text[32];
unsigned int T,adc;

ADMUX |= (1 << REFS0); //referencia 5V

// povolenie AD prevodnika, Interrupt flag, preddelicka 128 pri frekvencii hodin 8MHz
ADCSRA |= (1 << ADEN) | (1 << ADIF) | (1 <<ADPS2) | (1 <<ADPS1) | (1 <<ADPS0);

sei(); // povol globalne prerusenia

lcd_init(LCD_DISP_ON);

while(1){

adc = Read_ADC(0);
// vypocet napatia v mV
T = ((long)adc*5000/1024/10);

sprintf(text,"Teplota: \n%dC*",T);
lcd_clrscr();
lcd_gotoxy(0,0);
lcd_puts(text);

_delay_ms(500);

}

}


A stále ukazuje na pinc

SCHÉMA:
Obrázek

Napsal: 18 srp 2014, 15:41
od FHonza
Co ukazuje na pinc ? Netuším co tím myslíš. A jak sem psal, nahraj sem svoje schema.

Napsal: 18 srp 2014, 15:42
od SimonHosa
No ,že displej ide stále na pinochc a na pinochd nie.Striedam 2 zapojenia to hore mam stale a ked displej nejde tak skúsim toto Obrázek

Napsal: 18 srp 2014, 15:48
od FHonza
A přepsal si soubor lcd.h nebo ty definice máš v hlavním programu ? A jestli v hlavním programu, tak jsi koukal na varování co ti překladač vypisuje ?

Napsal: 18 srp 2014, 15:51
od SimonHosa
Hodil som to do hlavného a boli tam varovania.

Napsal: 18 srp 2014, 15:57
od FHonza
No a sme u toho. Ty varování tam nejsou jen tak... Tím, že máš nejdříve uvedeno

Kód: Vybrat vše

#include "lcd.h"

tak se konstanty LCD_xxx definují dle souboru lcd.h. A další definici překladač ignoruje s varováním, že takové konstanty jsou již definovány. Proto jsem ti psal
musíš upravit i soubor lcd.h


A ještě doplním, kvůli tomu soubory *.h existují. Pro každý projekt máš dle zapojení různý lcd.h, ale jenom jeden společný lcd.c.

Napsal: 18 srp 2014, 16:06
od SimonHosa
takže to čo si napísal mam dat do začiatku lcd.h a za #include .... v hlavnom programe??

Napsal: 18 srp 2014, 16:13
od FHonza
V tom lcd.h to nějak je. A to změň podle toho, jak sem ti psal. Ty konstanty LCD_xxx definují na který pin a který port jsou připojeny jednotlivé vývody displeje. Je to uvedeno i v komentářích.