Sida 2 av 5
Postat: 18 januari 2008, 08:41:56
av Icecap
Jag tror mer på sodjans programvarufel, närmre bestämt RMW-problemet.
Om Enable styrs med en BSF/BCF-instruktion bor det införas en NOP omedelbart innan BxF-instruktionen för att utgången ska hinna med att ladda upp/ur de kapaciteter som finns.
(RMW = Read-Modify-Write)
Postat: 18 januari 2008, 11:10:44
av sodjan
> Koden är ok...
> Men den är inte satt som ingång.......
>> jag är 99% säker på att det är ett mjukvarufel.
> Nej. tror inte det...
OK, då vet vi vad du *tror*...
Spelar det ingen roll vad alla andra tror ?
Spelar det ingen roll att det fungerade med "Hello World" programmet ?
Varför fråga här alls om du ändå skiter helt i svaren ?
Jösses...
Postat: 18 januari 2008, 12:15:54
av ElectricMan
Det enklaste borde väl ändå vara att lägga upp koden så nån får kolla på den?

Postat: 18 januari 2008, 12:18:54
av peter555
Om kabellängden eller trådarnas placering påverkar så beror det på dålig mjukvara (timingproblem).
Det är alltid kul att konfrontera optimistiska hackers som inte har koll på timingen med verkligheten, det brukar leda till att de får skriva om hela mjukvaran.

