Sida 4 av 5
Postat: 7 mars 2007, 11:14:20
av sodjan
> Nu börjar jag bli riktigt uppgiven med det här projektet.
Jaha du
Du kan börja med att svara/kommentera de tips du får. T.ex när jag skrev :
> Läs på i databladet kapitel PORTB om analoga funktioner.
> Du ska sannolikt stänga av ADC och/eller komparatorer...
Hart du gjort det ?
Du skrev :
> Antar att det är någon komparator eller A/D inställning
Ja men så kolla upp det då !! Vad är problemet ?
Anta inte, se till att du är säker...
Postat: 8 mars 2007, 20:55:03
av mr_fatise
Hart du gjort det ?
Japp, AD biten är avslagen.. Komparatorerna är avslagna. Har hållt på o labbat lite med 5volten, vetifan om de hjälpte eller va ett samanträffande, nu lever han hur som helst.
> Läs på i databladet kapitel PORTB om analoga funktioner.
Portb har inga analoga in/ut. Ska räcka med "clrf PORTB" så ska hela portb ställas som utgångar.
Gav upp för stunden med AD-omvanlingen, började tappa lusten för alltihop, får bli i ett senare skede.

Har nu iallfall lyckats skapa en timer som som räknar upp från 0-77 på två displayer.. binärt för tillfället men de kanske man får fart på. HAr hållt på o testat med lite olika hastigheter, räkna varannan siffra osv. Känns som man börjar fatta lite vad man gör för något.
Postat: 8 mars 2007, 21:55:32
av sodjan
> Känns som man börjar fatta lite vad man gör för något.
Perfekt.
> Ska räcka med "clrf PORTB" så ska hela portb ställas som utgångar.
Ska nog vara "clrf TRISB" där, eller hur ? Samt att man är i rätt minnes-bank,
så klart...
> Gav upp för stunden med AD-omvanlingen,
OK, som du vill. Men om du vill ha lite hjälp så måste vi se vad du har gjort.
Postat: 10 mars 2007, 00:47:59
av mr_fatise
Till att börja med måste jag säga att de är skit kul att någon engagerar sig och försöker hjälpa till.
>Ska nog vara "clrf TRISB" där, eller hur ? Samt att man är i rätt minnes-bank,
så klart...
Slarvig felskrivning, men så långt är jag med.
>OK, som du vill. Men om du vill ha lite hjälp så måste vi se vad du har gjort.
Japp tar de till senare, spelar väll inte nån igentlig roll om man börjar i fel ände?

