Programhjälp.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Marcus F
Inlägg: 11
Blev medlem: 23 oktober 2008, 10:05:13
Ort: Njurunda

Programhjälp.

Inlägg av Marcus F »

Jag skulle behöva lite hjälp med att modda ett program.

Jag har köpt en byggsats på en LED klocka som jag vill ändra lite.
Klockfunktionen i sig är helt riktig, men jag skulle vilja lägga till 5st lysdioder som tänds dom sista fem sekundrarna varje minut.

Dvs.
sekund 55 diod 1
sekund 56 diod 1&2
sekund 57 diod 1-3
osv.

Eftersom alla utgångar på PIC,en är använda vill jag ändra funktion på utgång RB3, den styr i dag DP på leddisplayerna.
Jag vill att den tillsammans med DISP 1-5 tänder dioderna.

Har aldrig programerat assembler så jag har inte en susning hur jag ska göra detta. Vore ohyggligt tacksam om någon ville hjälpa mig.
Byggsatsen ifråga finns det mer info om på http://kitsrus.com/kits2.html Kit 73.
Där finns också hela koden till programmet.
Senast redigerad av Marcus F 23 oktober 2008, 11:14:04, redigerad totalt 1 gång.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Ett par saker.

Om man ända ska in och pilla i koden så kan man lika gärna
flytta den till en modern processor istället för F84'an.

Eftersom alla pinnar på F84'an tydligen redan är upptagna så
är det bättre att flytta till en 28-pinnare så blir det inga problem
med drivningen av de extra lysdioderna.

Jag tror att det vore enklare att lägga till extra kod för de extra
lysdioderna än att försöka ändra logiken för dp (RB3).

(Eftersom hela källkoden finns på länken du postade, så var det ju
lite helt nödvändigt att lägga in den här, jag föreslår att du plockar bort
den så att tråden blir lite mer lättläst...)
Marcus F
Inlägg: 11
Blev medlem: 23 oktober 2008, 10:05:13
Ort: Njurunda

Inlägg av Marcus F »

Jo självklart vore det enklast att sätta dit en 28-pinnare, men eftersom kortet är färdigt och jag helst vill slippa göra ett nytt så skulle det vara bäst om man kunde använda befintlig PIC.

(Jag har rensat bort koden).
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> men eftersom kortet är färdigt

Ah, OK, du hade ju en komplett sats ja...

Tja, allt går. :-)

> (Jag har rensat bort koden).

Säkert ?
Eller vänta, ja *nu* ja, men inte när du *skrev* att du hade gjort det... :-)
Användarvisningsbild
wolfheat
Inlägg: 202
Blev medlem: 14 oktober 2007, 20:42:51
Ort: Gävle

Inlägg av wolfheat »

verkar ju som om alla dina pinnar redan är upptagna, och helst skulle du vilja ha 5 till. I mina ögon ser det ut som du måste skriva om koden totalt och flytta endel utgångar för att få det att fungera. Alternativt trycka in ytterligare en Pic som du kör som slave, och dela upp programmet på den. Hur som helst så är det en hel del pill.

Hmm, kanske blir lite jobbigt att styra dioderna via vanliga logikkretsar, men det är ju en möjlighet. Dvs då sekunderna visar 5X (55,56,57,58,59).

Varför vill man hålla Vdd på 12V och Vss på 7V? Varför inte bara driva med 5V och 0V?
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

Sådana jättedisplayer har flera seriekopplade LED's per segment, 5V räcker helt enkelt inte till.

Det finns många lösningar på detta, men de har valt att använda en 4051 som är lite ovanlig i och med att den har tre anslutningar för matningsspänning. Ingångarnas nivåer refererar till Vdd-Vss medan utgångarna går mellan Vdd och Vee. Det leder till att Vss måste lyftas upp, annars hade det behövts en negativ spänning.

Lösningen på frågeställarens problem är nog trots allt väldigt enkelt. 4051 har 8 utgångar, alltså två oanvända. Använd en av dessa till att driva den gemensamma anslutningen för de extra LED's som krävs. ULN2003 har dessutom 7 drivers, alltså 1 oanvänd, så det behövs inte ens en extra drivtrissa. Sedan är det "bara" till att ändra i programmet och flasha om.

För killen som inte har kunskaper om programmering kan detta vara svårt och det kanske även finns tekniska problem med att flasha med kretsen på plats. MCLR måste hur som helst tas loss, borde för övrigt ha ett motstånd och inte direktkopplas till Vdd enligt anvisningar från Microchip.

Edit: Det är RB6/RB7 som är PGC/PGD och dessa är anslutna till anoddrivarna genom 470 ohm. Det kanske inte flasharen klarar av att driva. Dessutom bör man nog också tänka på om displayerna kan ta skada av för hög ström under för lång tid.
Marcus F
Inlägg: 11
Blev medlem: 23 oktober 2008, 10:05:13
Ort: Njurunda

Inlägg av Marcus F »

Tack för alla svar.
Nu när jag har tittat lite till på det här efter att ha läst Marta,s inlägg så behöver man inte alls ta bort nån kod för DP. Utan precis som hon skriver så finns en ledig utgång på 4051,an dit jag kan koppla gemensamma anlutningen för dom 5 ledlamporna och sedan styra dom via RB0-RB4 på samma sätt som alla andra segment styrs.
Solklart :D . Synd att man inte är kapabel att skriva till det i programmet bara, men är det nån som har några idéer så hojta till.

