mikroC rutina pro LCD s řadičem HDD44780 přip. k PIC16F628A

Zdravím
Už se dlouho trápím a nemohu rozběhnout na oic16f628A z interními hodinami 4 MHz a LCD 2x16 a program napsaný v mikroC prosil bych schéma zapojení a program v mikroC velice moc díky

:arrow_right: administrator: přejmenováno z "PIC16F628A a LCD"

To spíš ty sem dej tvoje schéma a již napsaný kód…

To je příklad a zapojení z nápovědy k mikroC PRO for PIC a potřebuji to předělat na PIC16F628A a není mi jasný zdroj hodin díky za pomoc


// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections

char txt1] = "mikroElektronika";    
char txt2] = "EasyPIC6";
char txt3] = "Lcd4bit";
char txt4] = "example";

char i;                              // Loop variable

void Move_Delay() {                  // Function used for text moving
  Delay_ms(500);                     // You can change the moving speed here
}

void main(){
  ANSEL  = 0;                        // Configure AN pins as digital I/O
  ANSELH = 0;
  C1ON_bit = 0;                      // Disable comparators
  C2ON_bit = 0;

  Lcd_Init();                        // Initialize LCD

  Lcd_Cmd(_LCD_CLEAR);               // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
  Lcd_Out(1,6,txt3);                 // Write text in first row

  Lcd_Out(2,6,txt4);                 // Write text in second row
  Delay_ms(2000);
  Lcd_Cmd(_LCD_CLEAR);               // Clear display

  Lcd_Out(1,1,txt1);                 // Write text in first row
  Lcd_Out(2,5,txt2);                 // Write text in second row

  Delay_ms(2000);

  // Moving text
  for(i=0; i<4; i++) {               // Move text to the right 4 times
    Lcd_Cmd(_LCD_SHIFT_RIGHT);
    Move_Delay();
  }

  while(1) {                         // Endless loop
    for(i=0; i<8; i++) {             // Move text to the left 7 times
      Lcd_Cmd(_LCD_SHIFT_LEFT);
      Move_Delay();
    }

    for(i=0; i<8; i++) {             // Move text to the right 7 times
      Lcd_Cmd(_LCD_SHIFT_RIGHT);
      Move_Delay();
    }
  }
}

schema0.JPG

nastav interny oscilator v poistkach a neries…

Založ v microC nový projekt pomoci “Wizard”, nastav typ procesoru,frekvenci např. 4 MHz. Zkopíruj do editoru kód programu. Smaž příkazy ANSEL; ANSELH; C1ON_bit a C2ON_bit. Registry ANSEL a ANSELH PIC 16F628A nemá. Pokud nechceš použít komparátor, vlož příkaz CMCON = 0x07. Přelož projekt. Pokud se chceš podívat na konfikuraci procesoru, pak klikni “Project” a následně na “Edit poject”.

Zdravím
Už mě to funguje ale je to nestabilní musím mít přiložený prst na napájení na kladném pólu aby mě to fungovalo co tom chybí? díky

Chyby tomu snaha z tve strany neco sam vyresit ci najit odpoved ,
a co skusit osetrit MCLR nebo ho v pojistkach vypnout , kondik na napajeni a tak…

Už je to OK! chybělo tomu ošetření MCLR pinu díky

Zdravím
Zkouším příklad s teploměrem s DS18B20 z upravením kódem ta úprava v spočívá jen ve změně portu kde je připojeno čidlo a DS18B20 ve schématu je DS1820

[code]
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections

// Set TEMP_RESOLUTION to the corresponding resolution of used DS18x20 sensor:
// 18S20: 9 (default setting; can be 9,10,11,or 12)
// 18B20: 12
const unsigned short TEMP_RESOLUTION = 9;

char *text = “000.0000”;
unsigned temp;

void Display_Temperature(unsigned int temp2write) {
const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
char temp_whole;
unsigned int temp_fraction;

// Check if temperature is negative
if (temp2write & 0x8000) {
text[0] = ‘-’;
temp2write = ~temp2write + 1;
}

// Extract temp_whole
temp_whole = temp2write >> RES_SHIFT ;

// Convert temp_whole to characters
if (temp_whole/100)
text[0] = temp_whole/100 + 48;
else
text[0] = ‘0’;

text[1] = (temp_whole/10)%10 + 48; // Extract tens digit
text[2] = temp_whole%10 + 48; // Extract ones digit

// Extract temp_fraction and convert it to unsigned int
temp_fraction = temp2write << (4-RES_SHIFT);
temp_fraction &= 0x000F;
temp_fraction *= 625;

// Convert temp_fraction to characters
text[4] = temp_fraction/1000 + 48; // Extract thousands digit
text[5] = (temp_fraction/100)%10 + 48; // Extract hundreds digit
text[6] = (temp_fraction/10)%10 + 48; // Extract tens digit
text[7] = temp_fraction%10 + 48; // Extract ones digit

// Print temperature on LCD
Lcd_Out(2, 5, text);
}

