Sällskapsspel med PIC...
Sällskapsspel med PIC...
Detta är ett reviderat projekt som jag höll på med för något år sedan, men som jag aldrig fick att funka riktigt. Eftersom jag funderat på ett annat större projekt så vill jag få detta mindre projekt att funka först. Det KAN ju vara så att jag saknar talang för detta och kanske ska ställa in det...
Detta är en hemmavariant av Jeopardy, sju spelare har varsin knapp och så är det en spelledare med en knapp som startar spelet. Ni som har sett TV-versionen förstår hur det funkar, ni som har spelat bordsversionen i samband med öldrickning förstår även behovet av en opartisk domare som kan ta det från en bedömningssport till en intellektuell utmaning... Eller nåt...
Nåja, det viktiga i detta läget är inte behovet av denna apparat eller ens dess funktion, utan mer att det program man skriver verkligen hamnar i PIC:en och startar.
Detta är den tänkta kretsen: Länk till schemat och layout...
C1 och C4 är tänkt som avkopplingskondensatorer, något som orginaldesignen saknade. C2 och C3 är för att spänningsregulatorn ska funka. Q1 ska egentligen vara en keramisk resonator, se fråga 3 nedan. ICSP är kontakten till programmeraren och SV1 är för att koppla in spelknapparna. Som synes drivs allt av ett 9volts batteri. En 74LS47 (BCD TO 7-SEGMENT DECODER/DRIVER) används för att spara pinnar på PIC:en, de två LED-Displayerna multiplexas med hjälp av två transistorer och lite motstånd. I Centrum så sitter det en PIC, i detta fall 16F84.
Angående programmet så fick jag multiplexningen av displayen att funka och den reagerade på knapparna, dock inte riktigt som jag ville. En del av problemet var att jag aldrig var riktigt säker på att PIC:en blev rätt programmerad. Jag använde sådana där billighetsprogrammerare som man gör av några motstånd och en 7407. Nu hade jag tänkt att skaffa en WISP628 för "In Circuit Programming" som många lovordar på detta forum. Ett annat problem tror jag knapparna var, PIC:en har interna Pull-up motstånd som jag aktiverade och så är spelknapparna (SV1 i schemat) kopplade så att de sluts till jord när en spelare tror han kan något. Jag tyckte även att det var svårt att felsöka då man inbland fick intrycket att PIC:ens funktion var inkonsekvent.
Nu till frågorna:
1. Är schemat korrekt för att man ska kunna programmera PIC:en med en WISP628?
2. Jag har valt en PIC 16F84 för att jag har sådana kvar från de tidigare exprimenten, skulle jag vinna något på att uppgradera till en modern variant?
3. Jag använde en keramisk oscillator med tre ben som jag köpte från ELFA. Inkoppling är som kristallen i schemat, men med centerbenet till jord, är det ett bra val eller är det därför som jag fick för mig att PIC:en ibland inte gick igång?
4. Angående spelarnas knappar, kan man använda den interna pullup:en så som jag gjorde eller är det bättre att använda extern PullUp? Eller kanske pulldown med knapparna som sluter till +5V?
5. Är kontaktstuds något man måste fixa med hårdvara eller räcker det att tänka på det i mjukvaran?
6. Det hade ju varit kul att ha en pinne till på PIC:en så att jag kan visa en "8" och "9" också. Nu är ju "D"-signalen på displaydrivaren dragen till GND... Det är ju bara 7 spelare och ska man ha en klocka som visar kvarvarande tid att svara så "behöver man ju" (egentligen "kan") inte visa mer än de sista 7 sekunderna, men finns det någon enkel lösning på det som jag inte tänkt på?
7. Angående layouten så vet jag att displayen är upp och ned, det ska den vara. Men är det något annat som ser dumt ut?
Om du har läst ända hit så hoppas jag att du kan svara på åtminstone någon av mina frågor eller åtmistone komma med några synpunkter. Såg att det blev ganska långt när jag förhandsgranskade, men jag tror det är bättre att skriva för mycket än för lite...
Detta är en hemmavariant av Jeopardy, sju spelare har varsin knapp och så är det en spelledare med en knapp som startar spelet. Ni som har sett TV-versionen förstår hur det funkar, ni som har spelat bordsversionen i samband med öldrickning förstår även behovet av en opartisk domare som kan ta det från en bedömningssport till en intellektuell utmaning... Eller nåt...
Nåja, det viktiga i detta läget är inte behovet av denna apparat eller ens dess funktion, utan mer att det program man skriver verkligen hamnar i PIC:en och startar.
Detta är den tänkta kretsen: Länk till schemat och layout...
C1 och C4 är tänkt som avkopplingskondensatorer, något som orginaldesignen saknade. C2 och C3 är för att spänningsregulatorn ska funka. Q1 ska egentligen vara en keramisk resonator, se fråga 3 nedan. ICSP är kontakten till programmeraren och SV1 är för att koppla in spelknapparna. Som synes drivs allt av ett 9volts batteri. En 74LS47 (BCD TO 7-SEGMENT DECODER/DRIVER) används för att spara pinnar på PIC:en, de två LED-Displayerna multiplexas med hjälp av två transistorer och lite motstånd. I Centrum så sitter det en PIC, i detta fall 16F84.
Angående programmet så fick jag multiplexningen av displayen att funka och den reagerade på knapparna, dock inte riktigt som jag ville. En del av problemet var att jag aldrig var riktigt säker på att PIC:en blev rätt programmerad. Jag använde sådana där billighetsprogrammerare som man gör av några motstånd och en 7407. Nu hade jag tänkt att skaffa en WISP628 för "In Circuit Programming" som många lovordar på detta forum. Ett annat problem tror jag knapparna var, PIC:en har interna Pull-up motstånd som jag aktiverade och så är spelknapparna (SV1 i schemat) kopplade så att de sluts till jord när en spelare tror han kan något. Jag tyckte även att det var svårt att felsöka då man inbland fick intrycket att PIC:ens funktion var inkonsekvent.
Nu till frågorna:
1. Är schemat korrekt för att man ska kunna programmera PIC:en med en WISP628?
2. Jag har valt en PIC 16F84 för att jag har sådana kvar från de tidigare exprimenten, skulle jag vinna något på att uppgradera till en modern variant?
3. Jag använde en keramisk oscillator med tre ben som jag köpte från ELFA. Inkoppling är som kristallen i schemat, men med centerbenet till jord, är det ett bra val eller är det därför som jag fick för mig att PIC:en ibland inte gick igång?
4. Angående spelarnas knappar, kan man använda den interna pullup:en så som jag gjorde eller är det bättre att använda extern PullUp? Eller kanske pulldown med knapparna som sluter till +5V?
5. Är kontaktstuds något man måste fixa med hårdvara eller räcker det att tänka på det i mjukvaran?
6. Det hade ju varit kul att ha en pinne till på PIC:en så att jag kan visa en "8" och "9" också. Nu är ju "D"-signalen på displaydrivaren dragen till GND... Det är ju bara 7 spelare och ska man ha en klocka som visar kvarvarande tid att svara så "behöver man ju" (egentligen "kan") inte visa mer än de sista 7 sekunderna, men finns det någon enkel lösning på det som jag inte tänkt på?
7. Angående layouten så vet jag att displayen är upp och ned, det ska den vara. Men är det något annat som ser dumt ut?
Om du har läst ända hit så hoppas jag att du kan svara på åtminstone någon av mina frågor eller åtmistone komma med några synpunkter. Såg att det blev ganska långt när jag förhandsgranskade, men jag tror det är bättre att skriva för mycket än för lite...
Låter kul. Det finns dock ett par punkter som jag inte riktig är nöjd med:
* Varför en extra display dekoder krets?
* Varför en PIC16F84 som är "död och borta"?
* Varför inte en större krets med fler pinnar och som kan driva displayen direkt?
* Jag ser att du inte har pull-up på ingångarna från knapparna, det är ett fel. När en PIC-ingång inte drivs till ett visst nivå flyter den och samlar störningar upp som bäst.
* Om du har ledningar till knapparna över en viss (kort, ~30 cm) längd bör du ha lite störfilter på ingången så att det inte kommer in ESD, detta gäller obetingad om spelet jackas ihop.
* Störfilter kan vara så enkelt som ett motstånd och en kondensator.
Lite råd:
* Kontaktstuds är bara ett problem när man ska trimma något (som i "gå ett steg per tryck"), jag löser det vid att ha en timer-interrupt som bland mycket annat läser knapparna 1gg/interrupt och sedan bearbetar denna läsning.
* Med en större krets (fler pinnar) kan du styra allt från kretsen, om du väljer en nyare version finns det inbyggd oscillator på 4 eller 8MHz, ingen resonator eller liknande behövs då.
* En resonator startar snabbare än ett kristall men kopplar man fel eller lagar tveksam ledningsdragning kan allt bli fel.
* Varför en extra display dekoder krets?
* Varför en PIC16F84 som är "död och borta"?
* Varför inte en större krets med fler pinnar och som kan driva displayen direkt?
* Jag ser att du inte har pull-up på ingångarna från knapparna, det är ett fel. När en PIC-ingång inte drivs till ett visst nivå flyter den och samlar störningar upp som bäst.
* Om du har ledningar till knapparna över en viss (kort, ~30 cm) längd bör du ha lite störfilter på ingången så att det inte kommer in ESD, detta gäller obetingad om spelet jackas ihop.
* Störfilter kan vara så enkelt som ett motstånd och en kondensator.
Lite råd:
* Kontaktstuds är bara ett problem när man ska trimma något (som i "gå ett steg per tryck"), jag löser det vid att ha en timer-interrupt som bland mycket annat läser knapparna 1gg/interrupt och sedan bearbetar denna läsning.
* Med en större krets (fler pinnar) kan du styra allt från kretsen, om du väljer en nyare version finns det inbyggd oscillator på 4 eller 8MHz, ingen resonator eller liknande behövs då.
* En resonator startar snabbare än ett kristall men kopplar man fel eller lagar tveksam ledningsdragning kan allt bli fel.
Ok, jag har kollat på era synpunkter och gjort om kretsen lite grann. Har bytt till en PIC16F628 som är lite modernare. Har dessutom satt pulldowns på ingångarna, plockat bort displaydrivaren och gjort så att multiplexningen kan ske från en pinne istället för två som tidigare. Har dessutom plockat ihop en som "bara" behöver mjukvara för att vara färdig för spel. Schema och Bild på kortet.
Vad menade du föressten med störfilter för att inte få in ESD? Knapparna och kablarna är ju isolerade och trådarna är ju kopplade till +5V med pulldown till jord, var uppstår ESD? Om du menar att trådarna plockar upp induktion så borde väl pulldownmotstånden "plocka" det eller måste man ha något mer?
Vad menade du föressten med störfilter för att inte få in ESD? Knapparna och kablarna är ju isolerade och trådarna är ju kopplade till +5V med pulldown till jord, var uppstår ESD? Om du menar att trådarna plockar upp induktion så borde väl pulldownmotstånden "plocka" det eller måste man ha något mer?
Sedan tycker jag att det saknas en funktion. "Omstart".När en spelare tryckt men svarat fel skall "personen" inte kunna vara med den omgången mer.
Sedan för att få "action" kring bordet bör "flanktriggning" användas.
så man måste släppa knappen innan man kan trycka igen
Lite tråkigt om en sitter och håller knappen nere efter start , men det är en smaksak..så har jag på mitt spel !! .
Sedan för att få "action" kring bordet bör "flanktriggning" användas.
så man måste släppa knappen innan man kan trycka igen
Lite tråkigt om en sitter och håller knappen nere efter start , men det är en smaksak..så har jag på mitt spel !! .
Har nu gjort detta projekt klart och det funkar bra, det har varit mycket lärorikt.
Har använt MPLAB 8.0 med en WISP628 programmerare och WINWisp 0.9 som programmerare. EAGLE 4.16 för hårdvarudesign. Länk för den som vill kolla...
Postar detta bara därför att tala om att jag faktiskt lyckades med det jag tänkte göra, men också för att få lite input på vad kunde gjort bättre eller kanske till och med gjort fel. Så om någon erfaren har tid att kolla på koden och ge lite synpunkter på hur den är skriven så skulle jag vara tacksam. Om någon skulle vilja bygga en egen så finns all dokumentation i filen ovan.
En icke komplett lista på vad jag antar är nybörjarfel:
Aktiverat Watchdogtimer av misstag.
Konfigurerat Configuration Word fel (Varför är inte FOSC0-2 i "ordning")
Försökt göra calculated GOTO över 256 bytes gräns.
Räknat fel på Timer0 på ett flertal olika sätt. (CLKOUT = Fosc/4 ! )
Underskattat PCLATH:s betydelse.
Försökt programmera PIC:en med dåligt laddat batteri.
Har använt MPLAB 8.0 med en WISP628 programmerare och WINWisp 0.9 som programmerare. EAGLE 4.16 för hårdvarudesign. Länk för den som vill kolla...
Postar detta bara därför att tala om att jag faktiskt lyckades med det jag tänkte göra, men också för att få lite input på vad kunde gjort bättre eller kanske till och med gjort fel. Så om någon erfaren har tid att kolla på koden och ge lite synpunkter på hur den är skriven så skulle jag vara tacksam. Om någon skulle vilja bygga en egen så finns all dokumentation i filen ovan.
En icke komplett lista på vad jag antar är nybörjarfel:
Aktiverat Watchdogtimer av misstag.
Konfigurerat Configuration Word fel (Varför är inte FOSC0-2 i "ordning")
Försökt göra calculated GOTO över 256 bytes gräns.
Räknat fel på Timer0 på ett flertal olika sätt. (CLKOUT = Fosc/4 ! )
Underskattat PCLATH:s betydelse.

