termostat displej na pind

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
SimonHosa
Příspěvky: 107
Registrován: 22 črc 2014, 00:00
Bydliště: Spišský Štiavnik
Kontaktovat uživatele:

termostat displej na pind

#1 Příspěvek 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??
Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 00:00

#2 Příspěvek 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)
    {};
}
Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 00:00
Bydliště: Praha

#3 Příspěvek 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     */
Uživatelský avatar
SimonHosa
Příspěvky: 107
Registrován: 22 črc 2014, 00:00
Bydliště: Spišský Štiavnik
Kontaktovat uživatele:

#4 Příspěvek 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.
Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 00:00
Bydliště: Praha

#5 Příspěvek 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.
Uživatelský avatar
SimonHosa
Příspěvky: 107
Registrován: 22 črc 2014, 00:00
Bydliště: Spišský Štiavnik
Kontaktovat uživatele:

#6 Příspěvek od SimonHosa »

ja viem že ho musím posunút ale tie definície nefungujú tu je foto http://dpssimonhosa.blogspot.sk/
Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 00:00
Bydliště: Praha

#7 Příspěvek od FHonza »

Nahraj sem schéma tvého zapojení, jinak se ničeho nedobereme.
Uživatelský avatar
SimonHosa
Příspěvky: 107
Registrován: 22 črc 2014, 00:00
Bydliště: Spišský Štiavnik
Kontaktovat uživatele:

#8 Příspěvek 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
Naposledy upravil(a) SimonHosa dne 18 srp 2014, 15:41, celkem upraveno 1 x.
Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 00:00
Bydliště: Praha

#9 Příspěvek od FHonza »

Co ukazuje na pinc ? Netuším co tím myslíš. A jak sem psal, nahraj sem svoje schema.
Uživatelský avatar
SimonHosa
Příspěvky: 107
Registrován: 22 črc 2014, 00:00
Bydliště: Spišský Štiavnik
Kontaktovat uživatele:

#10 Příspěvek 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
Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 00:00
Bydliště: Praha

#11 Příspěvek 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 ?
Uživatelský avatar
SimonHosa
Příspěvky: 107
Registrován: 22 črc 2014, 00:00
Bydliště: Spišský Štiavnik
Kontaktovat uživatele:

#12 Příspěvek od SimonHosa »

Hodil som to do hlavného a boli tam varovania.
Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 00:00
Bydliště: Praha

#13 Příspěvek 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.
Uživatelský avatar
SimonHosa
Příspěvky: 107
Registrován: 22 črc 2014, 00:00
Bydliště: Spišský Štiavnik
Kontaktovat uživatele:

#14 Příspěvek od SimonHosa »

takže to čo si napísal mam dat do začiatku lcd.h a za #include .... v hlavnom programe??
Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 00:00
Bydliště: Praha

#15 Příspěvek 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.
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“