Hur kan jag testa läsning av dip switchen?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Jennie
Inlägg: 173
Blev medlem: 8 februari 2014, 13:23:00

Hur kan jag testa läsning av dip switchen?

Inlägg av Jennie »

Hej! Det här är mitt 1:a helt egna projekt, tänkte jag skulle få 2 stycken 7-segments display att att visa siffror baserat på en dip switch med min mikrokontroller från Arduino.

Displayerna har jag ju nu fått till att lysa som det ska med min C-kod och så, det som fattas är alltså bara att få min mikrokontroller att läsa ifrån dip switchen i C och sedan överföra och visa hex-värdet (mellan 0-255) på 7-segments displayerna.
Problemet är att jag inte är helt 100% på att jag har kopplat ihop allting rätt till dip switchen, och jag har nog en del att jobba på med själva koden.

Men tänkte det verkar lite krångligt om jag tar alltihop i ett steg här, så jag tänkte att det måste finnas något sätt som gör att jag bara kan testa ifall min mikrokontroller läser det som står på dip switchen? Men jag vet inte hur jag skulle kunna testa det på ett enklaste sätt...?

(Alltså att försöka läsa den och samtidigt föra ut värdet på displayerna när jag inte är helt 100 på att min "schamatic" är helt riktig, känns inte som det smidigaste jag kan göra det här på)


Bild

Röda ledningar mellan 7-segmentsdisplays och "K-registret" och orange ledningar mellan dip switch och "F-registret".

Bild

Så - hur kan jag testa ifall det går att läsa från F-registret och ifall kopplat min dip switch rätt på lättaste vis? :)
Användarvisningsbild
olalofberg
Inlägg: 232
Blev medlem: 5 november 2014, 19:00:57
Ort: Kristdala

Re: Hur kan jag testa läsning av dip switchen?

Inlägg av olalofberg »

Läs av och skicka till serieterminalen, tills du ser att det blir rätt.
D.v.s. behåll usb-kabeln i när du kör på kortet och ta upp terminalen med ctrl-shift-M?
I koden:
Serial.begin(9600);
och sen
Serial.print(variabel);
för att debug-printa..

(http://www.ladyada.net/learn/arduino/lesson4.html)
Användarvisningsbild
RDX*
EF Sponsor
Inlägg: 1647
Blev medlem: 28 maj 2003, 22:52:04
Ort: Skåne - Lund

Re: Hur kan jag testa läsning av dip switchen?

Inlägg av RDX* »

DIP-switcharna ska koppas med pull-Down Eller Pull-up.
Enligt bild:
http://electronics.stackexchange.com/qu ... i2c-eeprom

Om du inte använder någon inbyggt pull up så måste du koppa in motstånd.

Svarar detta på frågan eller undrade du något annat?
Användarvisningsbild
adent
Inlägg: 4125
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Hur kan jag testa läsning av dip switchen?

Inlägg av adent »

Det är alltid tacksamt att börja smått.

Börja med att se om du kan tända upp alla segment i 7-segments-displayerna (styckvis) med ett litet specialprogram för det.
När det funkar så vet du "ju" det och kan ändra koden så att ett segment tänds upp av en dip-switch. Litet steg -testa, litet steg -testa är bra.

MVH: Mikael
Jennie
Inlägg: 173
Blev medlem: 8 februari 2014, 13:23:00

Re: Hur kan jag testa läsning av dip switchen?

Inlägg av Jennie »

Tack för svar!!! :)

UPPDATERING:

Okej, har kunnat arbeta på det lite idag och jag har fixat "schematic:en" nu. Jag kan läsa från DIP-switchen, MEN bara de fyra nedre bitsen (de 4 LSB) ger ju resultatet jag vill ha dvs. bara en av displayerna ger mig det önskade resultatet.

Att mixtra med de fyra första bitsen gör att jag visar talen på den första displayen helt korrekt (dvs. hex 0-F). När det gäller att få även den andra till att fungera så är det svårare. Jag har kopplat båda "common catode" till en tredje port B, pin5 och pin 4 och skulle behöva en hjälpande hand här? Hur kan jag koda så att jag får även den 2:a displayen att visa riktigt resultat?

Kort info:

* PORTF är input och läser av pinsen från DIP switchen
* Resultatet på PORTF ska skrivas ut på PORTK som går till displayen
* PORTB är "common catode" och kan då släcka/tända displayerna

Kod:

main
Bild

header med min dekoder
Bild

