7-Segment till AVR (Nybörjare)
7-Segment till AVR (Nybörjare)
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!
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!
- MicaelKarlsson
- Inlägg: 4669
- Blev medlem: 18 juni 2004, 09:16:07
- Ort: Aneby
- Kontakt:
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?
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?
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...
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...
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
Edit: Det var inget
Fanns ju 7 segment som tar BCD direkt!
Man får tacka ödmjukast för hjälpen!
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

Edit: Det var inget

Man får tacka ödmjukast för hjälpen!
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:
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:
multiplikation med två görs enklast genom att bitskifta 1 gång åt vänster...
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...
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...