Sida 4 av 4

Postat: 3 maj 2008, 17:48:55
av Niklas-k
Jag får väl läsa för dig :D

"LCD4 is a stand-alone program that writes optimized 4-bit Mode Character LCD functions for mikroBasic, mikroPascal, & mikroC."

Postat: 3 maj 2008, 17:57:21
av squiz3r
Ojdå :D

Mjo, Det verkar ju faktiskt bli välldigt mycket kortare kod av det, men det är lika bra att ta och lära sig att göra det själv sen.. :)

Tack!

Postat: 3 maj 2008, 18:48:15
av squiz3r
Nu har jag bytt ut LCD rutinerna, men jag hittade ett stort problem!

För att omvandla en temperatur hade jag skrivit
temp = temp / 1.95;

Det kommandot tog 0,7k så efter det ändrade jag det till
temp = temp * 100;
temp = temp / 195;

vilket gjorde att det tog ca. 0,01k istället :)


Nu ska jag bara hitta en tabell med kommandona för en HD44780 display i hexformat.. :)
Mvh

Postat: 4 maj 2008, 00:41:31
av sodjan
> en tabell med kommandona för en HD44780 display i hexformat...

Jag tror inte att det finns någon sådan. De olika kommandona har ju
olika bitar som ska sättas som man vill ha det, och att göra en stor
HEX-tabell med alla möjliga kombinationer verkar lite onödigt.

Jag tycker fortfarande, även om de är lite gamla, att de två LCD
dokumenten på denna sida är ganska bra:
http://www.epemag.wimborne.co.uk/resources.htm

Postat: 4 maj 2008, 09:05:48
av Icecap
På min hemsida (under "Freebies") finns det ett datablad som beskriver kommunikationen med HD44780, alla kommandon, hur man initierar i 4 och 8 bit mode osv.

Postat: 4 maj 2008, 12:50:22
av squiz3r
"Nu ska jag bara hitta en tabell med kommandona för en HD44780 display i hexformat.."
Det var inte menat som en fråga, utan bara ett konstanterande. Första träffen på google var alldelles utmärkt :)

"Jag tror inte att det finns någon sådan."
Jag menade en sån tabell som finns på s. 86 (s. 3 enligt adobe) i LCD1.pdf som du länkade till.

"Jag tycker fortfarande, även om de är lite gamla.."
Jepp, jag håller med! Det var dem som lärde mig använda LCD i ASM.

--

Jag lyckas inte få igång LCD'n med den drivrutinen, så jag tror jag skiter i den och gör en egen..

Mvh. Daniel

Postat: 6 maj 2008, 18:50:17
av squiz3r
Nu har jag gjort om LCD mjukvaran, och nu fungerar det.

Men.. Jag har lite problem med ADC'n på 16F88'an. Det ser lite annorlunda ut med registrena där, men jag har lästa databladet flera gånger nu..

Hur jag än gör så får jag bara 0'or ur den.

En bit av min kod:

Kod: Markera allt

unsigned int adc_rd;	// ADC data
long tlong;	// Temperature 

..
..

  ANSEL =  0b00000100;
  ADCON0 = 0b11010000;
  ADCON1 = 0b10000000;                 // configure VDD as Vref, and analog channels
  TRISA =  0b00000100;                 

..
..

              ADCON0.F0 = 1;		// ADC module on.
              delay_ms(1);
              LED = 1;
              ADCON0.F2 = 1;                // ON/DONE = 1
              while (ADCON0.F2 = 1){}		// Wait for AD to finish
              adc_rd = ADRESH;			// Move ADC valure to adc_rd
              adc_rd << 8;
              adc_rd += ADRESL;
              
              tlong = (long)ADC_rd * 5000;           // covert adc reading to degrees C
              tlong = tlong / 1023;
              tlong = tlong - 400;                
              tlong = tlong * 100;
              tlong = tlong / 195;
              ADCON0.F0 = 0;		// Put of ADC module.
Är det någon som kan se något fel här? Jag kör på en 19,17000Mhz kristall och vill läsa från PORTA,2 dvs AN2.

Mvh.

Postat: 6 maj 2008, 22:59:10
av spaderkung
Med reservation för ringa kunskaper i uC och tråden i övrigt, men är inte detta en tilldelning?

while (ADCON0.F2 = 1){}

Postat: 6 maj 2008, 23:14:13
av sodjan
Kanske "while (ADCON0.F2)" eller "while (not ADCON0.F2) ?
Jag minns aldrig om 1 är sant eller falskt...

Sen, finns det inget bättre namn än "F2" ?
Det är väl bara ett generellt namn som betyder "bit 2" ?
T.ex "GO_DONE" (som den heter i INC filen) ?

Postat: 7 maj 2008, 09:39:40
av squiz3r
"men är inte detta en tilldelning?"
Aha! Där har vi det! Det ska vara

while (ADCON0.F2 == 1){}

Eller så kan man skriva

while (ADCON0.F2){}

som Sodjan sa. Men jag tycker det blir tydligare kod med den första.

Tack för hjälpen att hitta det felet! Ska testa så fort jag kommer hem.

--------------
"T.ex "GO_DONE" (som den heter i INC filen) ?"
Problemet är bara att det inte finns någon INC fil,vad jag vet.. Den ligger nog gömd någonstanns.. Och i databladet heter ju denna biten GO/DONE, så det fuingerar ju inte. Annars brukar det gå bra att skriva samma som databladet.

Mvh

Postat: 7 maj 2008, 14:38:52
av sodjan
> Problemet är bara att det inte finns någon INC fil...

Nej, men kanske någon .H fil eftersom det är en C kompilator...

Vad vet jag, det verkar hur som helst *väldigt* osannolikt att det
*inte* skulle finnas symboliska namn för dessa bitar i
kontroll-registren !! Det kan inte vara så att man måste först
leta upp biten och kolla vilken bit (i ordningen) det är, och sedan
bara skriva "F2". Koden blir väldigt svårkontrollerade dessutom...

Postat: 8 maj 2008, 18:18:09
av squiz3r
Jag har rättat till det felet nu, men det fungerar ändå inte..

Tidigare har jag kört med en färdig funktion för att läsa av ADC'n (man fick ställa in inställningarna själv först) och det fungerade inte heller sen jag flyttade den till denna PIC'en (16F88) tidigare körde jag den på en 16F877A. Så jag tippar nog mera åt att någon inställning till ADC'n (ANSEL, ADCON0 eller ADCON1) är felaktig. Men jag har kollat igenom dem flera ggr utan att hitta något konstigt..

ANSEL

Kod: Markera allt

— ANS6 ANS5 ANS4 ANS3 ANS2 ANS1 ANS0
ADCON0

Kod: Markera allt

ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE — ADON
ADCON1

Kod: Markera allt

ADFM ADCS2 VCFG1 VCFG0 — — — —
Något annat ni kan behöva veta för att se något fel?

Mvh. Daniel

Postat: 8 maj 2008, 20:40:15
av lgrfbs
Kolla mitt gamla projekt: Gear Display Project
http://www.mikroe.com/en/projects/mikropascal.php

Använde 16F88 & ADC men med mikroPascal

Postat: 16 juni 2008, 18:22:07
av victor_passe
jag testade med:

Kod: Markera allt

  delay_us(1000);
  while(dly>1){
      dly=dly-50;
      delay_us(50);
  }
0<dly<1024
Men den funkar inte så bra utav någon anledning och vdelay_ms() är rutinen för pausa med variabel.