Postat: 18 januari 2008, 13:37:14
av Samot
Precis som sodjan tror, så lutar det ju åt programfel. Detta eftersom ditt helloworld program fungerar med samma hårdvarusetup som temperaturprogramet. Kolla timingen!
Postat: 18 januari 2008, 15:48:24
av Fredrick
Anledningen till varför jag inte lägger ut koden är att då får jag kommentarer som haha PICbasic ger jag inte mycket för och sedan kommer det 10 inlägg på raken om vilket språk jag igentligen skall välja ASM C mfl, bla bla bla och sen är man för alltid en nybörjare som igentligen inte är välkommen här mera då man anses ha allt för dåliga kunskaper inom elektronik för att få vara med de stora grabbarna. Ja så känns det faktiskt
Kod: Markera allt
temperature Var Word ' Temperature storage
count_remain Var Byte ' Count remaining
count_per_c Var Byte ' Count per degree C
DQ Var PORTC.0 ' One-wire data pin
ADCON1 = 7 ' Set PORTA and PORTE to digital
Low PORTE.2 ' LCD R/W line low (W)
mainloop: OWOut DQ, 1, [$CC, $44] ' Start temperature conversion
waitloop: OWIn DQ, 4, [count_remain] ' Check for still busy converting
If count_remain = 0 Then waitloop
OWOut DQ, 1, [$CC, $BE] ' Read the temperature
OWIn DQ, 0, [temperature.LOWBYTE, temperature.HIGHBYTE, Skip 4, count_remain, count_per_c]
' Calculate temperature in degrees C to 2 decimal places (not valid for negative temperature)
temperature = (((temperature >> 1) * 100) - 25) + (((count_per_c - count_remain) * 100) / count_per_c)
Lcdout $fe, 1, DEC (temperature / 100), ".", DEC2 temperature, " C"
' Calculate temperature in degrees F to 2 decimal places (not valid for negative temperature)
temperature = (temperature */ 461) + 3200
Lcdout $fe, $c0, DEC (temperature / 100), ".", DEC2 temperature, " F"
Pause 1000 ' Display about once a second
Goto mainloop ' Do it forever
Postat: 18 januari 2008, 16:02:53
av sodjan
OK.
> Anledningen till varför jag inte lägger ut koden...
Finns ingen rimlig anledning att inte göra det om det inte handlar om
företagshemligheter eller liknande. Hade du gjort det direkt så
hade halva tråden sparats in.
Var "Hello World" programmet skrivet med samma verktyg ? Kan
du i så fall posta det också ?
Nyckelfrågan här är exakt *vad* Lcdout gör ! Hur beskriver dokumentationen
det ? Finns det källkod (ASM) till Lcdout så att du kan kolla vad den faktiskt gör ?
(Och, ja visst, detta är ett problem med den typ av verktyg som det du
använder, men vad är problemet med att påpeka det ??)
Postat: 18 januari 2008, 16:07:30
av peter555
Du är hela tiden så säker på din sak och hävdar att det inte är något fel på din kod trots att ett flertal personer säger att det måste vara det.
Då kan det ju finnas en viss risk att det kommer en del oönskade kommentarer sedan.
Jag är ingen hacker så jag ska i alla fall inte kommentera.
Postat: 18 januari 2008, 16:46:24
av petterMAN
Det går att definiera samtliga delayer i LCDout funktionen
Här är standard delay inställningar:
Kod: Markera allt
Set command delay time in us
DEFINE LCD_COMMANDUS 2000
Set data delay time in us
DEFINE LCD_DATAUS 50
Sedan så kan det ju vara bra att definiera kristallens hastighet så att du vet att 1000us verkligen blir 1000us i praktiken också.
Kod: Markera allt
DEFINE OSC 4 Oscillator speed in MHz: 3(3.58) 4 8 10 12 16 20 24 25 32 33 40
Lycka till!
Postat: 18 januari 2008, 16:57:29
av sodjan
Är det delay mellan olika kommandon (min gissning) eller (vilken *kan*
vara problemet i detta fall) delayer för själva E-pulsen ?
Postat: 18 januari 2008, 17:16:10
av petterMAN
Eftersom att dokumentationen är lite bristfällig i vissa tillfällen så måste jag helt enkelt svara att jag inte vet. Den enda information men får är just kommentaren ovanför kommandot.
Hittade en annan formulering, dock kanske inte så givande.
Kod: Markera allt
DEFINE LCD_COMMANDUS 2000 'Define delay time between sending LCD commands
DEFINE LCD_DATAUS 50 'Define delay time between data sent.
Men det är väl inte svårare än att testa öka delayen för att se om det hjälper.
Ställ även in oscillatorns hastighet genom att definiera den i början av programmet. Standard är 4mhz.
Postat: 18 januari 2008, 17:26:45
av sodjan
OK, dessa delayer verker inte röra själva gränssnittet, utan för att
modulen ska hinna utföra varje kommando innan nästa kommer.
En nyckel-info just nu är hurvida "Hello World" programmet var skrivet
med samma verktyg ?
Postat: 18 januari 2008, 17:46:31
av Marta
Ett hårdvaruproblem är väl intehel uteslutet. Ibland har jag haft stora problem att flasha PIC's, det har bara blivit blaj tills det har kopplats in motstånd och kondigar som slöar ner flankerna lite på klockan så att att datalinan inte störs.
Pröva att sätta ett par hundra ohm i serie med enable där den kommer ut från processorn. Sedan är det bara att hoppas programmet har en tillräcklig fördröjning. Nnnnnnågra hundra pF mellan enable och jord vid displayen kan ev. också göra nytta.
Pröva också att ha enable omgiven av jordade trådar i flatkabeln, där dessa jordningar bara är anslutna vid processorn.
Postat: 18 januari 2008, 17:47:40
av Fredrick
Här är "Hello world" programmet, jag har provat med en massa pauser i temp programmet men det hjälper inte.
Har laborerat med olika DEFINES också
Jag har ställt samma fråga på ett support forum för PicBasic och fått massor med rader att lägga till men inget hjälper och nu säger dom att problemet inte ligger i koden.
Jag kan ju tillägga det att jag har fått det att fungera för en massa år sedan med samma kod men då satt displayen uppkopplad till ett annat kort och uC´n var en gammal hederlig 16F84.
Kod: Markera allt
ADCON1 = 7
Pause 1000
loop: Lcdout $fe, 1
Lcdout "Hello"
Pause 500
Lcdout $fe, 1
Lcdout "World"
pause 500
goto loop
Postat: 18 januari 2008, 17:50:52
av peter555
Visst kan man trixa med hårdvaran, men i det här fallet finns ingen anledning att köra så hög datahastighet eller snäva marginaler så att hårdvaran blir begränsande.
Jag har kört med meterlånga flatkablar kopplade direkt till displayer utan hänsyn till några extra jordningar eller termineringar, det har aldrig varit något problem.