Gå til innhold

kurant

Medlemmer
  • Innlegg

    65
  • Ble med

  • Besøkte siden sist

Innlegg skrevet av kurant

  1. Først av alt: jeg er fullstendig nybegynner når det gjelder programmering, så fint om jeg får svar deretter... :)

     

    Jeg har et ALTERA DE2-kort, og programmerer med quartusII

     

    Skal etterhvert lage en stoppeklokke, og jobber med 7-segment displayet nå. Har fått segmentene HEX0 og HEX1 til å telle til 9, for så å starte på nytt igjen. Men nå ønsker jeg at når HEX0 har talt til 9, skal HEX1 vise 1, altså så jeg får tallet ti (10).

     

    Gjorde et lite forsøk (som er kommentert vekk), men det er sikkert ganske på trynet... :)

     

    Takk på forhånd!

     

    Hei.

     

    Det du bør gjøre er å lage flere instanser av en dekadeteller, som har en carry-utgang. Denne carry-utgangen kan gå høy hver gang telleren starter på nytt. Du bruker så denne utgangen til å drive klokkeinngangen på den neste dekadetelleren.

     

    Jeg anbefaler at du lager et modulært design, dvs at du legger dekadeteller + bcd-enkoder i en egen entitet, og så kan du veldig lett slå sammen så mange som du vil av disse i topp-entiteten din.

     

    Jeg ville valgt et interface på dekadetelleren som følger:

    entity dec_bcd is
    
     port (
       clk    : in  std_logic;                      -- clock
       arst_n : in  std_logic;                      -- asynchronous reset
       count  : in  std_logic;                      -- counter enable
       carry  : out std_logic;                      -- carry out
       hex    : out std_logic_vector(7 downto 0));  -- bcd control vector
    
    end dec_bcd;

     

    Du kan så instansiere disse på følgende måte:

     

      dec_bcd_1: dec_bcd
       port map (
         clk    => clk,
         arst_n => arst_n,
         count  => count_1,
         carry  => carry_1,
         hex    => hex1);
    
     dec_bcd_2: dec_bcd
       port map (
         clk    => clk,
         arst_n => arst_n,
         count  => carry_1,
         carry  => carry_2,
         hex    => hex2);

     

    Håper dette hjelper

  2. Python koden til kurant er enkel og lage interface(GUI)som styrer utifra den er lett.

    Binder "ser.write('R128')" til en slider med 0-128.

    Kan ha knapper for for lys(RBG)

    Du får tenke på kan nok hjelpe til med koding,viss det trengs.

     

    Ja det er faktisk akkurat det jeg har gjort, vha PyQT. Jeg viste bare et lite avsnitt av koden for enkelhets skyld. Hvis det er interesse for det kan jeg legge ut hele koden senere, jeg har den ikke her.

  3. Bruk preprosesseringsdirektivet #define for å definere konstanter. Og sett opp en timer med interrups på et passende intervall for å regne ut rpm og skrive det ut på USARTen. ;)

     

    I følge referanseverket til Arduino er const å anbefale over #define, og meiner du at ein timer skal polle inputen, og ikkje flanketrigging slik eg har satt opp? Om du skal rekne ut RPM må du vel til med flyttalsutrekningar, og sidan det er ganske tidkrevande på ein mikrokontroller ville eg heller gjort dette i programmvaren i PCen.

     

    konstanter er alltid å foretrekke fremfor #DEFINE direktiver, man kan få noen svært interessante bugs ved bruk av sistnevnte da det ikke bare mangler typesikkerhet, men er en direkte substitusjon av hva som helst rett inn i koden.

     

    Det er forøvrig ikke nødvendig med flyttallsberegninger, man klarer seg fint med skalering av fixed-point verdier. Uansett er det et godt tips å gjøre disse beregningene på PCen som du sier da det gir mye mer fleksibilitet.

     

    Har omdreiningshastigheten på hjulet blitt nevnt forresten? Dette er jo relevant for implementeringen. Dersom det går for fort er det kanskje nødvendig med mer prosessering på arduinoen for å unngå unødig mye data på linken.

     

    Som andre har skrevet er jeg også enig i at en optisk sensor er en lite robust løsning i dette tilfellet. En hall-sensor virker som en mye bedre løsning

  4. Hei!

     

    Trenger å sende noen bytes gjennom serial porten til et arduino kort for å styre noen leds.

    det eg trenger å sende er verdier fra 0 til 1023.

     

    korleis gjør eg det i c++? bruker microsoft visual c++.

     

    trenger tips til en enkel kode som gjør dette :)

     

    Dette er ikke akkurat et svar på spørsmålet ditt, men dersom det ikke er noen spesielt vektig grunn til at du vil bruke C++ er ikke dette et godt språk til formålet. Jeg har nettopp skrevet en RGB-lysdiodekontrollapplikasjon til arduino hvor jeg brukte python. Her får du jobben gjort med et par linjer kode:

    import serial
    ser = serial.Serial(2,9600)
    ser.write('R128')
    

     

    Hvor 'R' indikerer fargen, og '128' indikerer intensiteten.

     

    Som du ser bruker jeg ASCII-koding, da dette er betydelig enklere å håndtere enn å sende binære verdier. Det er ikke så effektivt, men i slike applikasjoner har det ingen betydning.

     

    Denne verdien blir dekodet av en tilstandsmaskin som kjører på arduinoen med gjevne intervaller

     

    ledctrl_t get_cmd() {
     int i;
     char ledID;
     char ledval[5] = {'0','0','0','',''};
     ledctrl_t ledctrl;
    
     // search for valid LED identifier
     while( ledID != 'R' && ledID != 'G' && ledID != 'B' ) {
       if(Serial.available() == 0) {
         ledID = '0';
         break; }
    
       ledID = Serial.read(); }
    
     // did not find a valid header
     if(ledID == '0'){
       ledctrl.id = 0;
       return ledctrl; 
     } else {
    
       // set the LED pin  
       switch (ledID) {
         case 'R' : ledctrl.id = redled; break;
         case 'G' : ledctrl.id = grnled; break;
         case 'B' : ledctrl.id = bluled; break;
         default  : ledctrl.id = 0;
       }
    
     // fetch the intensity value
       if(Serial.available() >= 3) {
         for(i=0;i<3;++i)
           ledval[i] = Serial.read();
    
         ledctrl.val = atoi(ledval); }
         if(ledctrl.val > 255) ledctrl.val = 255;
         if(ledctrl.val < 0)   ledctrl.val = 0;
    
         return ledctrl;
       }
    }

  5. Siden du har studiomonitorer regner jeg med at du er litt ekstra nøye på lydkvalitet, og da kan nok et strømfilter og skikkelig nettkabel være en idé, men da begynner det å koste litt.

     

    Vær så snill, ikke anbefal "skikkelige nettkabler". dette er ren svindel beregnet på å trekke penger ut av lettlurte hifi-galninger. Det er ingenting en nettkabel kan gjøre for å redusere støy som ikke en billig ferrittkjerne kan gjøre også

  6. Så jeg må altså bruke en lavere gatespenning. :hmm: Hvilket nivå burde man ligge på?. Jeg ser IGBTen jeg har valgt har "gate threshold voltage" på Min. 3.5 Typ. 4.5 og Max. 5.5V. Så hvis jeg legger meg på ca. 5V skulle vel det gå bra?.

     

    Når det gjelder tilbakekobling fra last-siden så vet jeg ikke helt hvordan dette gjøres. Men jeg tipper jeg kan bruke en shunt og noen operasjonsforsterkere koblet som komparator. Men jeg tror nok ikke det blir på dette prosjektet.

     

    Nei du må ha høyere gatespenning. Transistoren er "på" når gatespenningen er ca. 4V høyere enn emitterspenningen. Emitterspenningen er gjennomsnittlig det samme som utgangsspenningen, så hvis du vil justere utgangen opp til 30V må gatespenningen være minimum 33.5V (utgang + minimum gate threshold). Du kan nok ikke drive timerkretsen din på denne spenningen, så her må du til med en slags virtuell jord som løfter jorden på driverkretsen din opp til et slikt nivå at du får slått på transistoren. Problemet blir ytterligere komplisert av at du vil kunne justere så langt ned som til 0V på utgangen. Hvis du har 0V på utgangen kan du ikke lenger drive gaten med ~34V, for absolutt maximum gate-emitterspenning for den transistoren du har valgt er 20V. du må altså flytte jordingspunktet for driverkretsen ettersom du justerer utgangen. fullt mulig, men det kompliserer designet en hel del.

     

    Et annet problem er at en 555-krets i utgangspunktet ikke er i stand til å drive en IGBT (eller MOSFET for den saks skyld) ved noe særlig høy frekvens. Det at disse komponentene er spenningsdrevet betyr ikke at det ikke går strøm i gaten. Gaten har en parasittisk kapasitans som må lades opp og ut når den switches henholdsvis på og av. Dette gjør at det går relativt høye strømmer der allikevel mår switchefrekvensen økes. Det vil sannsynligvis fungere på et vis, men regn med at 555-kretsen blir rimelig varm, og sannsynligvis får dramatisk redusert levetid. I tillegg vil nok påslagshastigheten på transistoren reduseres, noe som reduserer effektiviteten på regulatoren din. Men til ditt formål har dette sannsynligvis ikke så mye å si.

     

    Det finnes dedikerte driverkretser for smps. Hvis du er interessert kan du lese denne application noten fra maxim, som forklarer ting i litt mer detalj.

     

    http://www.maxim-ic.com/appnotes.cfm/an_pk/2031/

  7. KiCad er et gratis progam for elektronikkkonstruksjon

    Jeg er litt skeptisk til open source EDA programmer. Jeg kan ikke si noe om KiCAD da jeg aldri har brukt det selv, men jeg ser blandt annet at det bare er èn utvikler på prosjektet. Han gjør det sannsynligvis på fritiden sin også. Problemet med slike programmer er at de har en masse features, men har flust med bugs som gjør mange av dem helt ubrukelig. Jeg vil sterkt anbefale å bruke eagle isteden, da dette er et kommersielt program (med mange profesjonelle utviklere) som jeg vet fungerer bra.

     

    Som jeg selv har erfart er det veldig frustrerende å ha kommet et godt stykke i et design, for så å bare måtte gi opp på grunn av en bug i verktøyet en bruker.

  8. Du kan bruke en mosfet transistor, denne vil ikke loade cellen din nevneverdig. Den må også tåle høy spenning og strøm. Et godt alternativ er en IRFP450, du finner den på elfa.

     

    Du må forresten forsikre deg om at fotocellen er rask nok, en blitz varer bare i noen titalls mikrosekunder, så fotocellen bør trigge transistoren i underkant av ett mikrosekund. I tillegg så er det mulig at du ikke får utladet hele kondensatoren i slavemodulen dersom den triggende blitzen ikke er lang nok slik at transistoren stenger for tidlig. I dette tilfellet kan du bruke en tyristor som du da igjen må drive med en mosfet transistor for å unngå å laste fotocellen.

  9. Jeg trenger litt hjelp med noen spørsmål her....

     

    - Hvorfor får vi forsterkning i en transistor?

     

    - Når du stiller på potensiometeret inn til basis, hva skjer da?

     

    - Fellesbasistrinn har fordeler. Nevn noe

     

    Takk på forhånd :)

     

    Dette ser ut som spørsmål tatt direkte fra en skoleoppgave, hvorav spørsmålet i midten ikke kan svares på uten at du viser koblingsskjemaet som sikkert også står i oppgaven. Jeg foreslår at du forsøker å lære deg dette på egenhånd, ellers kan du like gjerne slutte på skolen.

  10. Jeg kan ikke se for meg at det i noe tilfelle vil være aktuelt å produsere en serie på flere hundre tusen kort med så enkel funksjonalitet at det kan lages med et fåtall grunnleggende logiske porter. Når kompleksiteten øker utover det helt grunnleggende er det uansett billigere med en liten FPGA.. Enkle FPGAer koster ned i 5 kroner i store serier.

     

    Når det gjelder forståelse er jeg forsåhvidt enig. Men da bør man holde seg unna J/K vipper, og heller forholde seg til D-vipper, som både er enklere å forstå, og er mye nærmere registrene man faktisk har i en FPGA. J/K vipper har en del ekstra funksjonalitet som bare bidrar til å forvirre.

  11. Ja jeg vet at dette ikke har noe med spørsmålet å gjøre, men jeg syns at det blir litt teit at de fortsatt gir slike oppgaver på videregående. Å designe digitale kretser vha J/K vipper og desslike er en teknikk som overhodet ikke blir brukt lengre i industrien. Her skriver man funksjonaliteten i et HDL (hardware description language), og syntetiserer til programmerbare logiske kretser (CPLD eller FPGA). Dette er relativt billig nå også, og i tillegg ikke så altfor vanskelig å komme i gang med. koden under (her i VHDL) vil utføre oppgaven og mer til.

     

    entity stepctrl is
    
     port (
       clk, arst_n : in  std_logic;
       enable      : in  std_logic;
       ctrl        : out std_logic_vector(3 downto 0));
    
    end stepctrl;
    
    architecture rtl of stepctrl is
    
     type step_seq_t is array (0 to 7) of std_logic_vector(3 downto 0);
    
     constant step_seq : step_seq_t := (0 <= "1010",
                                        1 <= "1000",
                                        2 <= "1001",
                                        3 <= "0001",
                                        4 <= "0101",
                                        5 <= "0100",
                                        6 <= "0110",
                                        7 <= "0010");
    
     -- registers
     signal seq_cnt_reg : unsigned(2 downto 0);  -- sequence counter
    
    begin  -- rtl
    
     -- purpose: sequence counter
     -- type   : sequential
     -- inputs : clk, arst_n, seq_cnt_reg
     -- outputs: seq_cnt_reg
     p_seq_cnt : process (clk, arst_n)
     begin  -- process p_seq_cnt
       if arst_n = '0' then                -- asynchronous reset (active low)
         seq_cnt_reg <= (others => '0');
       elsif rising_edge(clk) then
         if enable = '0' then
           seq_cnt_reg <= (others => '0');
         else
           seq_cnt_reg <= seq_cnt_reg + 1;
         end if;
       end if;
     end process p_seq_cnt;
    
     -- output assignment
     ctrl <= step_seq(seq_cnt_reg) when enable = '1' else (others => '0');
    
    
    end rtl;

  12. Hei lurer på hvordan man representerer f.eks. tall som 3.14 binært. Vil ikke bruke float men heller forstå logikken bak det.

     

    Det er to måter å gjøre det på: Fixed point, eller floating point. Sistnevnte er den representasjonen man bruker til å representere desimaltall i de fleste programmeringsspråk, for eksempel double i c++.

     

    Med floating point deler man tallet opp i to deler, en såkalt mantissa (grunntallet), og en eksponent. ved å variere verdien på eksponenten kan man flytte rundt på kommaet, og dermed få variabel presisjon, noe som er praktisk i mange tilfeller. problemet er at man ofte får avrundingsfeil ved operasjoner på flyttall, noe som som regel ikke er et problem, men kan bli det i enkelte tilfeller, som for eksempel økonomiprogramvare eller digitale filtre.

     

    Med fixed point står kommaet på samme sted hele tiden. verdiene til de ulike plasseringene vil til venstre for kommaet være det samme som for heltall, altså 2^0, 2^1, 2^2 osv. til høyre for kommaet blir det tilsvarende 2^-1, 2^-2, 2^-3 osv.

     

    Mindre fleksibelt siden man har ikke-variabel presisjon, men operasjonene kan utføres på mye enklere hardware, og man får ikke avrundingsfeil som for flyttall.

  13. mov ebx, eax

    mul 6

    add eax, ebx

    som skal være det samme som

    i *= 6;

     

    Eller tar jeg feil? lenge siden jeg drev med assembly nå.

     

    Men hva er dette i sammenheng med?

     

    Dette er ikke en MAC operasjon, men en kombinasjon av en addisjon og multiplikasjon. en MAC operasjon tar to faktorer som argument multipliserer disse, og legger så dette til en akkumulator i èn og samme instruksjon. Det er vanlig å bruke i digital signalbehandling.

  14. Jeg klarer ikke å ta sånne innbitte windows-motstandere seriøst. Nå skal jeg ikke si at det er det perfekte operativsystemet, men jeg har holdt mye på med både windows og linux privat og i jobb, og generelt er windows betydelig mer strømlinjeformet. Det eneste tilfellet hvor jeg vil foretrekke linux er hvis jeg skal programmere i C, C++ og python, siden dette er så godt integrert i systemet.

     

    Problemet med linux er at det alltid er ett eller annet som ikke fungerer. Det er kanskje småting, men etterhvert blir man lei av å hele tiden måtte slåss med systemet. Jeg bruker PCen først og fremst som et verktøy, og da er det mye viktigere at det virker og at man har god arbeidsflyt fremfor at APIene er elegant utformet.

     

    Jeg finner også at linux har betydelig tregere respons ved enkelte operasjoner, for eksempel navigasjon i filutforskere. Jeg kan være enig i at windows (spesielt vista) har overmåte høyre maskinkrav, men med en noenlunde oppegående PC går det som en drøm. Linux synes å ha det samme responsivitetsproblemet uansett hvor rask maskinen er.

     

    Linux er desentralisert, og utviklerne er ikke organisert på langt nær like godt som i windows. Resultatet blir at brukergrensesnittet blir mye mindre gjennomtenkt, og man bruker lengre tid på å gjøre de samme oppgavene. Når jeg en gang i blandt bruker linux på jobb av ulike grunner blir jeg som regel irritert over at ting er så knotete.

     

    Ikke meningen å starte noen krig her altså, men avogtil syns jeg det blir litt vel mye haleluja-stemning rundt linux.

  15. Du bruker ikke for-loopen riktig. Du kan gjerne initialisere variabelen før for-loopen, (selv om det vanligste er å initialisere den inni for-loopen) men da må du legge til en semikolon først, slik at kompilatoren skjønner at initialiseringsfeltet er tomt, slik:

    for(;i<11;)
    

     

    jeg ville uansett foretrukket å legge mer av koden inni deklarasjonen av for-loopen, slik som dette:

     

    
    int32 i;
    for (i=-10;i<11;i++)
     y1=a*i**2;
    

     

    På denne måten blir det litt mer oversiktlig.

×
×
  • Opprett ny...