void main() {
//ANSEL = 0; // Configure AN pins as digital I/O
//ANSELH = 0;
//C1ON_bit = 0; // Disable comparators
//C2ON_bit = 0;
CMCON = 0x07;
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
Lcd_Out(1, 1, " Temperature: ");
// Print degree character, ‘C’ for Centigrades
Lcd_Chr(2,13,223); // Different LCD displays have different char code for degree
// If you see greek alpha letter try typing 178 instead of 223

Lcd_Chr(2,14,‘C’);

//— Main loop
do {
//— Perform temperature reading
Ow_Reset(&PORTA, 2); // Onewire reset signal
Ow_Write(&PORTA, 2, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTA, 2, 0x44); // Issue command CONVERT_T
Delay_us(120);

Ow_Reset(&PORTA, 2);
Ow_Write(&PORTA, 2, 0xCC);                   // Issue command SKIP_ROM
Ow_Write(&PORTA, 2, 0xBE);                   // Issue command READ_SCRATCHPAD

temp =  Ow_Read(&PORTA, 2);
temp = (Ow_Read(&PORTA, 2) << 8) + temp;

//--- Format and display result on Lcd
Display_Temperature(temp);

Delay_ms(500);

} while (1);
}[/code]
a výsledek je na fotce kde je “zakopaný pudl” tentokrát ? díky
Teploměr.jpg
DS1820.JPG

pri prvom nacitani teploty sa nacita 85st nejake binarne cislo…co sluzi na kontrolu ze cidlo sprvane komunikuje…ak spustis prevod teploty a ked ten skonci mozes nacitat ur reealnu hodntu teploty, inak medzi tymi cidlami su iste rozdiely treba pozriet datasheety a tusim ze len medzi 18S20…

mam iste obavy ze za 120uS prebehne prevod v cidle …ale kedze neviem ako vyzera program ovladajuci oWIre… ani definovanie portov ta ksa ti na to musi pozriet niekto iny…

Tady ti dávám ASM a HEX jestli ti to pomůže díky
LCDDS1820.hex (5.43 KB)
LCDDS1820.asm (10.8 KB)

Samotný převod teploty trvá daleko déle, zkus nastavit instrukci Delay_us(120); na 1 sec.

nepomáhá to už jsem změnil taky

// Set TEMP_RESOLUTION to the corresponding resolution of used DS18x20 sensor:
// 18S20: 9 (default setting; can be 9,10,11,or 12)
// 18B20: 12!!
const unsigned short TEMP_RESOLUTION = 9; na 12!!

a výsledek = “015.9375’C”

:arrow_right: administrator: příspěvek byl upraven
Předchozí příspěvky se necitují.

12 bit jsi nastavil spravne, to je vychozi rozliseni DS18B20.

[code] Ow_Write(&PORTA, 2, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTA, 2, 0x44); // Issue command CONVERT_T
Delay_us(120);

zde by se melo pockat nez se provede prevod (min 750ms)

Ow_Reset(&PORTA, 2); 
Ow_Write(&PORTA, 2, 0xCC);                   // Issue command SKIP_ROM 
Ow_Write(&PORTA, 2, 0xBE);                   // Issue command READ_SCRATCHPAD[/code]

Tak jsem to pochopil z datasheetu a tak mi to funguje, jenze v assembleru.

Já tam čekám 1 sekundu a pořád nic

Pak bych hledal chybu v podprogramech
Ow_Write, Ow_Reset nebo Ow_Read

Ale já ty zdrojáky bohužel nemám a horko těžko je někde seženu! nevím jak je získat díky

Zdravím
Já jsem přišel na jednu věc že to bude asi vadné čidlo DS18B20 protože nebere si vůbec žádný proud v dataschetu jsem našel zmínku o 1.5mA a ještě jeden postřeh když odpojím napájecí napětí od čidla tak se nic neděje žádná změna!!díky

Změň deklaraci pro proměnnou temp na:

unsigned int temp;

Zkoušel jsem to jen v simulaci (Isis Proteus) a tam to po této změně funguje pro oba typy čidel.

Nezapomeň nastavit:
pro DS18B20 TEMP_RESOLUTION = 12;
pro DS12S20 TEMP_RESOLUTION = 9;

Dobu pro převod jsem měl nastavenu na: Delay_ms(800); původní hodnota Delay_us(120) což je málo, podle datasheetu by maximální doba převodu pro 12bit měla být 300ms.(Jiří Hrbáček,Komunikace mikrokontroléru s okolím 2)

Tak to by som pochyboval, ze to bude vadny senzor. Odber 1.5 mA je iba pocas samotneho prevodu - inak je minimalny. Ak si uz dokazal nacitat hodnotu 85 stupnov, tak komunikacia aj samotny prevod bude asi OK. Myslim ze tam skor chyba prikaz na odstartovanie prevodu. Program neviem posudit, ja sa hram iba s asemblerom.