AVR, DS1307 och LCD

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
toffie
Inlägg: 1888
Blev medlem: 22 juli 2004, 21:38:07
Ort: Töreboda / Stockholm
Kontakt:

AVR, DS1307 och LCD

Inlägg av toffie »

Hallå på er,

Sitter nu och försöker koda lite på min AVR, är rätt trött så missar väl hälften som vanligt.
Hur som, jag har en LCD inkopplad, en timerkrets DS1307 och allt körs på en Atmega32.

Att uppdatera displayen ett par miljoner gånger i sekunden är ju inte så snyggt, det ger ju en "rullande" effekt.
Så det ska vi inte ha.. Ok, så vi drar ner på uppdateringen, provar lite olika _delay_ms värden.

100ms ger en rätt ok uppdatering, dock så "hackar" själva raden med klockan därför att man måste tömma den
mellan varje uppdatering av klockan. Går detta att komma ifrån? Att raden inte hackar dvs.
Möjligen skulle man kunna uppdatera just den eller de siffror som behövs uppdateras. Eller blir det för krångligt? Kanske onödigt?

Vidare så får man ca. var åttonde sekund en delay, så istället för att det blir 13, 14, 15, 16 så blir det
13, 14, 14, 15. Klockan går dock rätt, det verkar som om uppdateringen sker 2 gånger per sekund, ungefärligen var åttonde sekund.

120ms+ ger en något bättre uppdatering, ju högre desto bättre förstås. Däremot så tappar vi istället siffror
med jämna mellanrum. På 120ms så tappar vi i genomsnitt var 9-10 uppdatering.
Så sekunderna på klockan blir; 11, 12, 13, 14, 15, 16, 17, 18, 20.
Det är ju inte så skoj, så en högre delay mellan uppdateringarna är ju inte direkt en lösning.

Väljer man sedan 1000ms som så fint är just en hel sekund, så tappar man siffror hejvilt. Verkligen inte skoj ;)


Sen undrar jag, den kod jag kör med nu läser tiden från DS1307's register varje 100ms, när den ska uppdatera displayen alltså.
Hur glad blir timerkretsen utav detta? Kretsen avläses via I2C, man skickar en sträng och får tillbaka värdena.

Min tanke här var att man kanske kunde läsa av kretsen en gång per minut och istället ha en "intern klocka" i min AVR
som agerar en uppdaterande klocka. Detta kanske blir en ganska krånglig lösning. Möjligen skulle man kunna skippa
sekundrarna och uppdatera från kretsen kanske var 10-20 sekund istället och bara visa timmar och minuter.
Men helst ska ju sekundrarna visas också, tror jag :roll:

Vad skulle ni valt i detta läge?

Video finns om det skulle vara intressant för just "hackandet".. Kanske är jag för petig, kanske inte.
Kod finns givetvis också om det skulle behövas, men jag är för trött för att avgöra om det behövs :)
Kan posta den om någon vill se.

Jag tror att jag inte glömt något nu, har läst igenom posten, jag lovar! :oops: 8)
bos
Inlägg: 2314
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: AVR, DS1307 och LCD

Inlägg av bos »

Sen undrar jag, den kod jag kör med nu läser tiden från DS1307's register varje 100ms, när den ska uppdatera displayen alltså. Hur glad blir timerkretsen utav detta? Kretsen avläses via I2C

Hur glad eller inte den blir bör framgå av databladet.

Sen förstår jag inte vad du menar med att du läser av registret varje 100ms. Har du något som triggar en avläsning en gång per sekund och sen läser av det varje 100ms, eller vadå? (Tips: Visa kod) En idé är kanske att ha en 32kHz-kristall som interruptar en gång i sekunden och först då läsa av RTC:n.
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: AVR, DS1307 och LCD

Inlägg av snigelen »

Ett alternativ är att använda klock-ut-pinnen (SQW/OUT) på 1307:an och koppla till en pinne på avr:en som genererar ett avbrott. En avbrottsrutin kan då sätta en flagga en gång per sekund så att displayen kan uppdateras då. Då slipper du problemet med att ha två olika klockor som inte är i synk.

Sen behöver du kanske inte tömma raden mellan uppdateringarna om du skickar ut hela raden varje gång.
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Re: AVR, DS1307 och LCD

Inlägg av thepirateboy »

Att använda delayer är normalt ingen bra idé. Sätt istället upp en timer som genererar avbrott varje 10ms eller så, sen kan du enkelt
utifrån den skapa events vid olika tidpunkter.

Sen håller jag med snigelen att du borde kunna skriva över den gamla texten på displayen så slipper du blinkningarna om
det är det som är problemet eller ännu bättre spar det gamla värdet och uppdatera bara om gamla värdet != nya värdet (värdet = klockan)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: AVR, DS1307 och LCD

Inlägg av sodjan »

> det verkar som om uppdateringen sker 2 gånger per sekund, ungefärligen var åttonde sekund.

Nej, det gör det inte. Den sker ca 1.12 gång per sekund, hela tiden.
Så då och då så kommer två uppdateringar att hamna inom samma sekund,
en precis i början av sekunden och en precis i slutet av samma sekund.
Det betyder *INTE* att det sker "2 uppdateringar per sekund" just då !

> 120ms+ ger en något bättre uppdatering... Däremot så tappar vi istället siffror
> med jämna mellanrum. På 120ms så tappar vi i genomsnitt var 9-10 uppdatering.

Självklart. Av exakt samma anledning. Du har ca 0.9 uppdateringar per sekund.
Då och då hamnar dina uppdateringar precis i slutet av en sekund så att 1.2 sekund
senare ligger precis i början av näst-nästa sekund. Fullständigt förväntat, eller hur ?
Och att det inte inträffar ca var 5 uppdateringe beror på att dina programvaru
delayer inte tar hänsyn till att resten av koden också tar tid att köra.

> Video finns om det skulle vara intressant för just "hackandet"..

Tror inte det, de effekter du beskrivar är ju självklara och naturliga.
Helt vanlig interferens mellan två osynkade klockor.

Lösningen är att helt skippa alla rutiner som heter "delay"-någonting helt.
Du har redan fått ett antal rimliga förslag. Klockkretsen har t.ex en interrupt
utgång.
Skriv svar