Försökt programmera PIC:en med dåligt laddat batteri.
> Vad är egentligen den största skillnaden på dem?
Mellan 628 och 628A ?
Tja, att den första är utgången och den andra går att köpa.
Tekniska skillnader finns i databladet för 628A sidan 168,
men det hade du ju redan läst, eller hur ?
> Konfigurerat Configuration Word fel (Varför är inte FOSC0-2 i "ordning")
Vad har *det* för betydelse ? Det hade jag inte ens märkt.
Men det tar ju verktygen hand om i alla fall. Hur menar du
att det var ett problem ?
Mellan 628 och 628A ?
Tja, att den första är utgången och den andra går att köpa.

Tekniska skillnader finns i databladet för 628A sidan 168,
men det hade du ju redan läst, eller hur ?
> Konfigurerat Configuration Word fel (Varför är inte FOSC0-2 i "ordning")
Vad har *det* för betydelse ? Det hade jag inte ens märkt.
Men det tar ju verktygen hand om i alla fall. Hur menar du
att det var ett problem ?
Om alla hittade det de sökte i databladen så fanns det väl ingen mening med detta forum eller hur?
Jag skrev så här i programmet:
__CONFIG b'11111100111000' ; Konfiguration för processorn (Sidan 92)
Om man tittar i databladet och läser parametrarna uppifrån och ned och sätter in en nolla eller etta beroende på om man vill ha den funktionen med eller inte så kan det vara ett problem. Om man antar att de är i ordning fast de inte är det så får man en annan konfiguration än man vill ha...
Jag skrev så här i programmet:
__CONFIG b'11111100111000' ; Konfiguration för processorn (Sidan 92)
Om man tittar i databladet och läser parametrarna uppifrån och ned och sätter in en nolla eller etta beroende på om man vill ha den funktionen med eller inte så kan det vara ett problem. Om man antar att de är i ordning fast de inte är det så får man en annan konfiguration än man vill ha...
Ganska värdelöst sätt att definiera __CONFIG. Kör med något i stil med :
__CONFIG _DATA_CP_OFF & _CP_ON & _LVP_OFF & _BODEN_OFF & _BOREN_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC & _MCLRE_ON
frå en asm fil för 628A. Justera de olika inställningarnna efter aktuellt behov.
Se slutet av P16F628A.INC för specifikation av de olika konstanterna.
> Om alla hittade det de sökte i databladen...
Visst, men nu är det ju inte så, så forumet har nog plats att fylla i alla fall...
__CONFIG _DATA_CP_OFF & _CP_ON & _LVP_OFF & _BODEN_OFF & _BOREN_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC & _MCLRE_ON
frå en asm fil för 628A. Justera de olika inställningarnna efter aktuellt behov.
Se slutet av P16F628A.INC för specifikation av de olika konstanterna.
> Om alla hittade det de sökte i databladen...
Visst, men nu är det ju inte så, så forumet har nog plats att fylla i alla fall...