Blir lite mer labbande men de är nog bara bra.
Dessvärre så får jag inte nån vidare flyt i bcd konverteringen. Just nu räknar den binärt upp till b'00011111'= d31. (sitter bara 5st lysdioder på plattan). Men så fort jag blandar in "sublw" eller "subwf" så börjar räknaren räkna baklänges eller i helt konstiga steg. Vad händer igentligen om man har 5 och drar av 10. C biten i STATUS registret blir 1 ett. Men värdet i W kan väll aldrig ligga kvar som negativt?
exempel:
Kod: Markera allt
banksel portb
incf count ;lägg till "ett" i räknaren.
movlw b'00001010'
subwf count
btfsc status, C ;Om det EJ går, hoppa över nästa
goto cp
movlw b'00001010'
addwf count
movfw count
movwf portb ;flytta värdet till portb
goto clear
Lägger upp hela koden så kanske det blir mer överskådligt.
Kod: Markera allt
list p=16f876A
#include <p16f876A.inc>
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
tio EQU 0x013
Count EQU 0x014
RESET_VECTOR CODE 0x000 ; processor reset vector
goto start ; go to beginning of program
INT_VECTOR CODE 0x004 ; interrupt vector location
goto interrupt ; goto main interrupt service routine.
;***************************************************************
MAIN CODE
start
banksel adcon1
movlw h'06'
movwf adcon1 ;Stäng av ADC.
banksel trisa
movlw b'00111111'
movwf trisa ;porta =ingångar
clrf trisb ;portb =utgångar
clrf trisc ;portc =utgångar
banksel t1con
movlw b'00110001' ;hastighet samt ON
movwf t1con
banksel pie1
movlw b'00000001'
movwf pie1 ; Tillåt avbrott från Timer
banksel intcon
movlw b'11000000'
movwf intcon ;Tillåt avbrott
loop
goto loop ; Vänta på avbrott...
interrupt CODE
interrupt
input
btfss porta, 0 ;Ingång1 hög= Skippa nästa
goto input ;vänta på ingång1 ska bli hög
banksel portb
incf count ;lägg till "ett" i räknaren.
btfss status, C
goto cp ;Om det EJ går, gå till cp
movfw count
movwf portb ;flytta värdet till portb
goto clear
cp
clrf count ;detta la jag mest till för att se om
clrf portb ;count någon gång blev full.
movlw b'00001001' ;samt tänder 2utgångar
addwf portb ;på portb
input2
btfsc porta, 0 ;Ingång1 låg=skippa nästa
goto input2 ;vänta på att ingång1 ska bli låg
clrf portb
goto clear ;ingång1=låg, gå till clear
clear
banksel pir1
bcf pir1, tmr1if ;töm avbrottsflaggan.
retfie
END
Postat: 10 mars 2007, 00:53:26
av mr_fatise
NU skäms jag nästan lite, samtidigt som jag skrev inlägget så la jag till lite förklaringar i koden, o snyggade till ite. Helt plötsligt funkar det. Räknaren räknar upp till 9 och stannar där. Tills man sätter ingång1 låg nån hundradel. Sedan börjar allt om.
Postat: 10 mars 2007, 12:47:19
av sodjan
> så la jag till lite förklaringar i koden, o snyggade till ite.
> Helt plötsligt funkar det.
Japp, brukar hjälpa i 9 fall av 10...
> Men värdet i W kan väll aldrig ligga kvar som negativt?
Tja, "negativt" och "negativt". Det beror på vad man menar med "negativt"...
W är ju bara 8 bitar, hur man själv väljer att definiera dessa är upp till
dig (d.v.s den som skriver programmet). Processorn i sig vet ingenting om
"negativa" värden.
Antingen tolkar man W som "unsigned" d.v.s med värdena 0 -> 255.
Och då finns det naturligtsvis inga "negativa" värden.
Eller så tolkar man det som "signed" d.v.s med värderna -126 -> +127.
D.v.s att om bit7 (den åttonde biten) är "1" så är värdet negativt.
Man kan se på W som en ring, där 255 + 1 = 0 och 0 - 1 = 255 (om man
räknar "unsigned").
Den enda som C-biten i STATUS talar om, är om man fick "overflow"
(vid addition) eller "borrow" (vid subtraktion). D.v.s att W inte "räckte till"
för den operation man gjorde. Då kan man använda C-biten för att justera
nästa byte (om man har ett värde som är 16, 24 eller fler bitar stort.
En annan sak är att SUBxx instruktionerna fungerar lite "baklänges".
Kolla ordentligt i vilken ordning subtraktionen görs.
Postat: 10 mars 2007, 16:50:35
av mr_fatise
>Japp, brukar hjälpa i 9 fall av 10...
Helt galet, hade suttit bra många timmar, sen helt plötsligt så funkar de perfekt.
>Man kan se på W som en ring, där 255 + 1 = 0 och 0 - 1 = 255 (om man
räknar "unsigned").
Ahh, nu e jag med i resonemanget. Kan förklara varför det flög omkring lite konstiga siffror kanske.
NU har jag iallfall kopplat upp 2st binär->BCD omvandlare som driver två 2st 7seg. Räknar nu från 0-99. Börjar få lite klämm på de här tror ja, ska labba lite mer ed ingångarna sen är det nog dax o ge sig på den där jäkla AD-delen iallfall.
Postat: 10 mars 2007, 17:42:50
av BoF
Att snygga till lite hjälper ingen!
Ta rätt på vad du ändrade så att du inte gör om misstaget i framtiden.
Postat: 10 mars 2007, 18:41:48
av sodjan
> Att snygga till lite hjälper ingen!
Att hålla sin kod "ren och snygg" hjälper alltid, skulle jag vilja säga.
Helt klart att föredra framför motsatsen...
Men jag kan hålla med om att det kan vara lite frustrerande det bara
"hoppar igång" så där utan vidare...

Postat: 10 mars 2007, 19:38:30
av BoF
Skulle bli lite orolig om det bara så där hoppar igång!
Vill veta vad jag har gjort för fel i alla lägen.
Postat: 10 mars 2007, 21:23:28
av mr_fatise
>Ta rätt på vad du ändrade så att du inte gör om misstaget i framtiden.
hehe, har lite aningar om vad de kan vart.. verkar va lite huxflux med "addlw" och "movlw".
>Att hålla sin kod "ren och snygg" hjälper alltid, skulle jag vilja säga.
Helt klart att föredra framför motsatsen...
Inte alltid så lätt vill jag säga..
Men nu har iallfall, de obegripliga skett. Har labbat o bråkat som en ren sate hela dan känns de som. Provade precis att skriva över koden för 2000 gången, pajar säkert snart! Ta mig fan så hände iallfall de otroliga, ett konstigt värde kom upp på displayen. Tänkte mest att de är som vanligt, de som inte va som vanligt var att värdet ändrade sig när man vred poten på AN0.
Helt jäkla otroligt, 2 veckor tog de

Nu ska jag bara snygga till koden?

Postat: 11 mars 2007, 17:57:13
av mr_fatise
HAr labbat lite för att få en lite segare uppdateringsfrekvens. Just nu så är den så ininorden snabb så att siffrorna rätt var det är bara kan stå o flippra mellan två värden, verkar inte spela nån roll om man höjer upp impedansen eller hänger på nå kondingar.
Finns det något lätt sätt att slöa ner hela opperationen.Utan att använda Timer1? Vill helst köra utan interrupt!
Grymmt kul att man fått ut ett resultat. Måste även tacka alla för den enorma hjälp jag fått.
Postat: 11 mars 2007, 19:54:46
av Marta
Gör en fördröjningsloop på lämpligt ställe.
Eller ännu bättre, ta tjuren vid hornen och lär Dig använa interrupt. Förr eller senare kommer Du att behöva det.
Postat: 11 mars 2007, 21:41:13
av sodjan
En fördröjning kommer inte att ta bort "flipprandet", det gör bara att det
flipprar långsammare. I alla lägen med analog -> digital omvandling
så får man gränslägen där det *alltid* kommer att slumpmässigt
växla mellan två värden.
Det du kan göra är att bygga in en utjämning i programvaran som ger
en hysteres ("deadband") så att det krävs en större förrändring av mätvärdet
för att det ska slå igenom på displayen.
Sen förstår jag inte vad som är problemet med interrupt. Det gör oftast
koden snyggare och förenklar hela applikationen.
Postat: 12 mars 2007, 00:11:53
av Marta
Jjag tror inte han menar det vanliga felet +/- 1, utan att detta i kombnation med en jättehög uppdaeringsfrekvens gör att den visar hieroglyfer istället för att växla mellan två tydbara siffror. Då hjälper det att lägga in t.ex. en halv sekunds fördröjning mellan varje uppdatering.