Det tekniska som att bränna PIC,en är inget problem utan det är just det att jag aldrig jobbat med assembler förut. Får väl försöka hinna sätta mig in i det också nån gång men just nu behöver jag hjälp. :?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Får väl försöka hinna sätta mig in i det också nån gång...

Är inte detta projekt en bra orsak ? :-)
Marcus F
Inlägg: 11
Blev medlem: 23 oktober 2008, 10:05:13
Ort: Njurunda

Inlägg av Marcus F »

Jo det kan tyckas, och jag kan erkänna att jag sitter just nu och försöker se hur saker och ting är uppbyggt. Problemet är att jag är i lite tidsnöd med detta då det jag bygger är en startklocka till en tävling och jag skulle behöva ha den klar rätt fort.

Men jag ska fortsätta under kvällen och försöka. Som jag förstår det sparas/uppdateras värdet för varje display i minnet. Det som då ska göras är att läsa värdet för DISP5 & 6 och sedan sätta RB0-4 låg när värdet är rätt och DISP7 (nya utgången på 4051,an) är tänd.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

En annan väldigt viktig sak...

Är det här ett hobby eller ett professionellt projekt ?
D.v.s kan det faktureras av den som hjälper till ?
Det kan göra en stor skillnad när det gäller att få
hjälp med kort varsel...
Marcus F
Inlägg: 11
Blev medlem: 23 oktober 2008, 10:05:13
Ort: Njurunda

Inlägg av Marcus F »

Jag håller på med tidtagning lite grand ibland på diverse motortävlingar, det är inget man blir fet på utan jag gör det mest för att det är roligt.
Just dom här klockorna ska nog mest ses som ett hobbyprojekt men kan komma att bli proffesionellt :) .
Men jag är nog villig att betala lite för hjälpen så slipper jag sitta i flera dygn och grotta ner mig i det här (lär jag nog göra ändå eftersom jag gärna vill förstå allt jag håller på med).
Men har du eller någon annan en prislapp på vad programändringen skulle tänkas kosta så är jag öppen för förslag.
Vill man inte skriva det här kan man maila på nts@telia.com
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

Du skall börja med att titta på multiplexrutinen. Utöka DISP1..DISP6 så att även DISP7 kommer att finnas där. Ändra sedan i koden så att DISP_Pl räknar ett steg längre innan den börjar om. För att åstadkomma detta behöver Du troligen bara definiera den nya variabeln samt ändra värdet där den testar om det är dags för DISP_Pl att vända.

Sekundvärdena har Du i TIME_CNT1, det är där Du skall läsa av sekunderna och utifrån detta värde bestämma vad som skall göras.

Enklaste sättet att visa rätt saker är nog att använda en tabell. Är där 60 lediga platser i flashminnet så gör det quick and dirty med ett entry för varje sekund som då innehåller vad som skall skickas till Dina extra LED's.


Har Du programmerat innan i något annat språk så reder Du säkert ut det här med, det är enkla ändringar som inte skall vara omöjliga att göra. Visst tar det tid, och kräver en liten insats, men så är det med allting.
Marcus F
Inlägg: 11
Blev medlem: 23 oktober 2008, 10:05:13
Ort: Njurunda

Inlägg av Marcus F »

Nu har jag klurat lite i programmet och definierat även en DISP7.

Jag har även försökt sätta mig in i vad dom olika programdelarna gör och en fråga är om det inte går att sätta portinställningarna för DISP7 på samma sätt som man har definierat hur portarna ska stå för repektive siffra och när DISP7 tänds anropa detta istället för SVNSEG?

Det jag inte förstår är hur man läser in värdet för ex. sekunder och sedan hämtar motsvarande siffra.

Jag förstår logiken men inte hur man gör.

Hittar inte heller vart jag ska ändra för när DISP_PI ska vända.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

STÄLLET DÄR DISP_Pl vänder är här:

Kod: Markera allt

MPX_DSP	bsf	FLAG_1,2	; set multiplex flag
	movlw	0xFF		; all 1's
	movwf	PORTB		; all segments off
	incf	DISP_PL,f	; increment display position counter
	movlw	0x06		; max display count + 1  !!ändra denna!!
	subwf	DISP_PL,w	; subtract 6 from display position counter
	btfsc	STATUS,c	; if carry is 1 then clear disp_pl
	clrf	DISP_PL		; clear counter back to display 1 position
Du kan göra på samma sätt med Dina extra-LED som det görs för siffrorna, problemet är att tabellen blir hela 60 bytes lång. Den får inte korsa en gräns där den låga adressbyten går runt och Du får inte åstadkomma detta för de befintliga tabellerna.

Tabellen går att minska drastiskt, men för att hjälpa Dig med detta måste Du tala om exakt vid vilka sekundvärden första dioden skall tändas och när de åter skal slockna. Är det så att första tänds på sekund 55, alla 5 lyser på sekund 59 och de slocknar när minuten slår om? I så fall är det jätteenkelt att minska tabellen.

Svara på detta så skall jag försöka hjälpa Dig med den kod som krävs i morgon, eller rättare sagt senare i dag. Nu skall jag sova....
Marcus F
Inlägg: 11
Blev medlem: 23 oktober 2008, 10:05:13
Ort: Njurunda

Inlägg av Marcus F »

Ja det är precis som du skriver.
Första tänds på sekund 55 och sedan en till varje sekund fram till 59. På 00 slocknar alla.
Skriv svar