"LCD4 is a stand-alone program that writes optimized 4-bit Mode Character LCD functions for mikroBasic, mikroPascal, & mikroC."
PIC programmering i C - Kompilator?
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
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
> 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
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
"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
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
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:
Ä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.
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.
Mvh.
-
spaderkung
- Inlägg: 138
- Blev medlem: 12 maj 2007, 11:24:24
- Ort: Sjöbo
"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
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
> 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...
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...
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
ADCON0
ADCON1
Något annat ni kan behöva veta för att se något fel?
Mvh. Daniel
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 ANS0Kod: Markera allt
ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE ADONKod: Markera allt
ADFM ADCS2 VCFG1 VCFG0 Mvh. Daniel
Kolla mitt gamla projekt: Gear Display Project
http://www.mikroe.com/en/projects/mikropascal.php
Använde 16F88 & ADC men med mikroPascal
http://www.mikroe.com/en/projects/mikropascal.php
Använde 16F88 & ADC men med mikroPascal
-
victor_passe
- Inlägg: 2436
- Blev medlem: 28 januari 2007, 18:45:40
- Ort: Kungsbacka
jag testade med:
0<dly<1024
Men den funkar inte så bra utav någon anledning och vdelay_ms() är rutinen för pausa med variabel.
Kod: Markera allt
delay_us(1000);
while(dly>1){
dly=dly-50;
delay_us(50);
}
Men den funkar inte så bra utav någon anledning och vdelay_ms() är rutinen för pausa med variabel.
