Cigarrövervakare
Hoppas den kommer till nytta! Som kompilator rekommenderar jag starkt CodeVison AVR, man slipper konfigurera den "manuellt" då det finns en inbyggd CodeWizard som sätter register och sånt rätt efter inställningarna man valt. Väldigt smidigt i början, men visst borde man lära sig att göra allt självt "någon dag".
*host host*, rutinerna fanns inbyggda. Om du laddar hem CodeVision så får du samma bibliotek som jag, och då borde det bara gå att köra. Det är dessutom gratis för icke-kommersiella syften med några begränsningar (t.ex. kan man inte använda interruptdriven USART-kommunikation och bara skriva halva minnet eller något sådant). Här hittar du CodeVision =)
*host host*, rutinerna fanns inbyggda. Om du laddar hem CodeVision så får du samma bibliotek som jag, och då borde det bara gå att köra. Det är dessutom gratis för icke-kommersiella syften med några begränsningar (t.ex. kan man inte använda interruptdriven USART-kommunikation och bara skriva halva minnet eller något sådant). Här hittar du CodeVision =)
Liten uppdatering..
Då har det varit föreningskväll på ETA igen, labbade lite med 4511-kretsarna och har nu fått 7-segmenten att fungera som dom ska. Dessvärre har jag bara testat de ett och ett, så det är inte någon färdig display än. Tyckte ändå det var värt en liten uppdatering eftersom alla delar nu fungerar oberoende av varandra, nu är det bara att klistra ihop allting till en helhet. Två bilder på labbdäcket (skrev ett litet program som går igenom siffrorna 0-9 om och om igen. Blev nästan förhäxad ):
Mörk bild
Ljus bild
Har även pillat en hel del med kretskortslayouten för displaykorten. Det var en hel del jobb för att få allt att gå på ett bra sätt, men jag tror att den nuvarande i princip är så bra jag kan få den. Bild på schema och kretskortslayout nedan. Jag tänker sätta 7-segmentsdisplayerna i lätt modifierad IC-sockellist så att man får plats med motstånden under segmenten. Blev smått omöjligt annars.
Kretskortslayout
Kopplingsschema
Sisådär, kommentarer eller förbättringar på displaykorten mottages varmt =) Får förhoppningsvis etsat/lött/testat ett displaykort inom en ganska snar framtid, men man vet aldrig med chalmers..
Mörk bild
Ljus bild
Har även pillat en hel del med kretskortslayouten för displaykorten. Det var en hel del jobb för att få allt att gå på ett bra sätt, men jag tror att den nuvarande i princip är så bra jag kan få den. Bild på schema och kretskortslayout nedan. Jag tänker sätta 7-segmentsdisplayerna i lätt modifierad IC-sockellist så att man får plats med motstånden under segmenten. Blev smått omöjligt annars.
Kretskortslayout
Kopplingsschema
Sisådär, kommentarer eller förbättringar på displaykorten mottages varmt =) Får förhoppningsvis etsat/lött/testat ett displaykort inom en ganska snar framtid, men man vet aldrig med chalmers..
Din krets fungerar bevisligen OK, men jag tänkte förklara en vanligare variant med exempelvis 3x7-segment.
Dessa har i allmänhet parallellkopplade segment A-G, så hur man styr dem kanske inte är direkt uppenbart. De har däremot individuella GA/GK.
Detta gör att du kan "slå på" ett 7-segment åt gången, och växlar du då mellan 7-segmenten tillräckligt fort(>50Hz) så hinner ögat inte uppfatta flimret. Vilken siffra som skall visas får din mikrokontroller ta fram.
Du klarar dig på så sätt med en enda 4511, om du ens måste ha en. Eftersom du ändå kör med en mikrokontroller som utan vidare orkar driva några led, så kan du sätta upp en vektor som styr segmenten - så slipper du 4511:an helt:
För att nu visa en nolla, så gör du helt enkelt:
UTPORT = siffra[0];
Givetvis förutsatt att du kopplar segmenten enligt ovanstående vektor.
Dessa har i allmänhet parallellkopplade segment A-G, så hur man styr dem kanske inte är direkt uppenbart. De har däremot individuella GA/GK.
Detta gör att du kan "slå på" ett 7-segment åt gången, och växlar du då mellan 7-segmenten tillräckligt fort(>50Hz) så hinner ögat inte uppfatta flimret. Vilken siffra som skall visas får din mikrokontroller ta fram.
Du klarar dig på så sätt med en enda 4511, om du ens måste ha en. Eftersom du ändå kör med en mikrokontroller som utan vidare orkar driva några led, så kan du sätta upp en vektor som styr segmenten - så slipper du 4511:an helt:
Kod: Markera allt
const char siffra[10] =
{
//edfcgabXX display segment table. X = display select
0b11110110,
0b00010010,
0b11001110,
0b01011110,
0b00111010,
0b01111100,
0b11111100,
0b00010110,
0b11111110,
0b01111110
};
UTPORT = siffra[0];
Givetvis förutsatt att du kopplar segmenten enligt ovanstående vektor.
Mjo jag funderade på att multiplexa först, men det kändes som en "fullösning". 4511:an har inbyggd latch så man slipper scanna igenom alla displayerna hela tiden, det räcker med att uppdatera de så fort som en siffra har ändrats. I just det här projektet är det ju skitsamma eftersom man inte har något vettigare att lägga processorkraften på, men det är ett medvetet val för att få det hela lite mer "på riktigt".
Uppdatering: 18 Oktober 2005
Precis som jag förutspådde tog det lång tid innan tid fanns till projektet igen. Är mitt uppe i en tentaperiod, och det är inte direkt lysande. Nästa period ser dock slappare ut, då blir det väl mer tid över! Hur som helst, jag har tillverkat en prototyp till displaykortet som jag ikväll har lekt med och testat.
Själva kortet är gjort efter PCB-layoten ovan med några småmodifikationer, lite smartare ledningsdragning och möjlighet till borrhål. Efter att ha etsat om en gång (dumma fingeravtryck) och lekt med lödpennan så fick jag fastlött allting, 7-segmentsdisplayerna sitter i någon form av hylslist för att motstånden skall få plats under. Nästa version kommer troligtvis att använda SMD-motstånd på baksidan istället. Så här blev iallafall kortet färdigt:
Undersidan av kortet
Översidan
Ett dött kort som inte visar någonting är förvisso roligt att se på i några minuter, men det är väl mest för att det är mitt eget projekt som ens det är roligt. Ikväll har jag som sagt kopplat in displaykortet direkt till min STK500 för att leka lite. För att få det pinkompatibelt så gick det åt lite kopplingstråd och en del huvudbry, men det funkade konstigt nog på första försöket. Skrev lite snabbkod för att testa, loopar siffror från 0->999 nu bara. Siffrorna betedde sig dock lite underligt tills jag kom på att några 1meg-motstånd mellan load-enable och jord gjorde susen.
Kärlek...
Försök att få denna betrakningsvinkeln med en LCD!
Min kod för att lägga ut en siffra är dock lite ful, ska klura lite pår hur C hanterar integers. Så fort jag skriver / nu så verkar den skapa ett flyttal, vilket jag inte vill. Dumma smarta kompilatorer. För att separera tiotalssiffran vill jag kunna skriva PORTD = Siffra/10 100*(Siffra/100) + 0b10100000, men den byter ut 100*(Siffra/100) mot Siffra direkt vilket jag inte tycker att den borde göra. Någon som har ett tips?
Själva kortet är gjort efter PCB-layoten ovan med några småmodifikationer, lite smartare ledningsdragning och möjlighet till borrhål. Efter att ha etsat om en gång (dumma fingeravtryck) och lekt med lödpennan så fick jag fastlött allting, 7-segmentsdisplayerna sitter i någon form av hylslist för att motstånden skall få plats under. Nästa version kommer troligtvis att använda SMD-motstånd på baksidan istället. Så här blev iallafall kortet färdigt:
Undersidan av kortet
Översidan
Ett dött kort som inte visar någonting är förvisso roligt att se på i några minuter, men det är väl mest för att det är mitt eget projekt som ens det är roligt. Ikväll har jag som sagt kopplat in displaykortet direkt till min STK500 för att leka lite. För att få det pinkompatibelt så gick det åt lite kopplingstråd och en del huvudbry, men det funkade konstigt nog på första försöket. Skrev lite snabbkod för att testa, loopar siffror från 0->999 nu bara. Siffrorna betedde sig dock lite underligt tills jag kom på att några 1meg-motstånd mellan load-enable och jord gjorde susen.
Kärlek...
Försök att få denna betrakningsvinkeln med en LCD!
Min kod för att lägga ut en siffra är dock lite ful, ska klura lite pår hur C hanterar integers. Så fort jag skriver / nu så verkar den skapa ett flyttal, vilket jag inte vill. Dumma smarta kompilatorer. För att separera tiotalssiffran vill jag kunna skriva PORTD = Siffra/10 100*(Siffra/100) + 0b10100000, men den byter ut 100*(Siffra/100) mot Siffra direkt vilket jag inte tycker att den borde göra. Någon som har ett tips?
Coolt!
Har en fundering dock... fattar inte riktigt hur du styr 7-segementsdisplayerna
Kollade upp 4511:orna också och förstår lite mer men vill ändå ha en förklaring
Fattade Henry´s sätt... (tror jag) men på hans sätt går det väl åt en port (7pinnar iaf) för varje dipslay? Eller tänker jag tokigt?
Fastän koden ser "illa" ut tror jag det hade varit både givande och kul!
//rickeboy
Har en fundering dock... fattar inte riktigt hur du styr 7-segementsdisplayerna
Kollade upp 4511:orna också och förstår lite mer men vill ändå ha en förklaring
Fattade Henry´s sätt... (tror jag) men på hans sätt går det väl åt en port (7pinnar iaf) för varje dipslay? Eller tänker jag tokigt?
Fastän koden ser "illa" ut tror jag det hade varit både givande och kul!
//rickeboy
Tackar tackar Jag gillar verkligen 7-segmentsdisplayer. De känns rediga på något sätt.
Henrys sätt kräver 7 pinnar per display ja, och dessutom så måste mikroprocessorn alltid loopa igenom displayerna. Gillar inte riktigt multiplexning, känns som ett litet fulmeck på något sätt.
Jag kan lägga upp koden när jag fräschat till den lite grand, kanske till nästa uppdatering, men som det är nu är den både ointressant och icke-fungerande eftersom jag försökt förbättra den
I princip går det iallafall till såhär:
Det är alltså kopplat så att alla 4511:or får samma siffra på sig hela tiden, men sedan väljer jag vilken av de som ska spara värdet genom att sätta Load Enable på den. Blir det klarare, eller är jag en jättedålig pedagog?
Ställ gärna fler frågor om något är oklart!
Henrys sätt kräver 7 pinnar per display ja, och dessutom så måste mikroprocessorn alltid loopa igenom displayerna. Gillar inte riktigt multiplexning, känns som ett litet fulmeck på något sätt.
Jag kan lägga upp koden när jag fräschat till den lite grand, kanske till nästa uppdatering, men som det är nu är den både ointressant och icke-fungerande eftersom jag försökt förbättra den
I princip går det iallafall till såhär:
Kod: Markera allt
void UppdateraDisplay(int Siffra)[
PORTD = Siffra/100 + 0b01100000; <-- där tar jag ut hundratalssiffran genom att dela med 100, och sedan lägger jag pinne 7 låg för att aktivera den displayen. Displayerna sitter alltså på pinne 5, 6 och 7.
wait_ms(1); <-- här väntar jag på att 4511:an ska hinna läsa in värdet. Går säkert med kortare tid också, ska labba mer med det senare.
PORTD = Siffra/100 + 0b11100000; <-- Stänger av Load Enable på samtliga displayer, men låter samma siffra ligga på. Detta för att undvika att ett felaktigt värde slås in precis i slutet.
wait_ms(1);
PORTD = Siffra/10 + 100*(Siffra/100) + 0b10100000 <-- Det där fungerar alltså inte, men tanken är att dela med 10 för att få tiotalssiffran och sedan ta bort hundratalssiffran. Sedan är koden likadan.
]
Ställ gärna fler frågor om något är oklart!
Tack!
Av att dömma av kopplingschemat och databladet för 4511 va det så jag trodde... gött!
7-segmentsdisplayer är riktigt trevliga... Om man vill ha lite OldSchool känsla och om det bara är mätvärden som ska vissas så är LCD nästan lite överflödigt... har några 7-segments liggandes (har haft det ngt år) aldrig kommit till skott dock... har beställt några 4511:or... får väl se när de dyker upp och om man är hemma ngn helg i närheten då de kommer
//rickeboy
Av att dömma av kopplingschemat och databladet för 4511 va det så jag trodde... gött!
7-segmentsdisplayer är riktigt trevliga... Om man vill ha lite OldSchool känsla och om det bara är mätvärden som ska vissas så är LCD nästan lite överflödigt... har några 7-segments liggandes (har haft det ngt år) aldrig kommit till skott dock... har beställt några 4511:or... får väl se när de dyker upp och om man är hemma ngn helg i närheten då de kommer
//rickeboy