Sida 2 av 2
Postat: 13 mars 2007, 16:31:11
av sodjan
> så den klara alltså av 8bytes=64bitars tal?
Ja, men du får skiva kod för att hantera det...
Postat: 13 mars 2007, 16:53:41
av SAD
hur då menar du å dela upp talet och lägga det i registerposterna efter varandra? isf håller jag mig till 8-bitars tal, det är ingen alarmklocka jag bygger den kan dra sig lite...
Postat: 13 mars 2007, 17:08:26
av sodjan
> hur då menar du å dela upp talet och lägga det i registerposterna efter varandra?
Japp. Eller i princip var som helst, de måste inte ligga direkt efter varandra.
Bara din kod vet vad som är vad, men det är ju bara symboler hur som helst...
När det gäller just AVR så har jag för mig att man kan "kombinera" ihop
två 8-bitars register till ett 16-bitars register och köra vissa instruktioner
direkt mot det. Kan vara vissa modeller, är lite osäker där...
> isf håller jag mig till 8-bitars tal,
Ja men räcker det med det, så visst...
Postat: 13 mars 2007, 17:33:06
av SAD
det handlar väl om att jag tappar i precion om jag anv. 8 bitars tal, men som sagt det behöver inte gå jätte exakt..
men fortfarande jag får den inte prescalern att göra som jag vill jag kollade igenom databladet men hittar bara vad precsalern är och vilka som finns inte vilka positioner de ligger på...
sen vad betyder |=?
ursäkta alla nybörjarfrågor...
Postat: 13 mars 2007, 17:52:21
av thepirateboy
Eventuellt kan denna filmsnutt hjälpa dig:
http://www.tfe.umu.se/courses/uwasa/BTH/timers.html
|= är logiskt eller, mycket användbar instruktion i C. Används när man vill ettställa vissa bitar i en byte utan att påverka de andra.
TCCR
Postat: 13 mars 2007, 19:07:31
av Millox
Såå, nu är jag hemma igen, maten lagad och uppäten så nu ska jag försöka svara lite.
timer1 är lättare att använda. Den är 16 bitar lång, så du behöver inte bry dig om den biten. Du sätter prescalern i TCCR1A/B-registren (kod nedan) kolla tabell på sid 97 nått. Det kan vara bra att läsa genom hela det kapitlet om räknarna, och timer1 i synnerhet.
Iaf, såhär:
TCCR1B = 0x0B; // avrlibc: (_BV(CS10) | _BV(CS11) | _BV(WGM12));
OCR1A = 62500;
TIMSK |= 1<<4; // avrlibc: _BV(OCIE1A);
och så kör du bara med interruptet, i avrlibc:
SIGNAL(SIG_OUTPUT_COMPARE2) {
...
}
Tror att det här borde funka... Jag har inte testat det, och jag vet inte om avrlibc-syntaxen funkar för dig.
Postat: 13 mars 2007, 20:19:28
av syltkaka
Inte logiskt eller. '|' är en operator som gör
bitvis eller med två operander. '|=' är en tilldelningsoperator som samtidigt utför bitvis eller med operanderna. Se nedan.
Följande satser utför samma sak.
Kod: Markera allt
DDRB |= 0b00000011;
DDRB |= 0x03;
DDRB = DDRB | 0x03;
EDIT: Formulering
Postat: 14 mars 2007, 15:03:56
av SAD
hittade en appnote om just detta på atmel's hemsida, skall kolla på den i slutet av veckan, har en tenta imorgon jag måste ge det sista jag har nu, men uppdatering kommer om det är mer problem ni är underbar killar

Postat: 16 mars 2007, 17:09:53
av SAD
nu "funkar" timern
problemet är dock att den verkar räkna på tok för långsamt, alltså jag har ju 2st tal (16bitarsräknare) TCNT1H och TCNT1L, när både dessa går till 0xFF så går den in i ISR:en, precis som den skall. Min fråga är nu, varför räknare den så långsamt? kan jag ställa in detta? alltså hur lång en cykel skall vara, jag kan inte se någon märkbar förändring om jag ändrar på prescalern.
fråga 2 finns det något enkelt sätt för mig att säga till räknaren att gå åt andra hållet så att säga?
förslag?
Postat: 17 mars 2007, 13:30:24
av $tiff
Vaddå ingen märkbar skillnad om du ändrar prescalern? Då måste det gått fel någonstans... Prescalern ska göra skillnad i allra högsta grad!
Om du vill slå om kontinuerligt "innan" 0xFFFF så ska du använda CTC (clear timer on compare match). Det står hur man ställer in timern till att arbeta på detta viset i databladet.
Postat: 17 mars 2007, 19:26:05
av SAD
nä det skall var så ISR:en aktiveras ju på overflow flagan, så det är rätt, jag försöker ställa in prescalern med bitarna i TCCR1B, CS0-2, enligt en appnote så är det prescalern, och det finns 8 lägen, 1024,512,256,128,64,32,16,8 där 8 är std...dock så under (i I/O-view:n) CPU=>SFIOR finns en PSR10, som oxå är prescaler för timer0/1, jag kanske måste sätta den till en 1:a på något vis för att prescalern skall kicka i?
Postat: 18 mars 2007, 09:52:11
av oJsan
Hur gör du för att sätta bitarna CS0-2 då, är det korrekt utfört?
Korrekt metod för att sätta en av dom:
TCCR1B |= (1<<CSx);
För att sätta flera:
TCCR1B |= (1<<CS0) | (1<<CS1) | (1<<CS2);
Posta all din kod så går det säkert att se vad som är fel.
Postat: 18 mars 2007, 11:53:34
av SAD
Jag tror jag löste det igår natt, alltså jag tänkte en sekund här och nu när jag satt och debuggade i AVR studio, men om jag kollar på stopwatchen så är det rätt, allt, den går 1 sekund innan den går in i ISR:en,(vilket inte var tanken från början men ändrade mig

). den drar sig då oxå 0,5us/minut vilket är ingenting
så om det nu är så att jag kan göra så och kolla på stoppwatchen i AVR-studio så stämmer allt och jag får tacka alla för all hjälp

, om inte postar jag koden ikväll då jag sitter i falkenberg f.n. och har inget internet emot laptopen...
Postat: 11 april 2007, 16:49:15
av tx
Kod: Markera allt
ISR(TIFR_OVF_vect)
{
// cykel med 256 i prescaler=>1sekund@61 overflow's
cykel++;
//ticks skall ställas in via prescalern så att det har gått 1sekund vid
if (cykel >= 60)
{
minutes++;
cykel = cykel - 60;
}
}
Så skulle jag skriva det
edit: ops gammal tråd