Så hur involvera PORTB som ger "common catode" här för att kunna visa hextal mellan 0-255 istället för bara 0-15?

Jag har försökt efterlikna den här:

www.paste.org/63193
Användarvisningsbild
swesysmgr
Inlägg: 14257
Blev medlem: 28 mars 2009, 06:56:43
Ort: Göteborg

Re: Hur kan jag testa läsning av dip switchen?

Inlägg av swesysmgr »

Du har två evighetsloopar (for(;;)) och en if-sats nästlade, om du väl klivit in i den nedre loopen kommer aldrig den sista PORTK-raden att köras?!

Jag förstår inte riktigt vad h-gör heller, OR:a en massa inputs ett steg vänstershiftade?!

Enklaste sättet att maska ut lägsta 4-bitarna borde vara att AND-a med x0F och för att få ut de 4 höga bitarna högershifta 4 steg?
Jennie
Inlägg: 173
Blev medlem: 8 februari 2014, 13:23:00

Re: Hur kan jag testa läsning av dip switchen?

Inlägg av Jennie »

Tack för feedback! Ja, jag är långt från färdig ännu.

I "h" var det tänkt att jag skulle OR:a så fort en av de högre bitsen blev hög, det är ju då den andra displayen kommer in i bilden. Nu visar displayerna "C" ifall nån av dessa är höga (men sen får jag ju som du påpekade tvungen att resetta det hela).
Och att skriva exempelvis

h = 0b01000111; är ju likvärdigt med h = (1<<PF6)|(1<<PF2)|(1<<PF1)|(1<<PF0); eller h = 0x47; så det är ingen vänsterskift där.

Förstår inte riktigt hur du menar med "Enklaste sättet att maska ut lägsta 4-bitarna borde vara att AND-a med x0F och för att få ut de 4 höga bitarna högershifta 4 steg?" ?

Skulle du kunna göra en jättejättekort exempel kanske på vad du menar och var i koden jag skulle sätta den liksom?
Användarvisningsbild
adent
Inlägg: 4125
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Hur kan jag testa läsning av dip switchen?

Inlägg av adent »

Hej!

Lite tips på vägen!

1. Indentera upp koden ordentligt och kör med måsvingar även om det bara är en rad. Lägger man till en rad indenterat och snyggt men inte har måsvingarna så kommer funktionen bli en helt annat än det man tycker sig tro att det ska vara.
Det här är viktigt tro mig! (Jag har en röd stämpel som det står "INDENTERA!" på sedan jag var lärare på högskolan :) )

Kod: Markera allt

 ...
else 
  foo();


utan ändra till

Kod: Markera allt

else 
{ 
  foo();
}
(Gäller förstås även så att if ska vara: if() { ... } )

2. Krångla inte till det mer än nödvändigt! Så här i början behöver du inte ha fina definitioner på saker. Skriv du 0xF3 eller så, men låt det inte bli en vana :)

3, Visa gärna schemat och förklara exakt vad du vill att den ska göra. Jag tolkade din beskrivning (som jag säkert läst för slarvigt :/ ) såhär:

4. Jag tror du har krånglat till koden lite i onödan, behåll init() och visatal() och skriv om main().

5. Beroende på hur du tänkt i visatal() så istället för case 15: kan du skriva case 0xF: för lite ökad tydlighet (och då förstås vara konsekvent och ändra alla till hex-notation)

Du har 8-dip-switchar och 2st 7-segmentsdisplayer. Du vill visa Höga nibblen från dip-switchen på den vänstra 7-seg-displayen och den låga nibblen på dip-switchen på den högra 7-seg-displayen. Om dip-switchen är satt som 0xF7 så ska det stå "F" på den ena displayen och "7" på den andra?

MVH: Mikael
Användarvisningsbild
adent
Inlägg: 4125
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Hur kan jag testa läsning av dip switchen?

Inlägg av adent »

Hmm, du har kopplat så att de 7 ledarna går till bägge displayerna och sen väljer du vilken som ska vara tänd med en utgång på PORTB?

Ett exempel: kasta in en extra parameter till visa-tal, beroende på om den är 0 eller 1 så sätter du rätt utgång på PORTB (för att tända rätt display) och sen i din huvudloop ropar du först på:

visatal(tal-tillvänster,0);
visatal(tal-tillhöger,1);

Men det bygger ju på att jag inte missförstått igen. Som sagt schema och tanke -> bra!

MVH: Mikael
Skriv svar