> Tekniska skillnader finns i databladet för 628A sidan 168,
Absolut, Det tycker jag med, därför skrev jag också :
"Tekniska skillnader finns i databladet för 628A sidan 168".
Sen vet jag inget annat vettigt sätt att ange CONFIG.
Och databladets sida om "Config settings" behövs nog i alla fall...
Det är bara det att man inte behöver bry sig om vad de specifika
*bitarna* har för funktion, det tar symbolerna hand om.
Notera också att PIC18 har ett ännu renare format för CONFIG.
Exempel från en 18F252:
Absolut, Det tycker jag med, därför skrev jag också :
"Tekniska skillnader finns i databladet för 628A sidan 168".
Sen vet jag inget annat vettigt sätt att ange CONFIG.
Och databladets sida om "Config settings" behövs nog i alla fall...

Det är bara det att man inte behöver bry sig om vad de specifika
*bitarna* har för funktion, det tar symbolerna hand om.
Notera också att PIC18 har ett ännu renare format för CONFIG.
Exempel från en 18F252:
Kod: Markera allt
;**********************************************************
; CONFIG settings
;
config OSC = HS, OSCS = OFF, PWRT = ON, BOR = OFF
config WDT = OFF, CCP2MUX = OFF, STVR = OFF, LVP = OFF
config DEBUG = OFF, CP0 = OFF, CP1 = OFF, CP2 = OFF
config CP3 = OFF, CPB = OFF, CPD = OFF, WRT0 = OFF
config WRT1 = OFF, WRT2 = OFF, WRT3 = OFF, WRTB = OFF
config WRTC = OFF, WRTD = OFF, EBTR0 = OFF, EBTR1 = OFF
config EBTR2 = OFF, EBTR3 = OFF, EBTRB = OFF
;