7-Segment till AVR (Nybörjare)

Lysdioder, Optiska sensorer, Fiberoptik, Displayer, Lasrar, Optiska kopplare
Eddie
Inlägg: 47
Blev medlem: 20 oktober 2005, 16:07:53

7-Segment till AVR (Nybörjare)

Inlägg av Eddie »

Har kommit så långt att jag lyckats lära mig Assembler till den gräns att jag lyckats med en AD-omvandling från en Temp-sensor (LM35) och har fått ut värdet (två siffror) representerat på PD0-PD7 (Atmega8).

Nu vill jag helt sonika ha ut värdet på en 2*7-segment display.
Här tar all min kunskap slut och hoppas att ni kan läxa upp mig.

Säg att jag har värdet 55 så får jag ut binärt på PORTD:

PD0 - 0
PD1 - 0
PD2 - 1
PD3 - 1
PD4 - 0
PD5 - 1
PD6 - 1
PD7 - 1

Vad använder jag för komponenter? Enklast med Common Cathode/Anode eller BCD?

Hur gör jag :?: Ska jag lägga ner och köpa en fiskebåt istället?

Snälla Hjälp!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Hur blir det där 55 ?
Och är 55 i hex, dec, eller vad ?
Hur vet du ett det är värdet 55 som visas på PORTD ?
Användarvisningsbild
MicaelKarlsson
Inlägg: 4669
Blev medlem: 18 juni 2004, 09:16:07
Ort: Aneby
Kontakt:

Inlägg av MicaelKarlsson »

En par sådana här kanske: Hit Me!!

Om du har gott om I/O-pinnar kan du ju köra direkt om din AVR-klarar av att driva dem, annars kan du ju använda en BCD till 7-segment eller med transistorer.
Eddie
Inlägg: 47
Blev medlem: 20 oktober 2005, 16:07:53

Inlägg av Eddie »

Ursäkta, lite trött och sliten och tog bara ett exempel och råkade vända på det.
Kopplade upp PD0-PD7 mot LEDs och testade, temperaturen i rummet är 21,3 grader och jag får följande status:

PD0 - 1
PD1 - 0
PD2 - 1
PD3 - 0
PD4 - 1
PD5 - 0
PD6 - 0
PD7 - 0

Går jag in i AvrStudio och sätter bitarna manuellt så ser jag ju direkt att det motsvarar det decimala talet 21, så det stämmer ju ganska bra.

Ni får ha tålamod med mig, kodandet faller sig ganska naturligt men när det gäller hårdvara är jag ganska efterbliven.
Hur går jag vidare härifrån? Finns det någon binär-->BCD dekoder?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK.
Du har alltså en temp i *binärt* format.

Först behöver du göra en binär -> BCD omvandling.
Det är en väldigt vanlig operation och du bör kunna
googla fram något ganska snabbt.

Sen ska varje halv-byte ut på en 7-seg display.
Det är två problem. Först hur du skall ansluta dom, och
det kan man göra på flera olika sätt. Sedan hur du fixar ditt binära
värde till 7-seg-kod, sannolikt någon slags tabell-uppslagning (eller
genom att använda en 7-seg driver, men då blir det extra hårdvara...)
Har du gott om pinnar på din processor, så är väll programvaru-
modellen snyggare...
Eddie
Inlägg: 47
Blev medlem: 20 oktober 2005, 16:07:53

Inlägg av Eddie »

Ok. Hittade ganska snabbt på avr-asm-tutorial. Den koden får fem stjärnor.
Så nu har jag första siffran i R3 och andra siffran i R4.
Nu måste jag alltså vidare och omvandla till 7-seg-kod?
Känns som jag kommit en bit iaf :wink:

Edit: Det var inget :D Fanns ju 7 segment som tar BCD direkt!
Man får tacka ödmjukast för hjälpen!
Samot
Inlägg: 311
Blev medlem: 15 november 2004, 18:32:13

Inlägg av Samot »

Vet inte om det är opimalt men du kan ju skriva tio subruiner som var och en sätter rätt bitar så du kan presentera rätt siffra på din display. Sedan gör du helt enket en jämförelse. Om ditt värde är mellan 0-255 så blir det

Om värde 0-25 rcall noll
om värde 26-50 rcall ett
osv osv!
frejo
Inlägg: 496
Blev medlem: 21 april 2004, 21:43:01
Ort: Linköping

Inlägg av frejo »

Nu kan jag inte riktigt avr-asm men ska förklarar så gott jag kan.

Ett smidigt sätt att lösa det på är att skriva en subrutin som ökar programpekaren med lika många steg som siffran du vill skriva ut och direkt efter den lägger du in alla kommandon för att skriva ut 0-9 efter varandra.
så här:

Kod: Markera allt

öka programpekaren med x+1
kod för att skriva en nolla
kod för att skriva en etta
kod för att skriva en tvåa
kod för att skriva en trea
osv...
dvs du laddar ett register med värdet du vill ha ut, sen kallar du på sin subrutin, innehåller registret värdet 2 kommer programpekaren ökas med 2 och på den raden står koden för att sätta rätt pinnar på porten för att visa siffran.
Du kan behöva öka programpekaren med 2*värdet också för att få dit en return instruktion efter att pinnarna satts till rätt värden:

Kod: Markera allt

öka programpekaren med 2*x+1
kod för att skriva en nolla
return
kod för att skriva en etta
return
kod för att skriva en tvåa
osv...
multiplikation med två görs enklast genom att bitskifta 1 gång åt vänster...
Användarvisningsbild
Tron
Inlägg: 16
Blev medlem: 12 februari 2006, 10:02:08
Ort: Tullinge

Inlägg av Tron »

Att tänka på med 7 seg är att dom behöver konstant uppdatering. så en bra grej att göra kan vara att ha en interrupt timer som går till en uppdaterings rutin varje gång den går ut. då kan man också styra uppdaterings intervallen på ett enkelt sätt..
frejo
Inlägg: 496
Blev medlem: 21 april 2004, 21:43:01
Ort: Linköping

Inlägg av frejo »

va?
aldrig hört om att en 7-segment kräver uppdatering, det är ju bara 7 st lysdioder, har du väl satt vissa pinnar till ettor på utgången kommer de segmenten att lysa tills utgången ändras nästa gång.
Användarvisningsbild
Tron
Inlägg: 16
Blev medlem: 12 februari 2006, 10:02:08
Ort: Tullinge

Inlägg av Tron »

självklart. men om du har ett rörligt värde? temp, djup, tryck ex. då måste du ju ha en uppdatering som måste ställas så den uppdaterar i en lagom hastighet samtidigt som latchningen inte blir för låg eller hög, då ljusintensiteten påverkas.
Skriv svar